2010-12-17 89 views
7

Estoy intentando integrar iTextSharp en una aplicación existente de Document Imaging que permite a los usuarios rotar páginas individuales que pueden haberse escaneado en un ángulo incorrecto (sucede más a menudo de lo que hubiera pensado).Girar una sola página 90 grados con iTextSharp/VB en un PDF de varias páginas existente

Tengo los datos reales de la página girando correctamente en 90/180 grados, pero la orientación de la página no está girando junto con ella. Acabo de empezar a trabajar con iTextSharp, por lo que todavía estoy un poco familiarizado con sus métodos, pero pude improvisar lo que tengo hasta ahora usando publicaciones de StackOverflow. Está cerca, pero no del todo allí.

Esto es lo que tengo hasta ahora:

' Get the input document and total number of pages 
Dim inputPdf As New iTextSharp.text.pdf.PdfReader(fileName) 
Dim pageCount As Integer = inputPdf.NumberOfPages 

' Load the input document 
Dim inputDoc As New iTextSharp.text.Document(inputPdf.GetPageSizeWithRotation(1)) 

' Set up the file stream for our output document 
Dim outFileName As String = Path.ChangeExtension(fileName, "pdf") 
Using fs As New FileStream(outFileName, FileMode.Create) 
    ' Create the output writer 
    Dim outputWriter As iTextSharp.text.pdf.PdfWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(inputDoc, fs) 
    inputDoc.Open() 

    ' Copy pages from input to output document 
    Dim cb As iTextSharp.text.pdf.PdfContentByte = outputWriter.DirectContent 
    For index As Integer = 1 To pageCount 
     inputDoc.SetPageSize(inputPdf.GetPageSizeWithRotation(index)) 
     inputDoc.NewPage() 

     ' If this is our page to be rotated, perform the desired transform 
     ' TODO - 90 degree rotations need to change the page orientation as well 
     Dim page As iTextSharp.text.pdf.PdfImportedPage = outputWriter.GetImportedPage(inputPdf, index) 
     If index = pageNum Then 
      Select Case angle 
       Case 90 
        cb.AddTemplate(page, 0, -1, 1, 0, 0, page.Height) 
       Case 180 
        cb.AddTemplate(page, -1, 0, 0, -1, page.Width, page.Height) 
       Case 270 
        cb.AddTemplate(page, 0, 1, -1, 0, page.Width, 0) 
       Case Else 
        ' Should not be here, but don't do anything 
        cb.AddTemplate(page, 1, 0, 0, 1, 0, 0) 
      End Select 
     Else 
      ' No rotation; add as is 
      cb.AddTemplate(page, 1, 0, 0, 1, 0, 0) 
     End If 
    Next 
    inputDoc.Close() 
End Using 

He intentado añadir el código siguiente al principio de agarrar el tamaño de página de la página existente y cambiar las dimensiones, si el ángulo de rotación fue de 90 o 270:

For index As Integer = 1 To pageCount 
Dim pageSize As iTextSharp.text.Rectangle = inputPdf.GetPageSizeWithRotation(index) 
If angle = 90 OrElse angle = 270 Then 
    ' For 90-degree rotations, change the orientation of the page, too 
    pageSize = New iTextSharp.text.Rectangle(pageSize.Height, pageSize.Width) 
End If 
inputDoc.SetPageSize(pageSize) 
inputDoc.NewPage() 

Desafortunadamente, esto tenía el efecto de la rotación de cada página 90 grados, y los datos sobre la página que quería roté no se presentó en el lugar correcto de todos modos (que fue desplazado hacia abajo y fuera de la página de una poco).

Como dije, no estoy muy familiarizado con el funcionamiento interno de la API. He revisado los ejemplos en línea en la página de sourceforge y he echado un vistazo al libro (ambas ediciones), pero no veo nada que encaje con la factura. Vi un ejemplo aquí que muestra la orientación de la página para archivos PDF recién compilados, pero nada para los existentes. ¿Alguien puede ayudarme? ¡Gracias!

Respuesta

7

Estás haciendo esto más difícil de lo necesario.

En lugar de la rotación de los contenidos de la página, que desea girar la página en sí:

PdfReader reader = new PdfReader(path); 
PdfStamper stamper = new PdfStamper(reader, outStream); 

PdfDictionary pageDict = reader.getPageN(desiredPage); 
int desiredRot = 90; // 90 degrees clockwise from what it is now 
PdfNumber rotation = pageDict.getAsNumber(PdfName.ROTATE); 
if (rotation != null) { 
    desiredRot += rotation.intValue(); 
    desiredRot %= 360; // must be 0, 90, 180, or 270 
} 
pageDict.put(PdfName.ROTATE, new PdfNumber(desiredRot); 


stamper.close(); 

Eso es todo. Puede jugar con desiredPage y desiredRot para obtener el efecto que busca. Disfrutar.

+0

Eso ... es absolutamente perfecto. Supuse que querías decir "deseado" en el comando pageDict.put, y no en curRot, y parece haberlo hecho. Hmm, quizás tenga que volver a evaluar cómo estoy haciendo la transformación de mi página. ¡Muchas gracias! –

+0

Correcto, disculpa eso. Edité el código para arreglarlo. Encantado de ayudar. –

+0

Supongo que este truco no funcionaría para hacer volteos de página también, ¿o sí? Nah, probablemente no. Me transformo en este momento para manejar flips, pero tiene el efecto de matar cualquier forma de datos. Por otra parte, supongo que obtener PDF escaneados que sean volteados será algo muy raro, así que probablemente no tenga que preocuparme mucho por eso. ¡Gracias de nuevo! –

Cuestiones relacionadas