2008-10-06 107 views
6

我想编写一些需要PDF文档的(java)代码,并从所有书签中创建指定的目标。我认为iText API是这样做的最简单的方法,但我从未使用过API。使用iText API为PDF文件中的所有书签创建目的地

你将如何去写这种iText API的代码? iText可以自己处理现有的PDF文件吗?那种操作我想到的是:

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

或者是否有不同的API会更好?

回答

3

我只是提醒你,你可能会对此感到失望。 iText并非真正用作解析器。对于创建全新的 PDF文档来说更是如此,但是您可以轻松一下。

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

你想要做的是从源文件的输入流创建一个PdfReader对象。然后创建一个PdfCopy对象(这只是一个扩展的PdfWriter,它可以使来自现有源的数据更方便)用于目标。

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

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

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

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

+0

谢谢,这给了我足够的前进。 – 2008-10-06 22:57:47

5

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


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

我还会提到iText 确实有能力解析一个PDF文件,它在解析每个页面上的文本内容时不是很好。如果您正在查看用于存储书签等的PDF高级构造(字典等),并且您不介意在阅读PDF规范时弄脏手,您可以绝对做你在问什么(我们自己做了很多)。

PDF Spec很大,但大部分都可读,并且如果您只想提取书签,那么您不必担心其大部分内容(面向实际页面内容和渲染) 。