我有一份由不同用户评论的.pdf文档的多个副本。我想将所有这些评论合并到一个新的pdf“merged”中。
我在一个名为document的类中编写了这个sub,其属性为“path”和“directory”。
Public Sub MergeComments(ByVal pdfDocuments As String())
Dim oSavePath As String = Directory & "\" & FileName & "_Merged.pdf"
Dim oPDFdocument As New iText.Kernel.Pdf.PdfDocument(New PdfReader(Path),
New PdfWriter(New IO.FileStream(oSavePath, IO.FileMode.Create)))
For Each oFile As String In pdfDocuments
Dim oSecundairyPDFdocument As New iText.Kernel.Pdf.PdfDocument(New PdfReader(oFile))
Dim oAnnotations As New PDFannotations
For i As Integer = 1 To oSecundairyPDFdocument.GetNumberOfPages
Dim pdfPage As PdfPage = oSecundairyPDFdocument.GetPage(i)
For Each oAnnotation As Annot.PdfAnnotation In pdfPage.GetAnnotations()
oPDFdocument.GetPage(i).AddAnnotation(oAnnotation)
Next
Next
Next
oPDFdocument.Close()
End Sub
此代码导致我无法解决的异常。
iText.Kernel.PdfException:'Pdf间接对象属于其他PDF文档。将对象复制到当前的pdf文档。
为了执行此任务,我需要更改什么?或者我完全关闭我的代码块?
您需要将基础PDF对象显式复制到目标文档。之后,您可以轻松地将该对象添加到页面注释列表中。
而不是直接添加注释:
oPDFdocument.GetPage(i).AddAnnotation(oAnnotation)
首先将对象复制到目标文档,使用PdfAnnotation
方法将其包装到makeAnnotation
类中,然后照常添加它。代码是Java,但您可以轻松地将其转换为VB:
PdfObject annotObject = oAnnotation.getPdfObject().copyTo(pdfDocument);
pdfDocument.getPage(i).addAnnotation(PdfAnnotation.makeAnnotation(annotObject));