2015-01-21 65 views
2

通过使用PDFBox,通过使用PDPageDestination可以轻松创建通往特定页面或页面视图的链接。例如,下面的代码将使该进入9页的链接:如何使用PDFBox创建一个链接到*前一个视图*?

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

destination.setPageNumber(9); 
action.setDestination(destination); 
link.setAction(action); 

问题:
将特定页面,而不是,我想转到以前视图

例如,假设在一个PDF文件中,P.1和P.2中的每一个都有一个连接到P9。现在我想在第9页上提供一个链接,该链接返回到用户开始了。

如果用户在P.1开始并点击链接到P.9,他到达P.9。当他点击第9页的链接时,他会回到P.1,他来自哪里。但是如果他从第2页开始,那么第9页的链接将返回到第2页。

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

仅供参考,使用Adobe Acrobat中,这可以通过添加“执行菜单项”动作的链接,然后选择“上一视图”菜单项目,如本屏幕截图实现:

Link to Acrobat screenshot

+1

我在PDF规范中发现了一个实现注释“Acrobat查看器扩展了表8.61中的命名操作列表,以包含查看器中可用的大多数菜单项名称。”所以需要获得这样的PDF文件,找到名称,并将该名称用作目标。 – 2015-01-21 07:21:07

+0

非常感谢蒂尔曼。对不起,我是PDFBox的新手。对于如何查找名称并将该名称用作目的地,我可以提供一些指导吗? – Brian 2015-01-21 10:08:03

+1

打开您在编辑器(如NOTEPAD ++)中创建的PDF文件,如果找到像“prev”,“menu”,“view”这样的内容,希望这会是。或者使用PDFDebugger(PDFBox的命令行应用程序)查看它。或者在公共场所上传带有该功能的非机密文件,我会查看它以找到该名称。 – 2015-01-21 10:14:09

回答

3

随着蒂尔曼的指导下,我设法解决我自己的问题。

我无法找到一个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)。

+1

+1正是我没有找到任何东西后想到的。 (非常尴尬!有趣的是,PDFBox预检支持命名操作)我将创建一个JIRA问题来在代码中添加类似的东西。 – 2015-01-21 15:01:47

+1

我创建了https://issues.apache.org/jira/browse/PDFBOX-2620。顺便说一下,你的解决方案有一个可能的缺陷,我相信,如果你使用PDFBox加载PDF,命名动作将不存在,例如,用于操作现有文件并保存。为了解决这个问题,必须改变PDActionFactory以包含新元素。但只要您只创建PDF文件,这应该不成问题。 – 2015-01-21 21:17:03

+1

完成。你可以在几个小时内找到快照:https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox/1.8.9-SNAPSHOT/请测试它,看看它的工作原理你的解决方案已经做得很好。如果它不能正常工作,请写入JIRA问题或直接与​​我联系(在snafu dot de的tilman)。 – 2015-01-21 23:28:38

1

你说的是一个依赖于观众的动作;我不认为有一种统一的方法,但应该有方法在Adobe Acrobat/Adob​​e Reader中执行此操作。

其中一种方法是插入触发Action的链接。这个动作可能是一个Javascript动作,而Javascript可能相对简单,因为Acrobat Javascript API包含一个名为“goBack”的“app”方法。

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

这应该在Acrobat中工作(它们在Acrobat Javascript API参考中有一个类似的按钮表单字段的示例,问题是它是否可以在其他查​​看器中工作,从而能否满足您的业务案例

+0

感谢David.Is Acrobat JavaScript是实现这一目标的唯一方法吗?我尝试制作与Acobat的链接,然后使用SumatraPDF - 一个PDF阅读器,特别不支持JavaScript - 打开生成的文件。然而,该链接与SumatraPDF正常工作。 – Brian 2015-01-21 09:48:45

+1

@BrianL。这表明Acrobat没有使用JS。 – 2015-01-21 10:15:22

+2

它可能会真的取决于观众,但正如Tilman所说,这表明Acrobat还有其他一些功能。看看你对Tilman提出的问题的原始评论,这可能意味着Acrobat扩展了名称,并且SumatraPDF实现了这些(非标准名称)。观众是否会支持这些自定义名称和/或Javascript是你必须研究的东西。这就是为什么我在回答中强调“不是一般”的原因。 – 2015-01-21 10:26:35

相关问题