2010-08-31 84 views
5

如何在保持itextsharp中的旋转的同时缩放PDF页面? 我有以下的,但我失去了旋转:如何在保持iTextSharp方向的同时缩放PDF页面?

public static void ScaleToLetter(string inPDF, string outPDF) 
    { 
     PdfReader reader = new PdfReader(inPDF); 
     Document doc = new Document(PageSize.LETTER); 
     Document.Compress = true; 
     PdfWriter writer = PdfWriter.GetInstance(doc, 
      new FileStream(outPDF, FileMode.Create)); 
     doc.Open(); 
     PdfContentByte cb = writer.DirectContent; 
     int rotation; 

     PdfImportedPage page; 
     for (int pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++) 
     { 
      page = writer.GetImportedPage(reader, pageNumber); 
      rotation = reader.GetPageRotation(pageNumber); 

      cb.AddTemplate(page, 
       PageSize.LETTER.Width/reader.GetPageSize(pageNumber).Width, 
       0, 0, 
       PageSize.LETTER.Height/reader.GetPageSize(pageNumber).Height, 
       0, 0); 
      doc.NewPage(); 
     } 
     doc.Close(); 
    } 

回答

14

我也有类似的问题,并得到了它通过改变每个页面的高度和宽度,从信LETTER旋转的工作。换句话说,如果当前页面很薄很高,那么它就是垂直的。但是,如果它是宽和短,那么它是水平的,我应该旋转页面。

这是你的代码改变:

public static void ScaleToLetter(string inPDF, string outPDF) 
    { 
     PdfReader reader = new PdfReader(inPDF); 
     Document doc = new Document(PageSize.LETTER); 
     Document.Compress = true; 
     PdfWriter writer = PdfWriter.GetInstance(doc, 
      new FileStream(outPDF, FileMode.Create)); 
     doc.Open(); 
     PdfContentByte cb = writer.DirectContent; 

     PdfImportedPage page; 
     for (int 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) 
    { 
     var reader = new PdfReader(new MemoryStream(File.ReadAllBytes(inPDF))); 
     var document = new Document(PageSize.A4); 
     var ms = new MemoryStream(); 
     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()); 
    } 
+0

使用该解决方案的工作对我非常好,除了当PDF具有电子签名,在这种情况下电子签名不会进入调整大小的页面。任何想法如何调整,包括电子签名? – 2018-01-19 19:12:52