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

标签 java pdfbox

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

最佳答案

看看 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 后使用 xpdf 3.02 版取得了不错的结果(make XRef::okToPrint(),XRef::okToChange() XRef::okToCopy()XRef::okToAddNotes() 都返回 gTrue)。那是为了处理锁定的文档,而不是加密的文档(为此还有其他实用程序)。

关于java - 使用 PDFBox 读取文本和图像位置(x.y 坐标),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7581281/

相关文章:

java - 创建随机值的最佳方法是什么?

java - 将 BufferedImage 添加到 PDFBox 2.0 文档

c# - 使用 PDFBox 填写 PDF 表单

java - 新手数组问题

java - Class.getResource() 和 ClassLoader.getResource() 有什么区别?

java - Producer#initTransactions 不适用于 KafkaContainer

java - PDFBox - 仅复制页面资源而不是复制文档的所有资源

java - 如何验证数千个 PDF 文件中的文本/内容

java - 特殊字符未正确从 pdf 转换为文本

java - gradle 中的多模块项目编译失败