PdfException на iText7 при разбиении PDF на страницы - PullRequest
0 голосов
/ 13 марта 2020

Следующий код должен разбивать многостраничный PDF-файл на один файл на каждой странице. Это работает для первой страницы, но при закрытии целевого pdfDocument для второй страницы выдается iText.Kernel.PdfException: «В документе нет страниц». Пробовал с разными исходными файлами с одинаковым результатом. Попытался также сначала получить количество страниц и открыть читатель для каждой страницы с одинаковым результатом

Shared Function splitFileIntoPages(sourceFilename As String) As Boolean
    If System.IO.File.Exists(sourceFilename) Then

        Using reader As New PdfReader(sourceFilename)
            Using pdfSource As New PdfDocument(reader)
                For iPage = 1 To pdfSource.GetNumberOfPages
                    Dim destFilename = sourceFilename.Replace(".pdf", String.Format(".Page {0}.pdf", iPage))
                    Using writer As New PdfWriter(destFilename)
                        Using pdfDest As New PdfDocument(writer)
                            pdfSource.CopyPagesTo(iPage, 1, pdfDest)
                        End Using
                    End Using
                Next
            End Using
        End Using

    End If
    Return True
End Function

1 Ответ

0 голосов
/ 14 марта 2020

Ключ должен был унаследовать от PdfSplitter и перегрузить метод GetNextPdfWriter, чтобы иметь пользовательское имя файла для файлов результатов:

Class CustomSplitter
    Inherits PdfSplitter

    Private _pageIdx As Integer
    Private ReadOnly _sourceFilename As String

    Shared Function splitFileIntoPages(sourceFilename As String) As Boolean
        If System.IO.File.Exists(sourceFilename) Then
            Dim destinationFolder = System.IO.Path.GetDirectoryName(sourceFilename)
            Using pdfSource As New PdfDocument(New PdfReader(sourceFilename))
                Dim oSplitter = New CustomSplitter(pdfSource, sourceFilename)
                Dim oSplittedDocs = oSplitter.SplitByPageCount(1)

                For Each oSplittedDoc In oSplittedDocs
                    oSplittedDoc.Close()
                Next
            End Using
        End If
        Return True
    End Function

    Public Sub New(ByVal pdfDocument As PdfDocument, ByVal sourceFilename As String)
        MyBase.New(pdfDocument)
        _sourceFilename = sourceFilename
        _pageIdx = 0
    End Sub

    Protected Overrides Function GetNextPdfWriter(ByVal documentPageRange As PageRange) As PdfWriter
        _pageIdx += 1
        Dim filename = _sourceFilename.Replace(".pdf", String.Format(".Page {0}.pdf", _pageIdx))
        Return New PdfWriter(filename)
    End Function
End Class

использование:

CustomSplitter.splitFileIntoPages("mysourcefile.pdf")
...