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

PDFBOX:如何克隆页面

丌官瀚
2023-03-14
            PDPage newPage = new PDPage(lastPage.getCOSDictionary());
            PDFCloneUtility cloner = new PDFCloneUtility(pdfDoc);
            pdfDoc.addPage(newPage);
            cloner.cloneMerge(lastPage, newPage);

            // there doesn't seem to be an API to read the fields from the page, need to filter them out from the document.
            List<PDField> newFields = readPdfFields(pdfDoc);
            Iterator<PDField> i = newFields.iterator();
            while (i.hasNext()) {
                if (i.next().getWidget().getPage() != newPage)
                    i.remove();
            }

共有1个答案

彭鸿文
2023-03-14

克隆页面的资源占用最少的方法是对相应字典进行浅层复制:

PDDocument doc = PDDocument.load( file );

List<PDPage> allPages = doc.getDocumentCatalog().getAllPages();

PDPage page = allPages.get(0);
COSDictionary pageDict = page.getCOSDictionary();
COSDictionary newPageDict = new COSDictionary(pageDict);

newPageDict.removeItem(COSName.ANNOTS);

PDPage newPage = new PDPage(newPageDict);
doc.addPage(newPage);

doc.save( outfile );

我显式地删除了副本的注释(表单字段等),因为一个注释有一个指向其页面的引用,这在复制的页面中显然是错误的。

因此,如果您希望注释以一种干净的方式出现,您还必须创建注释数组和所有包含的注释字典的浅副本,并替换其中的页面引用。

大多数PDF读者不会介意,虽然,如果页面引用是不正确的。因此,对于一个肮脏的解决方案,您可以简单地将注释留在页面字典中。但谁想弄脏...;)

如果您想要另外更改新页面或旧页面的某些部分,显然您还必须在操作它们之前复制相应的PDF对象。

其他一些备注:

PDF中的字段是抽象的字段,可以在文档中有许多外观。相同的名字意味着相同的领域。

某页上出现的字段意味着该页上有一个表示该字段的注释。为了使事情更加复杂,对于只有一个外观的字段,可以合并字段字典和注释字典。

因此,根据您的需求,您首先必须决定是使用字段还是使用字段注释。

 类似资料:
  • 问题内容: 我有一个其中包含许多bufferedimages的对象,我想创建一个新对象,将所有bufferedimages复制到新对象中,但是这些新图像可能会更改,并且我不希望通过更改原始对象图像来更改新对象图像。 明白了吗? 这有可能做到吗,有人可以建议一个好方法吗?我曾经想到过getSubImage,但在某处阅读过,该子映像的任何更改都被重新关联回了父映像。 我只希望能够获得BufferedI

  • 问题内容: 如何克隆 Java并同时在Java中克隆其项目? 例如,我有: 我希望其中的对象与狗列表中的对象不同。 问题答案: 你将需要迭代这些项目,然后逐个克隆它们,然后将克隆放入结果数组中。 显然,要使该方法起作用,你将必须使你的类实现接口并重写该方法。

  • 问题内容: 如果克隆数组,我将使用 我想知道如何在nodejs中克隆对象。 问题答案: 对于不需要压缩每一滴性能的实用程序和类,我经常作弊,只是使用JSON执行深层复制: 这不是唯一的答案,也不是最优雅的答案。所有其他答案都应考虑成为生产瓶颈。但是,这是一个快速而肮脏的解决方案,非常有效,并且在大多数情况下(我会克隆属性的简单哈希值)很有用。

  • 我想制作一份扩展的副本,作为我自己扩展的基础。我如何克隆一个TYPO3扩展,以同样的行为开始我自己的扩展。我必须更改哪些文件和参数?

  • 我已经在数据库中保存了一个JPA实体。 我想拥有它的副本(具有不同的id),并修改了一些字段。 最简单的方法是什么?例如: 将它的字段设置为并持久化它会起作用吗? 我是否必须为实体创建一个克隆方法(复制除之外的所有字段)? 还有其他方法吗(比如使用克隆框架)?

  • 我有下面的java代码,当我稍后尝试访问MiscDoc对象时,它似乎是空的。我找不到答案。NotesDocument上的clone()方法。 if语句只被访问一次 我该如何解决这个问题