2010-08-31 22 views
5

Làm cách nào để chia tỷ lệ trang pdf, trong khi duy trì xoay vòng trong itextsharp? Tôi có những điều sau đây, nhưng tôi đã làm mất xoay:Làm cách nào để chia tỷ lệ trang PDF trong khi vẫn duy trì định hướng với iTextSharp?

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(); 
    } 

Trả lời

14

Tôi đã có một vấn đề tương tự, và đã nhận nó làm việc bằng cách thay đổi chiều cao và chiều rộng của mỗi trang, từ chữ cái sang chữ xoay. Nói cách khác, nếu trang hiện tại là mỏng và cao thì nó là dọc. Nhưng nếu nó rộng và ngắn, thì nó nằm ngang và tôi nên xoay trang.

Dưới đây là mã của bạn thay đổi:

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(); 
    } 

Tôi cũng cần thiết để hạn chế tỷ lệ, vì vậy tôi đã kết thúc với điều này:

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

Sử dụng giải pháp này đã làm việc rất tốt cho tôi, ngoại trừ nếu PDF có chữ ký điện tử, trong đó hoàn cảnh chữ ký điện tử không biến thành trang được đổi kích thước. Bất kỳ ý tưởng làm thế nào để thay đổi kích cỡ bao gồm chữ ký điện tử? –

Các vấn đề liên quan