0

Next code should split a multipage pdf file into one file each page. It works for first page, but when closing destination pdfDocument for second page it throws iText.Kernel.PdfException: 'Document has no pages.' Tried with different source files with same result. Tried also to first get the pagecount and open the reader for each page with same result

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
Matias Masso
  • 1,670
  • 3
  • 18
  • 28

1 Answers1

0

The key was to inherit from PdfSplitter and overload the method GetNextPdfWriter to have a custom filename for the result files:

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

usage:

CustomSplitter.splitFileIntoPages("mysourcefile.pdf")
Matias Masso
  • 1,670
  • 3
  • 18
  • 28