2010-08-26 19 views
9

Sto usando la funzione qui sotto per dividere il pdf in due.Rotazione PDF in C# usando iTextSharp

Sebbene stia dividendo il pdf, il contenuto appare sottosopra. Come faccio a ruotarlo di 180 gradi.

Per favore aiuto. di seguito è il codice per lo stesso

private static void ExtractPages(string inputFile, string outputFile, 
    int start, int end) 
    { 
     // get input document 
     PdfReader inputPdf = new PdfReader(inputFile); 

     // retrieve the total number of pages 
     int pageCount = inputPdf.NumberOfPages; 

     if (end < start || end > pageCount) 
     { 
      end = pageCount; 
     } 

     // load the input document 
     Document inputDoc = 
      new Document(inputPdf.GetPageSizeWithRotation(1)); 

     // create the filestream 
     using (FileStream fs = new FileStream(outputFile, FileMode.Create)) 
     { 
      // create the output writer 
      PdfWriter outputWriter = PdfWriter.GetInstance(inputDoc, fs); 
      inputDoc.Open(); 

      PdfContentByte cb1 = outputWriter.DirectContent; 

      // copy pages from input to output document 
      for (int i = start; i <= end; i++) 
      { 
       inputDoc.SetPageSize(inputPdf.GetPageSizeWithRotation(1)); 
       inputDoc.NewPage(); 

       PdfImportedPage page = 
        outputWriter.GetImportedPage(inputPdf, i); 
       int rotation = inputPdf.GetPageRotation(i); 


       if (rotation == 90 || rotation == 270) 
       { 
        cb1.AddTemplate(page, 0, -1f, 1f, 0, 0, 
         inputPdf.GetPageSizeWithRotation(i).Height); 

       } 
       else 
       { 
        cb1.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 
       } 

      } 

      inputDoc.Close(); 
     } 
    } 

risposta

2

Ho provato il codice e ha funzionato bene per me; le pagine divise hanno mantenuto il loro orientamento originale.

Una soluzione alternativa potrebbe essere quella di ruotare esplicitamente le pagine di 180 gradi.

Sostituire:

cb1.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 

Con:

cb1.AddTemplate(page, -1f, 0, 0, -1f, 
       inputPdf.GetPageSizeWithRotation(i).Width, 
       inputPdf.GetPageSizeWithRotation(i).Height); 

Se la chiamata a inputPdf.GetPageRotation(i) rendimenti 180 quindi è in grado di gestire questo nella dichiarazione if che segue (usando il mio codice suggerito per la rotazione == 180).

6

Si dovrebbe provare questo. Ha funzionato per me:

   if (rotation == 90 || rotation == 270) 
       { 

        if (rotation == 90) 
        { 
         cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pagenumber).Height); 
        } 
        if (rotation == 270) 
        { 
         cb.AddTemplate(page, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(pagenumber).Width, 0); 

        } 

       } 
       else 
       { 
        cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 
       } 
17

Ho trovato che le risposte precedenti non ruotano correttamente per tutte e 4 le rotazioni principali.

Di seguito è riportato il mio codice per gestire correttamente 0, 90, 180 e 270. Questo è stato testato con un PDF ruotato in ciascuna di queste direzioni.

var pageRotation = reader.GetPageRotation(currentPageIndex); 
var pageWidth = reader.GetPageSizeWithRotation(currentPageIndex).Width; 
var pageHeight = reader.GetPageSizeWithRotation(currentPageIndex).Height; 
switch (pageRotation) 
{ 
    case 0: 
     writer.DirectContent.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0); 
     break; 

    case 90: 
     writer.DirectContent.AddTemplate(importedPage, 0, -1f, 1f, 0, 0, pageHeight); 
     break; 

    case 180: 
     writer.DirectContent.AddTemplate(importedPage, -1f, 0, 0, -1f, pageWidth, pageHeight); 
     break; 

    case 270: 
     writer.DirectContent.AddTemplate(importedPage, 0, 1f, -1f, 0, pageWidth, 0); 
     break; 

    default: 
     throw new InvalidOperationException(string.Format("Unexpected page rotation: [{0}].", pageRotation)); 
} 
+2

Posso scala utilizzando iText con stesso codice –

+2

+1: A quanto pare 'caso 0:' può essere abbreviato a 'writer.DirectContent.AddTemplate (importedPage, 0, 0);' La tua risposta è appena aiutato a risolvere un problema di ruotare un PDF esistente di altri 90, 180 o 270 gradi :) Sarebbe grandioso se quei parametri fossero documentati da qualche parte, poiché capisco che sono una trasformata matrix (?). Grazie molto. –

+0

C'è un ulteriore problema con la rotazione delle pagine già ruotate. Ho usato la tua risposta e ne ho aggiunta una con le ulteriori manipolazioni della dimensione/rotazione della pagina per consentire la rotazione delle pagine già ruotate. –

0

Un piccolo cambiamento nel precedente codice vecchio codice

case 270: 
    writer.DirectContent.AddTemplate(importedPage, 0, 1f, -1f, 0, pageWidth, 0); 

nuovo codice

case 270: 
    writer.DirectContent.AddTemplate(importedPage, 0, 1f, -1f, 0, pageHeight, 0); 

Questo risolverà il problema con rotazione di 270 gradi

+0

sopra il codice è perfettamente a posto con iTextSharp v 5.5. – Matthieu

2

@TimS 'risposta è stata molto vicino alla perfezione e fornito i parametri corretti a AddTemplate, ma avevo bisogno di fare alcune aggiunte per consentire 90, 180, 270 rotazione di un PDF in cui le pagine già rotazione 0, 90, 180 o 270: è passato

Assumendo un parametro di RotateFlipType rotateFlipType alla funzione per specificare la rotazione (il pratico enum dalla chiamata GDI + RotateFlip):

iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent; 
iTextSharp.text.pdf.PdfImportedPage page; 
int rotation; 
int i = 0; 
while (i < pageCount) 
{ 
    i++; 
    var pageSize = reader.GetPageSizeWithRotation(i); 

    // Pull in the page from the reader 
    page = writer.GetImportedPage(reader, i); 

    // Get current page rotation in degrees 
    rotation = pageSize.Rotation; 

    // Default to the current page size 
    iTextSharp.text.Rectangle newPageSize = null; 

    // Apply our additional requested rotation (switch height and width as required) 
    switch (rotateFlipType) 
    { 
     case RotateFlipType.RotateNoneFlipNone: 
      newPageSize = new iTextSharp.text.Rectangle(pageSize); 
      break; 
     case RotateFlipType.Rotate90FlipNone: 
      rotation += 90; 
      newPageSize = new iTextSharp.text.Rectangle(pageSize.Height, pageSize.Width, rotation); 
      break; 
     case RotateFlipType.Rotate180FlipNone: 
      rotation += 180; 
      newPageSize = new iTextSharp.text.Rectangle(pageSize.Width, pageSize.Height, rotation); 
      break; 
     case RotateFlipType.Rotate270FlipNone: 
      rotation += 270; 
      newPageSize = new iTextSharp.text.Rectangle(pageSize.Height, pageSize.Width, rotation); 
      break; 
    } 

    // Cap rotation into the 0-359 range for subsequent check 
    rotation %= 360; 

    document.SetPageSize(newPageSize); 
    document.NewPage(); 

    // based on the rotation write out the page dimensions 
    switch (rotation) 
    { 
     case 0: 
      cb.AddTemplate(page, 0, 0); 
      break; 
     case 90: 
      cb.AddTemplate(page, 0, -1f, 1f, 0, 0, newPageSize.Height); 
      break; 
     case 180: 
      cb.AddTemplate(page, -1f, 0, 0, -1f, newPageSize.Width, newPageSize.Height); 
      break; 
     case 270: 
      cb.AddTemplate(page, 0, 1f, -1f, 0, newPageSize.Width, 0); 
      break; 
     default: 
      throw new System.Exception(string.Format("Unexpected rotation of {0} degrees", rotation)); 
      break; 
    } 
} 

Speriamo che questo vi aiuterà a qualcun altro che desidera correggere la rotazione dei file PDF in arrivo. Mi ci sono voluti 2 giorni per perfezionarlo.

+1

Il tuo codice funziona come un fascino. Grazie mille. Mi hai salvato la giornata. – RolandDeschain

+0

@RolandDeschain: Sono contento che l'abbia aiutato :) –

Problemi correlati