我一直在使用PDF文件中的命名目标在文件中的特定位置打开PDF文件。负责生成PDF文档的团队使用一种工具从书签自动生成命名的目的地,因此命名的目的地往往具有* 9_Glossary *或* Additional_Information *之类的名称。我们被要求用多种语言制作相同的文档。我希望我们将在相同的位置为我们提供多种外语的PDF文档和书签,但是书签的名称当然会使用其他语言,并且自动生成的命名目的地将是外语。我希望所有文档中的命名目的地都相同。
我不能成为第一个遇到这个问题的人,所以我很想看看其他人是否已经解决了这个问题。
一种想法可能是重命名外语文档中的目的地。我已经使用iSharpText提取了一个命名目的地列表。 iSharpText是否可以重命名目标?理想情况下,我有一个翻译器可以用来匹配每种语言中的命名目的地名称的工具,然后让该工具替换命名目的地名称。
另一个想法是维护一个数据库,实时进行翻译。转换器仍必须匹配命名的目的地名称,但它们存储在数据库中。命令Adobe Reader打开的程序将使用英语版本查找外语名称,然后使用该名称打开文档。
我也会对PDF创作工具的建议感兴趣,这些建议可能会使此问题更容易解决。
最佳答案
请看示例RenameDestinations。它的作用超出了您的需要,因为原始文档本身包含指向命名目的地的链接,为了使这些目的地能够正常工作,我们需要更改引用已更改名称的操作。
这是与您相关的部分:
PdfDictionary catalog = reader.getCatalog();
PdfDictionary names = catalog.getAsDict(PdfName.NAMES);
PdfDictionary dests = names.getAsDict(PdfName.DESTS);
PdfArray name = dests.getAsArray(PdfName.NAMES);
for (int i = 0; i < name.size(); i += 2) {
PdfString original = name.getAsString(i);
PdfString newName = new PdfString("new" + original.toString());
name.set(i, newName);
}
首先,您将获得根字典(或目录)。您得到
/Names
字典,查找命名的目的地(/Dests
)。就我而言,我有一个简单的数组,其中包含成对的PdfString
和对PdfArray
值的引用。我将所有字符串值替换为新名称。我要像这样更改的结构是名称树,通常不是那么线性。在您的PDF中,该树可以具有分支,因此您可能需要编写一个递归方法来遍历这些分支。我没有时间写一个更详尽的例子,也不想为您偷工。该示例应为您提供帮助。
请注意,我在名为
Map
的renamed
中跟踪原始名称和新名称。我使用此映射在第一页上更改链接注释的目的地。