1
  1. 我使用 pdfbox 从 pdf 中提取一些信息,但是如何提取每个对象的信息?如果其中之一包含流,我如何解码流以显示?

  2. 我可以从 pdf 框中获得最大字体大小吗?我想如果我可以得到每个对象的字体大小并对它们进行排序,那么我会得到具有最大字体大小的对象?

4

1 回答 1

3

我使用 pdfbox 提取 pdf 的一些信息。但是如何提取每个对象的信息。如果其中一个包含流,我如何解码流以显示。

如果每个对象是指作为页面内容的一部分绘制的所有内容,则这些对象包含在页面内容流和引用的 Xobject 流中。PDFStreamEngine您可以使用从该类派生的解析器来解析这些流。

该类已经完成了大部分繁重的工作,例如从流中检索单个操作、管理图形状态堆栈等。但是,您必须为绘制您感兴趣的对象的操作提供一些回调。

要了解如何正确扩展该类,请查看 PDFBox 提供的一些子类,例如PDFTextStripperPDFMarkedContentExtractorPageDrawer

我可以从 pdf 框中获得最大字体大小吗?我想如果我能得到每个对象的字体大小并对它们进行排序,那么我会得到具有最大字体大小的对象?

实际上,您可以使用上述PDFTextStripper或更准确地说,您可以使用从它派生的类。文本剥离器原样主要返回纯文本,但您可以覆盖其某些方法并获取带有附加信息的文本。

例如,您可以覆盖writeString(String text, List<TextPosition> textPositions). 它的标准实现只使用text, 即提取的纯文本,但您可以检查textPositions, 即带有额外信息的文本,其中包括位置和大小。

这个答案显示了如何覆盖PDFTextStripper.writeString获取访问字体名称。同样,您可以访问字体大小。请注意,有两种TextPosition方法可以做到这一点,getFontSizegetFontSizeInPt,您实际上可能还需要另一种尺寸。

编辑

在评论中,OP问

我怎样才能开始使用 PDFSteamEngine???

如上所述,看看 PDFBox 提供的一些子类。最突出的肯定是PDFTextStripper.

最简单的PDFTextStripper用法如下所示:

PDFTextStripper stripper = new PDFTextStripper();
stripper.setSortByPosition(true);

PDDocument document = PDDocument.load(PDF_DOCUMENT);
String text = stripper.getText(document);
document.close();

这仅提取文档的纯文本。对于更专业的任务,请查看以下示例用法:

PDFStreamEngine和其他子类的更多使用示例:

如何从 PDF 中获取文本位置???

正如我原来的回答中提到的,使用 aPDFTextStripperoverride writeString(String text, List<TextPosition> textPositions)。它的标准实现只使用text, 即提取的纯文本,但您可以检查textPositions, 即带有额外信息的文本,其中包括位置和大小。

于 2015-03-23T10:54:04.880 回答