我一直在PDF文件中使用命名目的地来打开文件中特定位置的PDF文件。负责生成PDF文档的团队使用工具从书签自动生成命名目的地,因此命名目的地往往具有* 9_Glossary *或* Additional_Information *等名称。我们被要求以多种语言制作相同的文件。我希望我们将提供多种外语的PDF文档,书签位于相同的位置,但书签的名称当然是这些其他语言,自动生成的命名目的地将使用外语。我希望所有文件中的命名目的地都一样。
我不能成为第一个遇到这个问题的人,所以我很想知道其他人是否已经处理过这个问题。
可能的一种想法可能是重命名外语文档中的目的地。我使用iSharpText来提取命名目的地的列表。 iSharpText可以重命名目的地吗?理想情况下,我有一个工具,我的翻译可以使用它来匹配每种语言中的命名目的地名称,然后让工具替换命名的目的地名称。
另一个想法是维护一个实时执行翻译的数据库;翻译器仍然必须匹配命名的目标名称,但它们存储在数据库中。命令Adobe Reader打开的程序将使用英文版本查找外语名称,然后使用它来打开文档。
我也对PDF编写工具的建议感兴趣,这些工具可能会使这个问题更容易解决。
答案 0 :(得分:1)
请查看示例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
的{{1}}中跟踪原始名称和新名称。我使用此映射来更改第一页上链接注释的目的地。
答案 1 :(得分:0)
我来晚了,大声笑,但这可能会让其他人从Google搜索中找到这个话题。
我建议让Autobookmark专业化,它为书签,链接和命名目的地提供了很多工具。
更容易导出,然后使用文本编辑器更改名称然后重新导入。
请记住,如果命名的目标附加在链接上,您将不得不重置那些链接,因为它们不会自动更新。