【问题标题】:PdfException on iText7 when splitting a Pdf into pages将 Pdf 拆分为页面时 iText7 上的 PdfException
【发布时间】:2020-03-13 11:27:55
【问题描述】:

接下来的代码应该将一个多页的 pdf 文件拆分为每页一个文件。 它适用于第一页,但是当关闭第二页的目标 pdfDocument 时,它会抛出 iText.Kernel.PdfException: 'Document has no pages。 尝试使用具有相同结果的不同源文件。 还尝试首先获取页数并以相同的结果打开每一页的阅读器

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

【问题讨论】:

标签: vb.net itext7


【解决方案1】:

关键是从 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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    相关资源
    最近更新 更多