gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:56:06 27 4
gpt4 key购买 nike

我需要从链接注释中清理 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");
}
}

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

如何保存页面修改?

最佳答案

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

在下面的代码片段中,我使用了 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 所指出的,从文档中删除链接可能还不够。在这种情况下,您应该解析页面内容并重写它,排除与需要从文档中删除的文本相关的标记。

关于java - PDFBox:如何修改页面并将更改保存到新文件(例如删除链接注释)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29287806/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com