当前位置: 首页 > 知识库问答 >
问题:

iText7在新的pdf文档上合并pdf注释

高钱青
2023-03-14

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

我在一个名为“路径”和“目录”属性的文档类中编写了这个子类。

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。内核PDFEException:“Pdf间接对象属于其他Pdf文档。将对象复制到当前pdf文档。'

要执行此任务,我需要更改什么?还是我完全摆脱了我的代码块?

共有2个答案

詹夕
2023-03-14

这是一个可以工作的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();
孟沛
2023-03-14

您需要将底层PDF对象显式复制到目标文档。之后,您将能够轻松地将该对象添加到页面注释列表中。

不要直接添加注释:

oPDFdocument.GetPage(i).AddAnnotation(oAnnotation)

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

PdfObject annotObject = oAnnotation.getPdfObject().copyTo(pdfDocument);
pdfDocument.getPage(i).addAnnotation(PdfAnnotation.makeAnnotation(annotObject));
 类似资料:
  • 在上一章中,我们已经了解了如何合并多个PDF文档。 在本章中,我们将了解如何从PDF文档的页面中提取图像。 从PDF文档生成图像 PDFBox库为您提供了一个名为PDFRenderer的类, PDFRenderer PDF文档呈现为AWT BufferedImage。 以下是从PDF文档生成图像的步骤。 第1步:加载现有PDF文档 使用PDDocument类的静态方法load()加载现有PDF文档

  • 在上一章中,我们已经了解了如何将给定的PDF文档拆分为多个文档。 现在让我们学习如何将多个PDF文档合并为一个文档。 合并多个PDF文档 您可以使用名为PDFMergerUtility类的类将多个PDF文档合并到一个PDF文档中,此类提供了将两个或多个PDF文档合并到单个PDF文档中的方法。 以下是合并多个PDF文档的步骤。 第1步:加载现有PDF文档 使用PDDocument类的静态方法load

  • 我需要在现有的pdf上添加一些文本注释。我设法创建了注释并显示它们。唯一的问题是,当在Adobe Reader中打开pdf文档时,注释的内容(如果已最大化)会显示在页面的右侧。 可以将展开标注的坐标设置为与图标相同?(我在用itext 5操作pdf) 提前谢谢

  • 主要内容:合并多个PDF文档,示例在前一章中,我们已经看到如何将给定的PDF文档分成多个文档。 现在让我们学习如何将多个PDF文档合并为一个文档。 合并多个PDF文档 使用类的类将多个PDF文档合并到单个PDF文档中,该类提供了将两个或多个PDF文档合并到单个PDF文档中的方法。 以下是合并多个PDF文档的步骤。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态

  • 目前我正在使用pdfbox下载我服务器上的所有pdf文件,然后使用pdfbox将它们合并在一起。它的工作非常好,但它非常慢--因为我必须下载所有的。 有没有一种方法可以直接在S3上执行所有这些?我正在试图找到一种方法来实现它,即使不是在Java也是在python中,也无法做到这一点。 我读到了以下内容: 在S3 Amazon上合并文件 null null 编辑 最后我使用 并用 实现它。我设置了最

  • 我想在另一个缩放的PDF页面中插入一个PDF页面。我想用iTextSharp做这个。 我有一个矢量绘图,可以导出为单页PDF文件。我想将此文件添加到其他PDF文档的页面中,就像我将图像添加到PDF文档一样。 这可能吗? 这样做的目的是在不损失质量的情况下保留放大的能力。 使用PDF矢量很难再现矢量绘图,因为它是一个极其复杂的绘图。 导出矢量绘图为高分辨率图像不是一个选项,因为我不得不在一个单独的P