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!
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! –
Dobrze, przepraszam za to. Edytowałem kod, aby to naprawić. Miło, że mogłem pomóc. –
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! –