使用PDFBox读取文本和图像位置(x.y坐标)

时间:2011-09-28 09:47:03

标签: java pdfbox

我正在做一个java程序来读取加密的PDF文件并逐页提取文件的内容,包括文件中的文本,图像及其位置(x,y坐标)。现在我正在使用PDFBox,我正在获取文本和图像。但我无法得到文字位置和图像位置。读取一些加密的PDF文件也存在一些问题。

1 个答案:

答案 0 :(得分:2)

看看org.apache.pdfbox.examples.util.PrintTextLocations。我已经使用了很多,对PDF文档中元素和边界框的布局进行分析非常有帮助。它还显示了用白色墨水打印的项目,或者在可打印区域之外(可能是文档水印,或作者推出的“遗忘”项目)。

用法示例:

java -cp app/target/pdfbox-app-1.5.0.jar org.apache.pdfbox.examples.util.PrintTextLocations ~/tmp/mydoc.pdf >~/tmp/out-text-locations.txt

你会得到类似的东西:

Processing page: 0
String[53.9,59.856995 fs=-6.0 xscale=6.0 height=-3.666 space=1.3320001 width=4.6679993]A
String[58.568,59.856995 fs=-6.0 xscale=6.0 height=-3.666 space=1.3320001 width=2.6640015]f
String[61.232002,59.856995 fs=-6.0 xscale=6.0 height=-3.666 space=1.3320001 width=1.6679993]e
...

您可以轻松地解析并使用每个页面绘制元素的位置,边界框和“流程”(通过所有元素的轨迹)等。我相信您已经知道,您会发现PDF几乎不可能转换为文本。它实际上只是一种图形描述格式(即用于打印机或屏幕),而不是标记语言。您可以轻松地制作一个打印“Hello world”的PDF,但是它会随机跳过字符位置(如果您愿意,它会使用与任何ISO字符编码不同的字形),这使得PDF很难转换为文本。没有“单词”或“段落”的概念。例如,两列文档可能是解析文本的噩梦。

对于问题的第二部分,在修复Xref.cc(make XRef::okToPrint()XRef::okToChange()XRef::okToCopy()XRef::okToAddNotes()后,使用xpdf 3.02版获得了良好的效果全部返回gTrue)。这是为了处理锁定的文件,而不是加密的文件(还有其他的工具)。