我的 iText RemoteGoto 没有跳转到正确的目的地

My iText RemoteGoto doesn't jump to the correct destination

在我的 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());

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

我仔细检查了 link 'keys' 是否相同,它们确实相同。

iText 或 PDF Reader 有什么阻碍找到目的地?

在 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 以确保您创建 link 到使用 PDF 字符串而不是 PDF 名称的命名目标(这可能就是你正在做的)。

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

当我查看“导航”选项卡时已确认这一点,但当我尝试添加命名目的地时,我得到 "There was a problem reading this document (15)."我不知道 15 指的是什么。

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

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