Копирование страниц из PDF без учета пустых страниц iTextSharp - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь l oop через документ PDF с iTextSharp и удалить все пустые страницы. У меня есть код, чтобы проверить, что каждая страница не пуста, и записать ее в новый PDF, но я получаю сообщение об ошибке «В документе нет страниц» при закрытии нового документа. Однако файл, который создается в папке, имеет ожидаемый размер файла.

Вот мой текущий код:

Dim reader As PdfReader = New PdfReader(strSourceFile)
Dim raf As RandomAccessFileOrArray = New RandomAccessFileOrArray(strSourceFile)
Dim document As Document = New Document(reader.GetPageSizeWithRotation(1))
Dim writer As PdfWriter = PdfWriter.GetInstance(document, New FileStream(saver.FileName, FileMode.Create))
document.Open()
Dim page As PdfImportedPage = Nothing

Dim cb As Byte()

For i As Integer = 1 To reader.NumberOfPages()

    cb = reader.GetPageContent(i, raf)
    If cb.Length > 150 Then

        page = writer.GetImportedPage(reader, i)

    End If

Next

document.Close() 'This is where the error occurs.
writer.Close()
raf.Close()
reader.Close()

1 Ответ

1 голос
/ 28 апреля 2020

Проблема заключается в том, что @ usr2564301 упоминается в комментарии: вы импортируете страницу в новый документ (в виде формы XObject), но не помещаете этот XObject ни на одну страницу нового документа.

В Поместите его туда, просто расширьте ваше предложение if следующим образом:

If cb.Length > 150 Then

    page = writer.GetImportedPage(reader, i)
    writer.DirectContentUnder.AddTemplate(page, 0, 0)
    document.NewPage()

End If

У этого решения есть некоторые недостатки: страница импортируется как форма Xobject, и этот XObject вставляется на текущую страницу в целевой документ. Но если размеры страницы различаются (А4 здесь, ПИСЬМО там или портрет здесь, пейзаж там), части страницы, скорее всего, будут потеряны. Кроме того, импорт страницы в виде XObject в PdfWriter копирует только обычное содержимое страницы, но не аннотации (например, поля формы) и аналогичные дополнительные материалы .

Вместо , вы должны использовать PdfCopy для этого:

Dim reader As PdfReader = New PdfReader(strSourceFile)
Dim raf As RandomAccessFileOrArray = New RandomAccessFileOrArray(strSourceFile)
Dim document As Document = New Document(reader.GetPageSizeWithRotation(1))
Dim copy As PdfCopy = New PdfCopy(document, New FileStream(strDestFile, FileMode.Create))
document.Open()
Dim page As PdfImportedPage = Nothing

Dim cb As Byte()

For i As Integer = 1 To reader.NumberOfPages()

    cb = reader.GetPageContent(i, raf)
    If cb.Length > 150 Then

        page = copy.GetImportedPage(reader, i)
        copy.AddPage(page)

    End If

Next

document.Close()
raf.Close()
reader.Close()

Это копирует полные страницы, как они есть.

...