我想编写一些(java)代码来获取 PDF 文档,并从所有书签中创建命名目的地。我认为 iText API 是最简单的方法,但我以前从未使用过该 API。
您将如何使用 iText API 编写此类代码?iText 可以自己进行操作现有 PDF 所需的解析吗?我正在考虑的那种操作是:
- 打开,
- 查找书签,
- 创建目的地,
- 节省,
- 关闭。
还是有其他更好的 API?
我想编写一些(java)代码来获取 PDF 文档,并从所有书签中创建命名目的地。我认为 iText API 是最简单的方法,但我以前从未使用过该 API。
您将如何使用 iText API 编写此类代码?iText 可以自己进行操作现有 PDF 所需的解析吗?我正在考虑的那种操作是:
还是有其他更好的 API?
跟进:几个月前我向 iText 提交了一个补丁(它现在已被接受并且是 HEAD 的一部分),它为 iText 添加了文本解析功能。PdfBox(下面提到)在阅读使用外部参照流而不是旧的外部参照表格式的新 PDF 时存在(有?)问题。
另一个非常擅长解析现有 PDF 文件的库是PdfBox , 它也可以用于修改现有 PDF。仅供参考 - 这是 Lucene 使用的文本解析器。
我还要提一下,iText确实有解析 PDF 文件的能力,只是它不擅长解析每一页上的文本内容。如果您正在考虑访问用于存储书签等的 PDF 更高级别的结构(字典等),并且您不介意在阅读 PDF 规范时弄脏您的手,您可以绝对做你所要求的(我们自己做了很多)。
PDF 规范很大,但大部分都是可读的,如果您要做的只是提取书签,您不必担心其中的大部分内容(针对实际页面内容和渲染)。
我只是提前警告你,你可能会对此感到失望。iText 并不是真的打算用作解析器。它确实更适合创建全新的PDF 文档,但您可以尝试一下。
首先,使用 iText,您将无法修改现有的 PDF 文档。但是,您可以做的是使用您想要的附加功能制作副本。(如果其他人知道得更好,请告诉我,这让我发疯。)
您要做的是从源文件的输入流创建一个 PdfReader 对象。然后为您的目标创建一个 PdfCopy 对象(它只是一个扩展的 PdfWriter,可以更方便地从现有源获取数据)。
据我所知,书签根本无法从 iText 获得。可能需要另一个库。我认为jpedal可能具有提取它们的能力(它可以将它们作为 XML 文档获取,然后您可能必须对其进行解析以获得所需的内容。)无论您得到它们,您都可以将它们添加到 java.util.List 中,并且将该列表设置为 PDFCopy 上的大纲。书签本身只是具有一组特定键的 HashMap。我不确定所有的值是什么,但它们包括“标题”、“动作”(这似乎是您指定这是一个命名目的地的地方,尽管我不知道该值是什么)和“URI”(如果这是一个外部链接,则使用它——我怀疑这将指定您链接到的命名目的地的名称)。同样,很难找到细节。
然后遍历阅读器的页面,将每个页面导入到 PdfCopy。 此页面可能会对您有所帮助。
对不起,我对你没有更多的帮助。祝你好运。
PS 如果其他人知道 (L)GPL 或 BSD 许可的更好工具,我很想听听。