7

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

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

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

还是有其他更好的 API?

4

2 回答 2

6

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


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

我还要提一下,iText确实有解析 PDF 文件的能力,只是它不擅长解析每一页上的文本内容。如果您正在考虑访问用于存储书签等的 PDF 更高级别的结构(字典等),并且您不介意在阅读 PDF 规范时弄脏您的手,您可以绝对做你所要求的(我们自己做了很多)。

PDF 规范很大,但大部分都是可读的,如果您要做的只是提取书签,您不必担心其中的大部分内容(针对实际页面内容和渲染)。

于 2008-10-07T04:17:45.043 回答
3

我只是提前警告你,你可能会对此感到失望。iText 并不是真的打算用作解析器。它确实更适合创建全新的PDF 文档,但您可以尝试一下。

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

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

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

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

对不起,我对你没有更多的帮助。祝你好运。

PS 如果其他人知道 (L)GPL 或 BSD 许可的更好工具,我很想听听。

于 2008-10-06T19:28:50.103 回答