PDFBox:如何修改页面并将更改保存到新文件(例如删除链接注释)?

and*_*rew 5 java pdf pdfbox

我需要从链接注释中清理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");
    }
}
Run Code Online (Sandbox Code Playgroud)

但我找不到永久删除链接的方法并将这些更改保存到新文件,链接仍然存在.

如何保存页面修改?

bri*_*art 1

最近我有类似的任务。也许这个答案会为某人节省一些时间。

在下面的代码片段中我使用了 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

PS正如@mkl 指出的那样,从文档中删除链接可能还不够。在这种情况下,您应该解析页面内容并重写它,排除与需要从文档中删除的文本相关的标记。