首页 > 解决方案 > 如何用 PDActionJavaScript 替换 PDAnnotationLink 的默认操作?

问题描述

我需要在文档中找到所有 PDAnnotationLink 并用 PDActionJavaScript 替换它们的默认操作。最终目标是让链接在新选项卡中打开,但现在我只想在点击时显示警报。这是测试示例:

import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.interactive.action.PDAction;
import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript;
import org.apache.pdfbox.pdmodel.interactive.action.PDActionURI;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
import org.junit.Test;

/**
 *
 */
public class PdfBoxTest {

    @Test
    public void testReplaceLinks() throws Exception {

        String pathPrefix = ...path to pdf file with links...;

        Path originalPdf = Paths.get(pathPrefix + "links_test.pdf");
        PDDocument doc = PDDocument.load(originalPdf.toFile());
        doc.getDocumentCatalog().getPages().forEach(page -> {
            try {
                page.getAnnotations().forEach(pdAnnotation -> {
                    if (pdAnnotation instanceof PDAnnotationLink) {
                        PDAnnotationLink link = (PDAnnotationLink) pdAnnotation;
                        PDAction action = link.getAction();
                        if (action instanceof PDActionURI) {
                            PDActionURI uri = (PDActionURI) action;
                            PDActionJavaScript javaScript =
                                new PDActionJavaScript("app.alert(\"" + uri.getURI() + "\");");
                            // actual goal of replacing the links is to open them in a new tab/window
//                            PDActionJavaScript javaScript =
//                                new PDActionJavaScript("app.launchURL(\"" + uri.getURI() + "\", true);");
                            link.setAction(javaScript);
                        }
                    }
                });
            } catch (Throwable t) {
                throw new RuntimeException(t);
            }
        });
        Path modifiedPdf = Paths.get(pathPrefix + "links_test_mod.pdf");
        doc.save(modifiedPdf.toFile());
    }
}

但文档只呈现不可点击的链接标签(不显示警报)。我确定我在这里遗漏了一些东西。
以下是 PDF 文件的链接。
原文: https
://www.dropbox.com/s/notwf6yde5okh7g/links_test_orig.pdf?dl=0 修改: https ://www.dropbox.com/s/bejj6rawwjrbyyc/links_test_mod.pdf?dl=0

标签: javapdfbox

解决方案


推荐阅读