使用iText API为PDF文件中的所有书签创建目的地

时间:2008-10-06 07:42:34

标签: pdf pdf-generation itext bookmarks tagged-pdf

我想编写一些带有PDF文档的(java)代码,并从所有书签创建命名目标。我认为iText API是最简单的方法,但我之前从未使用过API。

您如何使用iText API编写此类代码? iText可以自己进行操作现有PDF所需的解析吗?我正在考虑的那种操作是:

  • 打开,
  • 查找书签,
  • 创建目的地,
  • 保存,
  • 关闭。

或者是否有更好的API?

2 个答案:

答案 0 :(得分:5)

跟进:我几个月前向iText提交了一个补丁(现已被接受并且是HEAD的一部分),它为iText添加了文本解析功能。 PdfBox(下面提到)在读取使用外部参照流而不是旧的外部参照表格式的较新PDF时遇到了(有?)问题。


非常擅长解析现有PDF文件的另一个库是PdfBox它也可用于修改现有PDF。仅供参考 - 这是Lucene使用的文本解析器。

我还要提到iText 能够解析PDF文件,它在解析每个页面上的文本内容时效果不佳。如果您正在寻找用于存储书签等的PDF更高级别的构造(字典等)......并且您不介意在阅读PDF规范时让您的手有点脏,您可以绝对做你要问的事情(我们自己做了很多)。

PDF Spec很大,但大部分都是可读的,如果你想要的话,你不必担心它的大部分(面向实际的页面内容和渲染)是提取书签。

答案 1 :(得分:3)

我会事先警告你,你可能对此感到失望。 iText实际上并不打算用作解析器。这对于创建全新的 PDF文档来说真的更重要,但是你可以对它进行重击。

首先,使用iText,您将无法修改现有的PDF文档。但是, 可以做的是使用您想要的其他功能制作副本。 (如果其他人知道的更好,让我知道,这让我发疯了。)

您要做的是从源文件的输入流创建PdfReader对象。然后创建一个PdfCopy对象(它只是一个扩展的PdfWriter,使得从现有源获取数据更方便)。

据我所知,书签根本无法从iText获得。可能需要另一个库。我认为jpedal可能具有提取它们的能力(它可以将它们作为XML文档获取,然后您可能必须解析它以获得您想要的内容。)但是,如果您获得它们,则可以将它们添加到java.util.List,并将该列表设置为PDFCopy上的大纲。书签本身只是具有一组特定键的HashMaps。我不确定所有的值是什么,但它们包括“标题”,“动作”(这似乎是你指定这是一个命名目的地的地方,虽然我不知道那个值是什么)和“URI”(如果这是一个外部链接,则使用它 - 我怀疑这将指定您链接到的指定目标的名称)。同样,细节很难找到。

然后遍历阅读器页面,将每个页面导入PdfCopy。 this page可能会对您有所帮助。

抱歉,我对你没有多大帮助。祝你好运。

P.S。如果有人知道更好的工具(L)GPL或BSD许可,我很乐意听到它。