我正在做一个java程序来读取加密的PDF文件,并逐页提取文件的内容,包括文本,图像和它们在文件中的位置(x,y坐标)。现在,我使用PDFBox实现此目的,并获取文本和图像。但是我不能得到文本位置和图像位置。也有一些问题,读取一些加密的PDF文件。
发布于 2012-10-13 02:25:29
看看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 (使XRef::okToPrint()、XRef::okToChange()、XRef::okToCopy()和XRef::okToAddNotes()都返回gTrue)之后,我使用xpdf3.02版得到了很好的结果。这是为了处理锁定的文档,而不是加密的文档(有其他实用程序可以做到这一点)。
https://stackoverflow.com/questions/7581281
复制相似问题