2010-08-31 1 views
5

Come si ridimensiona una pagina PDF mantenendo la rotazione in itextsharp? Ho la seguente, ma ho perso rotazione:Come si ridimensiona una pagina PDF mantenendo l'orientamento 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(); 
    } 

risposta

14

ho avuto un problema simile, e ottenuto lavorando modificando l'altezza e la larghezza di ogni pagina, da una lettera all'altra ruotato. In altre parole, se la pagina corrente è sottile e alta, allora è verticale. Ma se è largo e corto, allora è orizzontale e dovrei ruotare la pagina.

Ecco il codice modificato:

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

Ho anche bisogno di vincolare le proporzioni, quindi ho finito con questo:

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

Utilizzando questa soluzione ha funzionato molto bene per me, tranne che per se il Il PDF ha una firma elettronica, in cui la firma elettronica non viene inserita nella pagina ridimensionata. Qualche idea su come ridimensionare includendo la firma elettronica? –