- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 PDFBox 时遇到问题。我的 PDF 中有一个空白页,我想在其中插入图像。因为我还使用签名的 PDF,所以所有更改都必须保存为“saveIncremental”。
当我只插入一张图像时,一切都很好(图像已插入)。当我尝试在此 PDF 中插入另一张图像时,该图像尚未插入,并且在 Adobe Acrobat Reader 中打开时显示“此页面存在错误。Adobe 可能无法正确显示该页面...”。
奇怪的事情 - 当 PDF 不仅是空白页,而且例如带图像的空白页,一切都很好(第一张和第二张图像已使用 saveIncremental 正确插入)。
插入和保存图片代码:
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));
所有可用文件 here
使用 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);
}
问题仍然存在,没有任何改变......
最佳答案
除了您已标记为已更新的词典
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 条目。因此,它是重新生成的,因此隐式标记为已更新。
在该其他文件中,资源字典中的 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 条目字典的隐式新副本。
<小时/>顺便说一句,您当前的方法不会帮助您完成任务
Because I also work with signed PDFs, all changes have to be saved as "saveIncremental".
不允许将图像添加到页面内容中对已签名的 PDF 进行更改,因此 Adobe Reader 仍会指示您的签名无效。有关签名后允许和不允许的更改的摘要,请查看 this answer以及从中引用的文档。
您应该尝试在注释中添加图像。
关于java - PDFBox - "saveIncremental"插入第二张图像后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56024623/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!