代码之家  ›  专栏  ›  技术社区  ›  Ash

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

  •  7
  • Ash  · 技术社区  · 16 年前

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

    如何使用ITextAPI编写这种代码?IText是否可以自己进行操作现有PDF所需的解析?我想到的操纵方式是:

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

    还是有其他更好的API?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Ian McLaird    16 年前

    我只是事先警告你,你可能对此感到失望。IText并不是真正打算用作解析器。它更适合创造 完全新的 PDF文档,但你可以随便看看。

    首先,使用IText,您将无法修改现有的PDF文档。你什么 可以 不过,要做的是用您想要的附加功能制作一个副本。(如果有人更了解, 拜托 让我知道,这让我发疯。)

    您将要做的是从源文件的输入流创建一个pdfrider对象。然后为您的目的地创建一个pdfcopy对象(它只是一个扩展的pdfwritter,使从现有源获取数据更加方便)。

    据我所知,书签根本无法从IText获取。可能需要另一个图书馆。我想 jpedal 可能具有提取它们的能力(它可以将它们作为XML文档获取,然后您可能需要对其进行解析以获得所需的内容)。但是,您可以将它们添加到java.util.list中,并将该列表设置为pdfcopy上的大纲。书签本身就是带有一组特定键的哈希图。我不确定所有的值都是什么,但它们包括“标题”、“操作”(似乎是您指定这是一个命名目标的位置,尽管我不知道该值是什么)和“uri”(如果这是一个外部链接,则使用这个值--我怀疑这将指定您链接到的命名目标的名称)。同样,这些细节也很难找到。

    然后迭代读卡器的页面,将每个页面导入到pdfcopy。 this page 也许会帮助你。

    对不起,我对你没什么帮助。祝你好运。

    另外,如果有人知道更好的工具是GPL或BSD许可的,我很想听听。

        2
  •  5
  •   Kevin Day    16 年前

    接下来:几个月前我向IText提交了一个补丁(它现在已经被接受,是head的一部分),它为IText添加了文本解析功能。PDFBOX(以下提到)已经(有?)读取使用外部参照流而不是旧的外部参照表格式的较新PDF时出现问题。


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

    我还要提一下 有能力解析一个PDF文件,它只是不擅长解析每个页面上的文本内容。如果要访问用于存储书签等的PDF高级结构(字典等…)。你不介意在阅读PDF规范时弄脏你的手,你完全可以按照你的要求去做(我们自己做了很多)。

    这个 PDF Spec 很大,但大部分内容都是可读的,如果您只想提取书签,那么您不必担心其中的大部分内容(面向实际页面内容和呈现)。