7

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

4

1 回答 1

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

你会得到类似的东西:

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 、 和 all return )之后,我使用 xpdf 3.02 版获得XRef::okToPrint()了很好的XRef::okToChange()结果。那是处理锁定的文档,而不是加密的文档(还有其他实用程序)。XRef::okToCopy()XRef::okToAddNotes()gTrue

于 2012-10-12T18:25:29.417 回答