【问题标题】:iText7 Merge pdf annotations on a new pdf documentiText7 在新的 pdf 文档上合并 pdf 注释
【发布时间】:2019-02-07 09:14:10
【问题描述】:

我有多个由不同用户评论的 .pdf 文档副本。我想将所有这些 cmets 合并成一个新的 pdf “合并”。

我在一个名为 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 文档。'

我需要更改哪些内容才能执行此任务?还是我完全放弃了我的代码块?

【问题讨论】:

    标签: itext itext7


    【解决方案1】:

    您需要将基础 PDF 对象显式复制到目标文档。之后,您就可以轻松地将该对象添加到页面注释列表中。

    而不是直接添加注解:

    oPDFdocument.GetPage(i).AddAnnotation(oAnnotation)
    

    首先将对象复制到目标文档,用makeAnnotation方法将其包装到PdfAnnotation类中,然后照常添加。代码是用 Java 编写的,但您可以轻松地将其转换为 VB:

    PdfObject annotObject = oAnnotation.getPdfObject().copyTo(pdfDocument);
    pdfDocument.getPage(i).addAnnotation(PdfAnnotation.makeAnnotation(annotObject));
    

    【讨论】:

      【解决方案2】:

      这是一个有效的 Java 代码,使用 copyTo 方法将注释从一个文档复制到另一个文档。

      PdfReader reader = new PdfReader(new 
      RandomAccessSourceFactory().createBestSource(sourceFileName), null);
      
              PdfDocument document = new PdfDocument(reader);
      
              PdfReader toMergeReader = new PdfReader(new RandomAccessSourceFactory().createBestSource(targetFileName), null);
              PdfDocument toMergeDocument = new PdfDocument(toMergeReader);
      
              PdfWriter writer = new PdfWriter(targetFileName + "_MergedVersion.pdf");
              PdfDocument writeDocument = new PdfDocument(writer);
      
              int pageCount = toMergeDocument.getNumberOfPages();
              for (int i = 1; i <= pageCount; i++) {
                  PdfPage page = document.getPage(i);
                  writeDocument.addPage(page.copyTo(writeDocument));
                  PdfPage pdfPage = toMergeDocument.getPage(i);
                  List<PdfAnnotation> pageAnnots = pdfPage.getAnnotations();
                  if (pageAnnots != null) {
                      for (PdfAnnotation pdfAnnotation : pageAnnots) {
                          PdfObject annotObject = pdfAnnotation.getPdfObject().copyTo(writeDocument);
                          writeDocument.getPage(i).addAnnotation(PdfAnnotation.makeAnnotation(annotObject));
                      }
                  }
              }
              reader.close();
              toMergeReader.close();
              toMergeDocument.close();
              document.close();
              writeDocument.close();
              writer.close();
      

      【讨论】:

        猜你喜欢
        • 2022-01-12
        • 1970-01-01
        • 2019-11-17
        • 2020-04-07
        • 2013-08-26
        • 2021-07-08
        • 1970-01-01
        • 2010-12-10
        • 2020-09-27
        相关资源
        最近更新 更多