首页 > 解决方案 > 如何使用 PdfBox 删除可选内容组 (OCG)

问题描述

我正在使用 PdfBox(2.0.16)(以前在 iText 中)迁移我们的 Pdf 库。我正在尝试按照如何使用 pdfbox 从 pdf 中删除可选内容组及其内容来删除 OCG? 但我做不到。

pdf 文件由 iText 生成。

int ocgToDelete = -1;
List < Object > objects = Lists.newArrayList();

pdPage = doc.getDocumentCatalog().getPages().get(0);
PDResources resources = pdPage.getResources();
PDFStreamParser parser = new PDFStreamParser(pdPage);
parser.parse();
objects = parser.getTokens();
int index = -1;
/* Looping through Tokens */
for (Object obj: objects) {
    index++;
    if (obj instanceof COSName) {
        PDPropertyList prop = resources
            .getProperties((COSName) obj);
        if (prop != null &&
            prop instanceof PDOptionalContentGroup) {
            String ocgName = ((PDOptionalContentGroup) prop)
                .getName();
            if (StringUtils.equals(ocgName, OCName)) {
                /*Found OCG to Delete */
                ocgToDelete = index;
                break;
            }

        }
    }
}

/*Generating New Tokens */
List < Object > newTokens = Lists.newArrayList();
for (int i = 0; i < pdParser.getTokens().size(); i++) {
    /*Skipping this token */
    if (i == ocgToDelete) {
        continue;
    }
    newTokens.add(pdParser.getTokens().get(i));
}
/*Updating page contents */
ByteArrayOutputStream pdfOutStream = new ByteArrayOutputStream();
PDStream newContents = new PDStream(doc);
OutputStream output = newContents
    .createOutputStream();
ContentStreamWriter writer = new ContentStreamWriter(output);
writer.writeTokens(newTokens);
output.close();
pdPage.setContents(newContents);
doc.save(pdfOutStream);
doc.close();

FileOutputStream out = new FileOutputStream(
    new File("test/emitted/OCGResult.pdf"));
out.write(pdfOutStream.toByteArray());
out.close();

打开生成的 Pdf 文件时出错。非常感谢任何形式的帮助。

标签: javapdfbox

解决方案


推荐阅读