2010-08-31 11 views
5

¿Cómo escalo una página en pdf, mientras mantengo la rotación en itextsharp? Tengo el siguiente, pero perder la rotación:¿Cómo escalo una página PDF mientras mantengo la orientación con 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(); 
    } 

Respuesta

14

que tenía un problema similar, y tengo trabajo al cambiar la altura y la anchura de cada página, de una letra a girar. En otras palabras, si la página actual es delgada y alta, entonces es vertical. Pero si es ancho y corto, entonces es horizontal y debería rotar la página.

Aquí es el código cambiado:

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

también que necesitaba para mantener las proporciones, así que terminé con esto:

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

Utilizando esta solución ha funcionado muy bien para mí, excepto si el PDF tiene una firma electrónica, en cuyo caso la firma electrónica no entra en la página redimensionada. ¿Alguna idea de cómo cambiar el tamaño, incluida la firma electrónica? –

Cuestiones relacionadas