从 PDF 复制页面忽略空白页 iTextSharp

Copying pages from PDF ignoring blanks pages iTextSharp

我正在尝试使用 iTextSharp 遍历 PDF 文档并删除所有空白页。 我有检查每一页是否为空白并将其写入新 PDF 的代码,但在关闭新文档时出现错误 "The document has no pages"。但是,在文件夹中创建的文件确实具有我期望的文件大小。

这是我当前的代码:

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

问题如@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 被粘贴到目标文档中的当前页面。但是,如果页面尺寸不同(这里是 A4,那里是 LETTER,或者这里是纵向,那里是横向),页面的某些部分可能会丢失。此外,将页面作为 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()

这将按原样复制完整的页面。