首页 > 解决方案 > 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);

标签: javapdfbox

解决方案


推荐阅读