java - PDFBox - 此页面存在错误。Acrobat 可能无法正确显示页面
问题描述
我们正在使用 pdfbox 库 2.x 来操作 pdf 操作。在一次操作中,我必须从页面中删除选定的图像。它工作正常。但是当我打开修改后的文档时,它会显示一条警告消息:
An error exists on this page. Acrobat may not display the page correctly.
它如下所示:
以下是从页面中删除图像的代码:
PDResources resources = copyResources(page);
COSDictionary pageObjects = (COSDictionary) resources.getCOSObject().getDictionaryObject(COSName.XOBJECT);
COSDictionary newObjects = new COSDictionary();
Set<String> imageNames = findImageNames(page);
Iterable<COSName> xObjectNames = resources.getXObjectNames();
for (COSName xObjectName : xObjectNames) {
System.out.println(xObjectName);
if (resources.isImageXObject(xObjectName)) {
Boolean used = imageNames.contains(xObjectName);
if (used) {
newObjects.setItem(xObjectName, pageObjects.getItem(xObjectName));
} else {
System.out.println("Found unused image: name={}"+xObjectName.getName());
}
} else {
newObjects.setItem(xObjectName, pageObjects.getItem(xObjectName));
}
}
resources.getCOSObject().setItem(COSName.XOBJECT, newObjects);
page.setResources(resources);
如果我缺少此代码的任何内容,请帮助我,如果需要更多信息,请告诉我。
下面的代码通过元数据删除特定图像:
PDFStreamParser parser = new PDFStreamParser(page);
parser.parse();
List<Object> tokens = parser.getTokens();
List<Object> newTokens = new ArrayList<Object>();
for(int j=0; j<tokens.size(); j++) {
Object token = tokens.get( j );
if(token instanceof COSName) {
COSName cosname = (COSName) token;
PDXObject o = resources.getXObject(cosname);
if (o instanceof PDImageXObject) {
PDImageXObject pdImageXObject = (PDImageXObject) o;
DomXmpParser xmpParser = new DomXmpParser();
XMPMetadata xmpMetadata = xmpParser.parse(pdImageXObject.getMetadata().toByteArray());
if(imgUniqueId.equals(xmpMetadata.getDublinCoreSchema().getTitle())) {
newTokens.remove(newTokens.size() - 1);
continue;
}
}
}
newTokens.add(token);
}
PDStream newContents = new PDStream( document );
OutputStream outputStream = newContents.createOutputStream();
ContentStreamWriter writer = new ContentStreamWriter( outputStream );
writer.writeTokens(newTokens);
outputStream.close();
newContents.addCompression();
page.setContents(newContents);
解决方案
推荐阅读
- c++ - 如何使用 std::chrono 或其他任何东西来减慢我的 for 循环?
- c# - 如何在画布中的图像上获取绘制矩形的位置
- vue.js - 使用 Vue3 组合 API 打开/关闭模式无法按预期工作
- linux - 验证 .sh 文件头
- python - Kivy 动态替换 kv 文件并添加 .widget
- sql - 在Oracle SQL中将标签合并到由换行符分隔的值
- excel - 使用powershell一个接一个地复制多个excel列
- sparql - 在 SPARQL 中使用子查询过滤数据
- php - Docker-compose up 有效,但使用 Visual Studio Code 开发容器无效
- ibm-cloud - ibm cloud 用于集成 Telemetry Enable