如何使用 PDFBox 创建一个 link 转到 *previous view*?

How to use PDFBox to create a link that goes to *previous view*?

通过使用 PDFBox,可以很容易地创建一个 link,使用 PDPageDestination 进入特定页面或页面视图。例如,以下代码将生成一个转到第 9 页的 link:

PDAnnotationLink link         = new PDAnnotationLink();
PDPageDestination destination = new PDPageFitWidthDestination();
PDActionGoTo action           = new PDActionGoTo();

destination.setPage(document.getPage(9));
action.setDestination(destination);
link.setAction(action);

问题:
我不想转到特定页面,而是想转到上一个 view.

例如,假设在一个 PDF 文件中,P.1 和 P.2 都有一个 link 转到 P.9。现在我想在 P.9 上放一个 link 返回到用户开始的地方。

如果用户从 P.1 开始并单击 link 到 P.9,他将到达 P.9。当他点击 P.9 上的 link 时,他将返回到他来自的 P.1。但如果他从 P.2 开始,那么 P.9 的 link 将返回 P.2。

问题:如何使用 PDFBox 实现此目的?

仅供参考,使用 Adob​​e Acrobat,这可以通过将 "execute a menu item" 操作添加到 link,然后选择 "Previous View" 作为菜单项来实现,如屏幕截图所示:

Link to Acrobat screenshot

您所说的是依赖于观看者的操作;我不认为有一种通用的方法可以做到这一点,但在 Adob​​e Acrobat / Adob​​e Reader.

中应该有办法做到这一点

一种这样的方法是插入一个 link 来触发一个动作。该动作可以是 Javascript 动作,而 Javascript 可能相对简单,因为 Acrobat Javascript API 包含一个名为 "goBack" 的 "app" 方法。

所以,像现在一样插入一个 link。插入的不是 GoTo 操作,而是 Javascript 操作。并将 Javascript 设置为:"app.goBack()".

这应该在 Acrobat 中工作(他们在 Acrobat Javascript API 参考中有一个带有按钮表单字段的类似示例。问题是它是否也适用于其他查看器,因此它是否会满足您的业务需求。

在Tilman的指导下,我成功解决了自己的问题

我找不到使我能够添加 "named action" 的 PDAction 子类,所以我创建了自己的子类,"PDActionNamed":

class PDActionNamed extends PDAction {

    public static final String SUB_TYPE = "Named";    

    public PDActionNamed() {
        super();
        setSubType( SUB_TYPE );
    }

    public void setN( String s ) {
        action.setName( "N", s );
    }
}

要使用子类,

PDAnnotationLink link   = new PDAnnotationLink(); 
PDActionNamed action = new PDActionNamed ();
action.setN("GoBack");    // this is one of Acrobat's default named action
link.setAction(action);

它似乎甚至可以在不支持 Javascript 的 PDF 阅读器(例如 SumatraPDF)上工作。