Повернуть одну страницу на 90 градусов с помощью iTextSharp / VB в существующий многостраничный PDF

Я пытаюсь интегрировать iTextSharp в существующее приложение для обработки изображений документов, которое позволяет пользователям поворачивать отдельные страницы, которые могли быть отсканированы, под неправильным углом (это происходит чаще, чем я думал).

Фактические данные страницы правильно вращаются на 90/180 градусов, но ориентация страницы не меняется вместе с ними. Я только начал работать с iTextSharp, поэтому я все еще немного не знаком с его методами, но смог собрать все, что у меня есть, используя сообщения из StackOverflow. Это близко, но не совсем так.

Вот что у меня есть на данный момент:

' 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

Я попытался добавить следующий код вверху, чтобы получить размер страницы с существующей страницы и поменять местами размеры, если угол поворота был 90 или 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()

К сожалению, это привело к повороту каждой страницы на 90 градусов, и данные на странице, которую я хотел повернуть, все равно не отображались в нужном месте (они были сдвинуты вниз и немного за пределы страницы).

Как я уже сказал, я не очень хорошо знаком с внутренней работой API. Я проверил примеры в Интернете на странице sourceforge и взглянул на книгу (оба издания), но не вижу ничего, что подходило бы под все требования. Я видел здесь пример, который показывает ориентацию страницы для вновь созданных PDF-файлов, но ничего для существующих. Кто-нибудь может мне помочь? Спасибо!

7
задан M463 6 January 2017 в 15:29
поделиться