我试图用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()
问题就像 @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()
这可以复制完整的页面。