【问题标题】:My iText RemoteGoto doesn't jump to the correct destination我的 iText RemoteGoto 没有跳转到正确的目的地
【发布时间】:2018-07-11 19:04:20
【问题描述】:

在我的 iText 文档中,我正在写一些关于我的实体的文本,这些文本将引用另一个 PDF 文档中的出现。 使用 iText 有多种方法可以做到这一点:

static String externalLinkPrefix = "external_entity_";
String externalFile = "anotherPdf.pdf";
Chunk entity = new Chunk("name");
// use the plain remoteGoto() method
chunk.setRemoteGoto(externalFile, externalLinkPrefix + entity.getIdentifier());
// or use the PdfAction
chunk.setAction(PdfAction.gotoRemotePage(externalFile, externalLinkPrefix + entity.getIdentifier(), false, true);

// later on create the destination in the other file
Paragraph entityReference = new Paragraph(new Chunk("name")
     .setLocalDestination(externalLinkPrefix + entity.getIdentifier());

但是,当我单击创建的链接时,它会将我带到第二个文档的开头,表明它没有找到目的地。

我仔细检查了链接“键”是否相同。

iText 或 PDF 阅读器对查找目的地有何阻碍?

【问题讨论】:

  • 你能分享PDF吗?这样,我们可以检查文档中的 GoToR 链接以及链接和文档中的命名目的地以及引用。
  • 抱歉耽搁了。有关链接,请参阅我的编辑。我想在我的问题中添加 pdf 流的相关部分,但我在文档中发现了一个小怪癖。在链接源文档中有多个 GoToR,而应该只有一个(可能是我的错误)。你能指出流的相关部分吗?

标签: hyperlink itext goto


【解决方案1】:

在 PDF 中描述命名目的地有两种方式:

  1. 您使用 PDF 字符串定义目标(自 PDF 1.2 起首选),
  2. 您使用 PDF 名称定义目标(PDF 1.1 中的原始名称)。

在您的情况下,创建一个将目标存储为 PDF 字符串的名称树:

你看到foo_section_2了吗?这显然是一个 PDF 字符串。您正在使用首选方式来定义命名目的地,因为 setLocalDestination() 在 iText 中是这样编程的。

但是,您使用了不完整的PdfAction.gotoRemotePage() 方法。根据您的 PDF,我假设您使用 PDF 名称 (/foo_section_2) 创建对命名目标的引用:

您可以看到/foo_section_2 是一个名称,因为它以/ 开头。没有使用目标文件中的名称定义的命名目标,因此无法找到目标。

您应该像这样使用gotoRemotePage() 方法:

PdfAction.gotoRemotePage(externalFile, externalLinkPrefix + entity.getIdentifier(),
    false, true)

gotoRemotePage() 方法的第三个参数应该是false,以确保您创建一个指向使用 PDF 字符串而不是 PDF 名称的命名目标的链接(这可能是您正在做的事情)。

出于某种原因,Acrobat 认为 grunddaten 没有任何命名的目的地:

当我查看导航选项卡时确认了这一点,但当我尝试添加命名目的地时,我得到“阅读此文档时出现问题 (15)”。我不知道 15 指的是什么。

运行预检,我得到更多信息:

这告诉我 NameTreeRoot 构造不正确。我得调查一下出了什么问题。它在我创建具有命名目的地的文档时起作用,请参阅RemoteGoto。我刚刚对其进行了测试并运行了 Preflight,它运行良好。我不知道你的文件出了什么问题...

【讨论】:

  • 感谢您的详细解答。但是我不得不承认,当我在我的代码中删除不相关的东西时我犯了一个错误。我编辑了我的问题以包含 gotoRemotePage() 的完整 iText API 调用,我已经使用了第 3 个(=false)和第 4 个( =true) 参数。我正在通过上面示例中包含的调用创建目标。我还尝试将 isName 从 true 切换为 false,但没有一个可以正常工作。我可能很天真,但我认为确保 goto 的“名称”相等就可以了。还有什么问题?
  • 将问题搁置几天后,我只是试图让它工作,瞧,它就工作了。我没有改变任何东西[对我来说很明显]。我正在使用您推荐的方法。感谢您的帮助和见解:-)
  • @RobertNorden 感谢您的反馈。关于这个问题,我的个人 TODO 列表上仍然有一张未处理的票(我看了几次,但我只是没有看到有什么问题)。我暂时关闭它。
  • 啊,我可能找到了原因。与此同时,我从 iText 5.5.6(见你的截图)切换到 5.5.7!我只是再次将其切换回来进行测试。在 5.5.6 中它不起作用,在 5.5.7 中它起作用!
猜你喜欢
  • 2015-05-02
  • 2023-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
相关资源
最近更新 更多