Поверните одну страницу на 90 градусов с помощью iTextSharp / VB в существующем многостраничном PDF - PullRequest
7 голосов
/ 17 декабря 2010

Я пытаюсь интегрировать 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-файлов, но ничего не для существующих.Кто-нибудь может мне помочь?Спасибо!

1 Ответ

7 голосов
/ 17 декабря 2010

Вы делаете это сложнее, чем нужно.

Вместо того чтобы вращать содержимое страницы, вы хотите повернуть саму страницу:

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

Вот и все.Вы можете поиграть с desiredPage и desiredRot, чтобы получить тот эффект, который вам нужен.Наслаждайтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...