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

问题描述 投票:0回答:1

我试图用iTextSharp循环浏览一个PDF文档,并删除所有空白页。我有代码来检查每一页是不是空白,并将其写入一个新的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()
vb.net pdf itext
1个回答
1
投票

问题就像 @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()

这可以复制完整的页面。

© www.soinside.com 2019 - 2024. All rights reserved.