2010-12-17 12 views
7

Próbuję zintegrować iTextSharp z istniejącą aplikacją do obrazowania dokumentów, która umożliwia użytkownikom obracanie pojedynczych stron, które mogły zostać zeskanowane pod niewłaściwym kątem (zdarza się częściej, niż myślałem).Obracanie pojedynczej strony o 90 stopni za pomocą iTextSharp/VB w istniejącym wielostronicowym pliku PDF

Mam faktyczne dane strony obracające się poprawnie o 90/180 stopni, ale orientacja strony nie obraca się wraz z nim. Właśnie zacząłem pracować z iTextSharp, więc wciąż jestem trochę obeznany z jego metodami, ale udało mi się spleść to, co dotychczas korzystałem z postów StackOverflow. Jest blisko, ale nie całkiem.

Oto co mam do tej pory:

' 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 

Próbowałem dodając następujący kod do góry, aby chwycić rozmiar strony z istniejącej strony i zamienić wymiary jeżeli kąt obrotu wynosi 90 lub 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() 

Niestety, to miało wpływ na obracanie każdy strona 90 stopni, a dane na stronie chciałem obrócony nie pokazać się w odpowiednim miejscu i tak (został przesunięty w dół i poza nim strona a kawałek).

Tak jak powiedziałem, nie jestem zaznajomiony z wewnętrznymi funkcjami API. Sprawdziłem przykłady online na stronie sourceforge i przyjrzałem się książce (obie wersje), ale nie widzę niczego, co pasowałoby do rachunku. Widziałem tutaj przykład pokazujący orientację strony dla nowo skomponowanych plików PDF, ale nic dla istniejących. Czy ktokolwiek może mi pomóc? Dzięki!

Odpowiedz

7

Robisz to trudniej, niż powinno być.

Zamiast obracania zawartości strony, chcesz obrócić stronę sam:

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

to wszystko. Możesz grać z desiredPage i desiredRot, aby uzyskać efekt, jaki chcesz osiągnąć. Cieszyć się.

+0

To ... jest absolutnie idealne. Zakładam, że oznaczałeś pożądanyRot w poleceniu pageDict.put, a nie curRot i wygląda na to, że zrobiłeś lewę. Hmm, może będę musiał ponownie ocenić, w jaki sposób dokonuję transformacji strony. Dziękuję Ci bardzo! –

+0

Dobrze, przepraszam za to. Edytowałem kod, aby to naprawić. Miło, że mogłem pomóc. –

+0

Nie sądzę, aby ta sztuczka działała również przy odwracaniu stron, prawda? Nie, prawdopodobnie nie. Teraz dokonuję transformacji, aby poradzić sobie z odwracaniem, ale efektem jest zabicie wszelkich danych formularza. Z drugiej strony, przypuszczam, że pobieranie zeskanowanych plików PDF, które są odwracane, będzie bardzo rzadkie, więc prawdopodobnie nie muszę się o to martwić. Dzięki jeszcze raz! –