java - 如何使用 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 文件时出错。非常感谢任何形式的帮助。