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

PDFBox在插入第二张图像后,“保存增量”不起作用

百里意智
2023-03-14

我的PDFBox有问题。我有一个PDF格式的空白页,我想在其中插入图像。因为我也使用签名PDF,所以所有更改都必须保存为“saveIncremental”。

当我只插入一个图像时,一切都很好(图像已被插入)。当我试图在这个PDF中插入另一个图像时,它没有被插入,当在Adobe Acrobat Reader中打开时,它说“此页面存在错误。Adobe可能无法正确显示页面...”。

奇怪的事情-当PDF不仅是空白页,但例如空白页的图像,一切都很好(第一个和第二个图像已插入正确的保存增量)。

插入和保存图像的代码

PDImageXObject pdImage = PDImageXObject.createFromFile(tmpSig.getFileName(), doc);
PDPageContentStream contentStream = new PDPageContentStream(doc, tmpPage, PDPageContentStream.AppendMode.APPEND, true, true);
contentStream.drawImage(pdImage, finalX, (finalPageHeight - finalY - finalHeight), finalWidth, finalHeight);
contentStream.close();

// update before save
tmpPage.getCOSObject().setNeedToBeUpdated(true);
tmpPage.getResources().getCOSObject().setNeedToBeUpdated(true);
doc.getDocumentCatalog().getPages().getCOSObject().setNeedToBeUpdated(true);
doc.getDocumentCatalog().getCOSObject().setNeedToBeUpdated(true);

// save
doc.saveIncremental(new FileOutputStream(pdfFile));

这里有所有文件

使用PDFBox版本2.0.7,但我也尝试了最新版本(2.0.15),但没有帮助。

感谢所有的想法!

编辑:我试图更新XObject和资源如下(在注释“保存前更新”下添加了此代码):

pdImage.getCOSObject().setNeedToBeUpdated(true);
PDResources pdResources = tmpPage.getResources();
for (COSName name : pdResources.getXObjectNames()) {
    pdResources.getXObject(name).getCOSObject().setNeedToBeUpdated(true);
}

问题依然存在,没有任何改变。。。

共有1个答案

尹弘壮
2023-03-14

除了已经标记为已更新的词典之外

tmpPage.getCOSObject().setNeedToBeUpdated(true);
tmpPage.getResources().getCOSObject().setNeedToBeUpdated(true);
doc.getDocumentCatalog().getPages().getCOSObject().setNeedToBeUpdated(true);
doc.getDocumentCatalog().getCOSObject().setNeedToBeUpdated(true);

还请将资源字典中的XObject条目标记为已更新:

tmpPage.getResources().getCOSObject().getCOSDictionary(COSName.XOBJECT).setNeedToBeUpdated(true);

在原始PDF中,资源字典中还没有XObject条目。因此,它被重新生成,因此被隐式地标记为updated。

在另一个文件中,资源字典中的XObject条目是直接对象,即它立即包含在资源字典中。

4 0 obj
<<
  /Type /Page
  /Resources <<
    /ProcSets [/PDF /Text /ImageB /ImageC /ImageI]
    /ExtGState <</G3 5 0 R /gs2 6 0 R /gs3 7 0 R>>
    /XObject <</Im1 8 0 R /Im2 9 0 R>>
  >>
  /MediaBox [0 0 611.03998 864.95996]
  /Contents [10 0 R 11 0 R 12 0 R 13 0 R 14 0 R]
  /StructParents 0
  /Parent 2 0 R
>> 
endobj

因此,无论何时编写资源字典的新副本,都会隐式地编写XObject条目的新副本。

但是,在PDFBox在资源字典中创建XObject条目的文件中,PDFBox将其创建为间接对象,即在资源字典中,XObject仅映射到对对象编号的引用,在具有该编号的对象中,可以找到实际的条目字典。

2 0 obj
<<
  /Type /Page
  /Resources <<
    /ProcSets [/PDF /Text /ImageB /ImageC /ImageI]
    /ExtGState <</G3 3 0 R>>
    /XObject 7 0 R
  >>
  /MediaBox [0 0 611.03998 864.95996]
  /Contents [8 0 R 4 0 R 9 0 R]
  /StructParents 0
  /Parent 5 0 R
>>
endobj
7 0 obj
<<
  /Im1 10 0 R
>> 
endobj

因此,当编写资源字典的新副本时,在这种情况下不会编写XObject条目字典的隐式新副本。

顺便说一句你现在的方法对你的任务没有帮助

因为我也使用签名PDF,所以所有更改都必须保存为“saveIncremental”。

向页面内容添加图像是不允许对签名的PDF进行更改的,因此Adobe Reader仍将指示您的签名无效。有关签名后允许和不允许更改的摘要,请查看此答案及其引用的文档。

您应该尝试在注释中添加图像。

 类似资料:
  • 我有一个pdf文件,其中包含一些我想从java填写的表单字段。现在我正在尝试填写一个我通过其名称找到的表单。我的代码如下所示: 这是: 作为系统。out状态下,该值设置正确,但在生成的pdf文件中,新值未显示(显示原始字符串),因此我猜增量保存无法正常工作。我错过了什么? 我使用2.0.2版本的pdfbox,下面是我使用的pdf文件:pdf

  • 问题内容: 我正在使用html2canvas 0.4.0渲染屏幕截图,并希望将其另存为Web服务器上的图像。 为此,我编写了以下函数: JavaScript saveJPG.php 渲染完画布后,我可以将其完美地附加到HTML主体中,但是将其保存在服务器上会导致文件损坏(?)。 我可以在IrvanView中读取尺寸,但是图像是透明的/空的?该文件约为2.076 KB。所以它不是真的是空的。 我也尝

  • 主要内容:将图像插入PDF文档在前一章中,我们已经学习如何从现有的PDF文档中提取文本。 在本章中,将讨论如何将图像插入PDF文档。 将图像插入PDF文档 分别使用类的以及类的方法将图像插入到PDF文档中。 以下是从现有PDF文档中提取文本的步骤。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态方法,可以使用类名称调用它,如下所示。 第2步:检索页面 在P

  • 问题内容: 我正在寻找这样的查询: id | int | 自动增量 varchar | 255 这样桌子就看起来像 1 | val1 2 | val2 3 | val3 … 除了id总是以每一行都结束而已。 我怎样才能做到这一点? 问题答案:

  • 问题内容: 我正在使用Solr 4.2。请注意,完全导入有效,但增量导入却不起作用。增量导入不会产生任何错误,但不会获取任何更改。这是数据配置文件。 这是我没有运气的尝试。 将p.product_id =’$ {dih.delta.product_id}更改为p.product_id =’$ {dih.delta.id}以及其他方式。将updtime>’$ {dih.last_index_time

  • 问题内容: 我检查了一下,发现它不是内置的。所以我从这里下载了整个文件夹。我如何开始本教程: 我正在使用iPython(Jupyter),是否需要将工作目录更改为我下载的该文件夹?还是可以将其添加到目录中?如果是这样,我应该在哪里添加文件?我安装了(在OSX上),当前位置是 是否要通过类似的数据集直接访问这些文件?还是我只是应该进入目录并从那里工作?这个例子不清楚。 编辑: 这个帖子已经过时了 问