2010-12-17 6 views
7

I iTextSharp in eine bestehenden Document Imaging-Anwendung zu integrieren versuchen die Benutzer einzelne Seiten zu drehen, erlaubt es, die zu einem falschen Winkel in abgetastet worden sein (es passiert öfter als ich gedacht hätte).drehen, um eine einzelne Seite um 90 Grad mit iTextSharp/VB in einer bestehenden mehrseitigen PDF-

Ich habe die tatsächliche Seitendaten über 90/180 Grad richtig zu drehen, aber die Seitenausrichtung ist, mit sich nicht dreht. Ich habe gerade angefangen, mit iTextSharp zu arbeiten, also bin ich immer noch ein wenig mit seinen Methoden nicht vertraut, konnte aber das, was ich bisher verwendet habe, mit Posts von StackOverflow kombinieren. Es ist nah, aber nicht ganz da.

Hier ist, was ich bisher habe:

' 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 

ich oben den folgenden Code hinzugefügt versucht, die Seitengröße aus der bestehenden Seite zu packen und die Dimensionen tauschen, wenn der Drehwinkel 90 oder 270 war:

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

Leider ist dies die Wirkung der rotierenden hatte jede Seite 90 Grad, und die Daten auf der Seite, die ich gedreht wollte nicht zeigen ohnehin an der richtigen Stelle (es wurde nach unten verschoben und von der Seite einer Bit).

Wie ich schon sagte, ich bin nicht wirklich vertraut mit dem Innenleben des API. Ich habe die Beispiele online auf der Seite von sourceforge ausgecheckt und habe mir das Buch angesehen (beide Editionen), aber ich sehe nichts, was zur Rechnung passt. Ich habe hier ein Beispiel gesehen, das die Seitenausrichtung für neu zusammengestellte PDFs zeigt, aber nichts für vorhandene PDFs. Kann mir jemand helfen? Vielen Dank!

Antwort

7

Sie machen diese schwieriger, als es sein muss.

vielmehr den Seiteninhalt als rotierende, möchten Sie die Seite selbst drehen:

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

Das ist es. Sie können mit desiredPage und desiredRot spielen, um den gewünschten Effekt zu erzielen. Genießen.

+0

Das ... ist absolut perfekt. Ich nahm an, du meintest selledRot im Befehl pageDict.put und nicht curRot, und es scheint der Trick gewesen zu sein. Hmm, ich muss vielleicht neu bewerten, wie ich meine Page-Flip-Transformation auch mache. Vielen Dank! –

+0

Richtig, tut mir leid. Ich habe den Code bearbeitet, um ihn zu beheben. Froh, dass ich Helfen kann. –

+0

Ich glaube nicht, dass dieser Trick funktioniert, um Seitenumbrüche zu machen, oder? Nein, wahrscheinlich nicht. Ich mache jetzt eine Transformation, um Flips zu behandeln, aber es hat den Effekt, alle Formulardaten zu löschen. Andererseits glaube ich, dass das Scannen gescannter PDFs, die umgedreht werden, eine sehr seltene Sache ist, also muss ich mich wahrscheinlich nicht viel darum kümmern. Danke noch einmal! –