У меня была похожая проблема, и я получил ее, изменив высоту и ширину каждой страницы с поворота буквы на букву. Другими словами, если текущая страница тонкая и высокая, то она вертикальная. Но если он широкий и короткий, то он горизонтальный, и мне нужно повернуть страницу.
Вот ваш код изменился:
public static void ScaleToLetter(string inPDF, string outPDF)
{
using (var reader = new PdfReader(inPDF))
using (var doc = new Document(PageSize.LETTER))
{
Document.Compress = true;
using (
var writer = PdfWriter.GetInstance(doc,
new FileStream(outPDF, FileMode.Create)))
{
doc.Open();
var cb = writer.DirectContent;
PdfImportedPage page;
for (var pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++)
{
page = writer.GetImportedPage(reader, pageNumber);
if (page.Width <= page.Height)
doc.SetPageSize(PageSize.LETTER);
else
doc.SetPageSize(PageSize.LETTER.Rotate());
doc.NewPage();
cb.AddTemplate(page,
doc.PageSize.Width / reader.GetPageSize(pageNumber).Width,
0, 0,
doc.PageSize.Height / reader.GetPageSize(pageNumber).Height,
0, 0);
}
doc.Close();
}
}
}
Мне также нужно было ограничить пропорции, поэтому я получил следующее:
public static void ScaleToA4(string inPDF, string outPDF)
{
using (var reader = new PdfReader(new MemoryStream(File.ReadAllBytes(inPDF))))
using (var document = new Document(PageSize.A4))
using (var ms = new MemoryStream())
using (var writer = PdfWriter.GetInstance(document, ms))
{
document.Open();
var cb = writer.DirectContent;
for (var pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++)
{
var page = writer.GetImportedPage(reader, pageNumber);
document.SetPageSize(page.Width <= page.Height ?
PageSize.A4 : PageSize.A4.Rotate());
document.NewPage();
var widthFactor = document.PageSize.Width / page.Width;
var heightFactor = document.PageSize.Height / page.Height;
var factor = Math.Min(widthFactor, heightFactor);
var offsetX = (document.PageSize.Width - (page.Width * factor)) / 2;
var offsetY = (document.PageSize.Height - (page.Height * factor)) / 2;
cb.AddTemplate(page, factor, 0, 0, factor, offsetX, offsetY);
}
document.Close();
File.WriteAllBytes(outPDF, ms.GetBuffer());
}
}