我需要从链接注释中清除PDF文档。这是我的代码模板:
public static void main(String[] args) throws IOException, COSVisitorException {
try (PDDocument doc = PDDocument.load("input.pdf")) {
final List<PDPage> pages = doc.getDocumentCatalog().getAllPages();
for (PDPage page : pages) {
List<PDAnnotation> annotations = page.getAnnotations();
for (PDAnnotation ann : annotations) {
if (ann instanceof PDAnnotationLink) {
PDAnnotationLink link = (PDAnnotationLink) ann;
PDAction action = link.getAction();
if (action instanceof PDActionURI) {
final PDActionURI linkUri = (PDActionURI) action;
if (linkUri.getURI().contains("www.example.com")) {
// TODO remove the link
}
}
}
}
}
doc.save("output.pdf");
}
}
但我找不到永久删除链接的方法并将这些更改保存到新文件中,链接仍然存在。
如何保存页面修改?
答案 0 :(得分:0)
最近我有类似的任务。也许这个答案可以节省一些时间。
在下面的代码片段中,我使用了PDFBox 2.0.4。
好吧,您可以从文档中删除任何注释,只需将其从通过调用page.getAnnotations()
方法获得的注释列表中删除即可。这里棘手的是你不能通过引用来做到这一点。例如,您可以迭代所有注释,收集应从文档中删除的注释,然后调用annotations.removeAll(shouldBeRemoved)
。但是这种方式没有保证不会从文档中删除不需要的注释。 page.getAnnotations()
方法返回的注释对象可能与页面中保存的注释对象不完全相同。从列表中删除注释的可靠方法是通过索引删除它们:
List<PDAnnotation> annotations = page.getAnnotations();
for (int i = 0; i < annotations.size();) {
PDAnnotation annotation = annotations.get(i++);
if (annotation instanceof PDAnnotationLink) {
PDAnnotationLink link = (PDAnnotationLink) annotation;
PDAction action = link.getAction();
if (action instanceof PDActionURI) {
PDActionURI uriAction = (PDActionURI) action;
String uri = uriAction.getURI();
if (uri != null && uri.contains("<some_text>"))
annotations.remove(--i);
}
}
}
P.S。正如@mkl指出的那样,从文档中删除链接可能还不够。在这种情况下,您应该解析页面内容并重写它,不包括与需要从文档中删除的文本相关的标记。