我想编写一些带有PDF文档的(java)代码,并从所有书签创建命名目标。我认为iText API是最简单的方法,但我之前从未使用过API。
您如何使用iText API编写此类代码? iText可以自己进行操作现有PDF所需的解析吗?我正在考虑的那种操作是:
或者是否有更好的API?
答案 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许可,我很乐意听到它。