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

时间:2015-03-26 20:04:51

标签: 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");
    }
}

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

如何保存页面修改?

1 个答案:

答案 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指出的那样,从文档中删除链接可能还不够。在这种情况下,您应该解析页面内容并重写它,不包括与需要从文档中删除的文本相关的标记。