我使用 pdfbox 提取 pdf 的一些信息。但是如何提取每个对象的信息。如果其中一个包含流,我如何解码流以显示。
如果每个对象是指作为页面内容的一部分绘制的所有内容,则这些对象包含在页面内容流和引用的 Xobject 流中。您可以使用派生自PDFStreamEngine 类的解析器来解析这些流。
该类已经完成了大部分繁重的工作,例如从流中检索单个操作、管理图形状态堆栈等。不过,对于绘制您感兴趣的对象的操作,您必须提供一些回调。
要了解如何正确扩展该类,请查看 PDFBox 提供的一些子类,例如PDFTextStripper、PDFMarkedContentExtractor 或 PageDrawer。
我可以从 pdf 框中获取 最大字体大小 吗?我想如果我可以获取每个对象的字体大小并对其进行排序,那么我会得到具有最大字体大小的对象?
确实,您可以使用上述PDFTextStripper 或更准确地说,您可以使用从它派生的类。文本剥离器原样主要返回纯文本,但您可以覆盖其某些方法并获取带有附加信息的文本。
例如你可以覆盖writeString(String text, List<TextPosition> textPositions)。它的标准实现只使用text,即提取的纯文本,但您可以检查textPositions,即具有额外信息的文本,其中包括位置和大小。
This answer 显示如何覆盖 PDFTextStripper.writeString 获取字体名称的访问权限。同样,您可以访问字体大小。请注意,有两种TextPosition 方法,getFontSize 和getFontSizeInPt,您实际上可能还需要另一种尺寸。
编辑
在评论中,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 中获取文本位置???
正如我原来的回答中提到的,使用PDFTextStripper 和覆盖writeString(String text, List<TextPosition> textPositions)。它的标准实现只使用text,即提取的纯文本,但您可以检查textPositions,即具有额外信息的文本,其中包括位置和大小。