我使用pdfbox提取来获取pdf中的一些信息,但是如何提取每个对象信息?如果其中一个包含流,我该如何解码要显示的流?
我可以从pdf框中获取最大字体大小吗?我想如果我能得到每个对象的字体并对它们进行排序,那么我得到的对象具有最大的字体大小?
答案 0 :(得分:3)
我使用pdfbox提取pdf的一些信息。但是如何提取每个对象的信息。如果其中一个包含流,我该如何解码要显示的流。
如果通过每个对象表示作为页面内容的一部分绘制的所有内容,则这些对象包含在页面内容流和引用的Xobject流中。您可以使用派生自PDFStreamEngine
类的解析器来解析这些流。
该类已经完成了大部分繁重工作,例如从流中检索单个操作,管理一堆图形状态等。但是,对于绘制您感兴趣的对象的操作,您将不得不提供一些回调。
要了解如何正确扩展该类,请查看PDFBox提供的一些子类,例如: PDFTextStripper
,PDFMarkedContentExtractor
或PageDrawer
。
我可以从pdf框中获取最大字体大小吗?我想如果我能得到每个对象的字体并对它们进行排序,那么我得到的字体大小最大的对象?
的确,您可以使用上面提到的PDFTextStripper
或更多,您可以使用从中派生的类。文本剥离器主要返回纯文本,但您可以覆盖其某些方法并获取带有其他信息的文本。
E.g。你可以覆盖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
和其他子类的更多用法示例:
PDFStreamEngine
直接获取图像位置的x / y坐标的PDFBox示例PageDrawer
如何从PDF获取Textposition?
正如我原来的回答所述,请使用PDFTextStripper
和覆盖writeString(String text, List<TextPosition> textPositions)
。它的标准实现仅使用text
,即提取的纯文本,但您可以检查textPositions
,即带有额外信息的文本,其中包括位置和大小。