我从一个网站下载了pdf文件,每个页面上都有一个矩形的超链接。我想从每个页面删除链接。 我使用的是PDFBox 2.0.8版本。
我发现链接描述位于文档的每个页面的ANNOTS中。我删除了与链接相对应的ANOOTS。因为我将来自PDF目录的链中的每个节点的needToUpdated标志设置为true。 在调试模式下,我看到在AccessPermission对象中readOnly标志设置为true。 当我打开编辑的pdf文件时,所有页面都是空的,并且对于每个页面,Acrobat Reader都显示以下错误:
处理页面时出错。无效的功能资源。
我有几个问题:
这是我的代码(对不起质量,这只是草稿):
File book = new File(path_to_pdf_file);
PDDocument document = PDDocument.load(book);
document.setAllSecurityToBeRemoved(true);
COSDictionary dictionary = document.getDocumentCatalog().getCOSObject();
dictionary.removeItem(COSName.PERMS);
dictionary.setNeedToBeUpdated(true);
((COSObject) document.getDocumentCatalog().getCOSObject().getItem(COSName.PAGES)).setNeedToBeUpdated(true);
dictionary = document.getDocumentCatalog().getPages().getCOSObject();
dictionary.setNeedToBeUpdated(true);
COSArray arr = (COSArray) dictionary.getDictionaryObject(COSName.KIDS);
arr.setNeedToBeUpdated(true);
COSArray arrayForLoop;
COSDictionary tempDic;
for (int k = 0; k < arr.size(); ++k) {
COSObject object = (COSObject) arr.get(k);
object.setNeedToBeUpdated(true);
dictionary = (COSDictionary) object.getObject();
dictionary.setNeedToBeUpdated(true);
arrayForLoop = (COSArray) dictionary.getItem(COSName.ANNOTS);
arrayForLoop.setNeedToBeUpdated(true);
arrayForLoop = (COSArray) arrayForLoop.getCOSObject();
arrayForLoop.setNeedToBeUpdated(true);
dictionary = (COSDictionary) arrayForLoop.get(0);
dictionary.setNeedToBeUpdated(true);
dictionary.removeItem(COSName.TYPE);
dictionary.removeItem(COSName.SUBTYPE);
dictionary.removeItem(COSName.RECT);
dictionary.removeItem(COSName.BORDER);
tempDic = (COSDictionary) dictionary.getItem(COSName.A);
tempDic.setNeedToBeUpdated(true);
dictionary.removeItem(COSName.A);
}
document.saveIncremental(new FileOutputStream(path_to_save_file));
document.close();
在上面的代码中,我遍历每一页,删除对应的ANNOTS 链接。我还使用saveIncremental方法遍历从leaf到root的所有已修改节点。 谢谢你的回答。