【问题标题】:How to use PDFBox to create a link that goes to *previous view*?如何使用 PDFBox 创建指向 *previous view* 的链接?
【发布时间】:2015-03-19 14:20:24
【问题描述】:

通过使用 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 文件中,P.1 和 P.2 中的每一个都有一个指向 P.9 的链接。现在我想在 P.9 上放置一个返回用户所在位置的链接开始了。

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

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

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

Link to Acrobat screenshot

【问题讨论】:

  • 我在 PDF 规范中找到了一个实现说明“Acrobat 查看器扩展了表 8.61 中的命名操作列表,以包括查看器中可用的大多数菜单项名称。”因此,需要获取这样一个 PDF 文件,找到名称,并将该名称用作目的地。
  • 非常感谢蒂尔曼。抱歉,我是 PDFBox 的新手。我可以就如何找到名称并将该名称用作目的地提供一些指导吗?
  • 在NOEPAD++等编辑器中打开您创建的PDF文件,搜索是否找到“prev”、“menu”、“view”之类的内容,希望就是这样。或者用 PDFDebugger(PDFBox 的命令行应用程序)查看。或者在公共场所上传具有该功能的非机密文件,我会查看它以找到该名称。
  • 我用文本编辑器打开了我的 PDF 文件,发现以下内容。这正是我通过 Acrobat 创建的链接的坐标。但我不确定 /H、/P、/BS 或 /A 是什么意思。如何使用这些信息来重现 PDFBox 的此类链接? >
  • 含义可以在Additional entries specific to a link annotation段的PDF规范中找到。现在在 1050 0 o 会很有趣。

标签: java pdf pdfbox acrobat


【解决方案1】:

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

我找不到可以添加“命名操作”的 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 就是我一无所获后的想法。 (非常尴尬!有趣的是,PDFBox preflight 确实支持命名操作)我将创建一个 JIRA 问题以将类似的内容添加到我们的代码中。
  • 我创建了 issues.apache.org/jira/browse/PDFBOX-2620 。顺便说一句,您的解决方案有一个可能的缺陷,我相信如果您使用 PDFBox 加载 PDF,则命名操作将不存在,例如用于操作现有文件并保存它。要解决此问题,必须更改 PDActionFactory 以包含新元素。但这应该不是问题,只要您只是创建 PDF 文件。
  • 完成。您可以在几个小时后在此处找到快照:repository.apache.org/content/groups/snapshots/org/apache/… 请对其进行测试,看看它是否与您的解决方案一样有效。如果它不能正常工作,请写在 JIRA 问题中或直接联系我(snafu dot de 的 tilman)。
  • 我尝试在快照中使用 PDActionNamed 类。它完美地工作。谢谢!
【解决方案2】:

您所说的是依赖于观众的动作;我认为一般没有办法做到这一点,但在 Adob​​e Acrobat / Adob​​e Reader 中应该有办法做到这一点。

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

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

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

【讨论】:

  • 谢谢 David。Acrobat JavaScript 是实现此功能的唯一方法吗?我尝试使用 Acobat 生成链接,然后使用 SumatraPDF(一种专门不支持 JavaScript 的 PDF 阅读器)打开生成的文件。然而,该链接在 SumatraPDF 上运行良好。
  • @BrianL。这表明 Acrobat 不需要 JS。
  • 这可能真的取决于观看者,但正如 Tilman 所说,这表明 Acrobat 做了其他事情。查看 Tilman 对您的问题的原始评论,这可能意味着 Acrobat 扩展了名称,并且 SumatraPDF 实现了这些(非标准名称)。观众是否会支持这些自定义名称和/或 Javascript 确实是您必须调查的事情。这就是为什么我在回答中强调“不是一般”这一点。
猜你喜欢
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 2020-07-04
  • 2012-03-24
  • 2017-06-23
相关资源
最近更新 更多