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

Sur*_*han 6 java pdfbox

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

Pie*_*e D 3

看一眼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
Run Code Online (Sandbox Code Playgroud)

你会得到类似的东西:

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
...
Run Code Online (Sandbox Code Playgroud)

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

对于问题的第二部分,在修复 Xref.cc ( make XRef::okToPrint()XRef::okToChange()XRef::okToCopy()all XRef::okToAddNotes()return gTrue)后,我使用 xpdf 版本 3.02 获得了良好的结果。这是为了处理锁定的文档,而不是加密的文档(还有其他实用程序可以实现这一点)。