2010-08-26 31 views
9

Estoy utilizando la función siguiente para dividir el pdf en dos.Rotar PDF en C# usando iTextSharp

Aunque está dividiendo el pdf, el contenido aparece al revés. ¿Cómo lo giro 180 grados?

Por favor ayuda. a continuación es el código para el mismo

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

Respuesta

2

He intentado su código y funcionó bien para mí; las páginas divididas mantuvieron su orientación original.

Una solución podría ser girar explícitamente sus páginas 180 grados.

Reemplazar:

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

Si su llamada a inputPdf.GetPageRotation(i) retornos 180 entonces usted puede manejar esto en la declaración if que sigue (usando el código sugerido para la rotación == 180)

6

Deberías probar esto. Funcionó para mí:

   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

He encontrado que las respuestas anteriores no giran correctamente para las 4 rotaciones principales.

A continuación se muestra mi código para manejar 0, 90, 180 y 270 correctamente. Esto se ha probado con un PDF rotado en cada una de estas direcciones.

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

¿Puedo escalar utilizando itext con el mismo código? –

+2

+1: Aparentemente 'caso 0:' puede acortarse a 'writer.DirectContent.AddTemplate (importedPage, 0, 0);' Su respuesta me acaba de ayudar a resolver un problema de rotar un PDF existente en un 90, 180 o 270 grados adicionales :) Sería fantástico si esos parámetros estuvieran documentados en alguna parte, ya que supongo que son una transformación de matriz (?). Muchas gracias. –

+0

Hay un problema adicional con la rotación de las páginas ya giradas. Usé su respuesta y agregué una con las manipulaciones adicionales de tamaño de página/rotación para permitir la rotación de las páginas ya giradas. El código anterior –

0

Un pequeño cambio en el código de código antiguo

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

nuevo código

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

Esto solucionará el problema con la rotación de 270 grados

+0

está perfectamente bien con iTextSharp v 5.5. – Matthieu

2

@TimS 'respuesta fue muy cerca de perfecto, y proporcionó los parámetros correctos a AddTemplate, pero necesitaba hacer algunas adiciones para permitir 90, 180, 270 de rotación de un PDF donde las páginas ya tienen rotación de 0, 90, 180 o 270: se pasa

Suponiendo un parámetro de RotateFlipType rotateFlipType a la función para especificar la rotación (la enumeración útil de la llamada 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; 
    } 
} 

Esperamos que esto ayudará a otra persona que desee corregir la rotación de archivos PDF entrantes. Me tomó 2 días perfeccionarlo.

+1

Tu código funciona como un amuleto. Muchas gracias. Me has salvado el día. – RolandDeschain

+0

@RolandDeschain: Me alegro de que haya ayudado :) –

Cuestiones relacionadas