Java 如何使用PDFBox创建指向*上一视图*的链接?

Java 如何使用PDFBox创建指向*上一视图*的链接?,java,pdf,pdfbox,acrobat,Java,Pdf,Pdfbox,Acrobat,通过使用PDFBox,使用PDPageDestination可以轻松创建指向特定页面或页面视图的链接。例如,以下代码将创建一个指向第9页的链接: PDAnnotationLink link = new PDAnnotationLink(); PDPageDestination destination = new PDPageFitWidthDestination(); PDActionGoTo action = new PDActionGoTo(); des

通过使用PDFBox,使用
PDPageDestination
可以轻松创建指向特定页面或页面视图的链接。例如,以下代码将创建一个指向第9页的链接:

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

destination.setPage(document.getPage(9));
action.setDestination(destination);
link.setAction(action);
问题:
我想转到上一个视图,而不是转到特定页面

例如,假设在PDF文件中,第1页和第2页都有一个指向第9页的链接。现在,我想在第9页添加一个链接,返回到用户开始的位置

如果用户从第1页开始,并单击指向第9页的链接,那么他将到达第9页。当他点击第9页的链接时,他将返回到他来自的第1页。但如果他从第2页开始,那么第9页的链接将返回到第2页

问题:如何使用PDFBox实现这一点?

仅供参考,使用Adobe Acrobat,可以通过向链接添加“执行菜单项”操作,然后选择“上一个视图”作为菜单项来实现,如此屏幕截图所示:


你所说的是依赖于观众的行为;我不认为有一种通用的方法可以做到这一点,但在AdobeAcrobat/AdobeReader中应该有这样的方法

其中一种方法是插入触发操作的链接。该操作可以是Javascript操作,Javascript可以相对简单,因为AcrobatJavaScript API包含一个名为“goBack”的“app”方法

所以,现在就插入一个链接。插入的不是GoTo操作,而是Javascript操作。并将Javascript设置为:“app.goBack()


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

在Tilman的指导下,我设法解决了自己的问题

我找不到能够添加“命名动作”的PDAction子类,因此我创建了自己的子类“PDActionNamed”:

要使用子类

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阅读器(例如苏门答腊PDF)上也可以使用它。

我在PDF规范中找到了一个实现说明“Acrobat查看器扩展了表8.61中的命名操作列表,以包括查看器中可用的大多数菜单项名称。”所以你需要得到这样一个PDF文件,找到它的名字,然后使用它作为目的地。非常感谢Tilman。对不起,我是PDFBox的新手。我可以为你提供一些关于如何找到名字并使用它作为目的地的指导吗?打开你在NOTEPAD++之类的编辑器中创建的PDF文件,如果你找到“prev”、“menu”、“view”之类的内容,请进行搜索,希望就是这样。或者使用PDFDebugger(PDFBox的命令行应用程序)查看它。或者在公共场所上传一个具有该功能的非机密文件,我会查看它以找到该名称。我用文本编辑器打开了我的PDF文件,发现了以下内容。这正是我由Acrobat创建的链接的坐标。但我不确定/H、/P、/BS或/a是什么意思。我如何使用这些信息来复制这些内容与PDFBox的链接?>其含义可以在该段的PDF规范中找到。现在,1050点的时候会发生什么会很有趣。谢谢David。Acrobat JavaScript是实现这一点的唯一方法吗?我尝试使用Acobat生成链接,然后使用苏门答腊PDF(一种专门不支持JavaScript的PDF阅读器)打开结果文件。但链接在SumatraPDF上运行良好。@BrianL。这表明Acrobat在没有JS的情况下运行。这可能真的取决于查看者,但正如Tilman所说,这表明Acrobat做了其他事情。查看Tilman对您问题的原始评论,这可能意味着Acrobat扩展了名称,并且SumatraPDF实现了这些(非标准名称)。查看者是否支持这些自定义名称和/或Javascript确实是您必须调查的问题。这就是为什么我在回答中强调了“非通用”部分。+1正是我在没有发现任何内容后所想的。(非常尴尬!有趣的是,PDFBox preflight确实支持命名操作)我将创建一个JIRA问题,以便在我们的代码中添加类似的内容。我已经创建了。顺便说一句,您的解决方案有一个可能的缺陷,我相信如果您使用PDFBox加载PDF,命名操作将不存在,例如,用于操作现有文件并保存它。要修复此问题,必须更改PDActionFactory以包含新元素。但这不应该是一个错误问题,只要你只创建PDF文件。完成。你可以在这里几个小时内找到快照:请测试它,看看它是否与你的解决方案一样好。如果它不能正常工作,请写在JIRA问题上或直接与我联系(tilman在snafu dot de).我试过在快照中使用PDActionNamed类。它非常有效。谢谢!
PDAnnotationLink link   = new PDAnnotationLink(); 
PDActionNamed action = new PDActionNamed ();
action.setN("GoBack");    // this is one of Acrobat's default named action
link.setAction(action);