java - 两行字母互换,Adobe Reader 可以完成这项工作

标签 java pdfbox

我有一个关于 pdfbox 1.8.13 的问题。我正在尝试阅读一页 PDF 文档中的整个文本。 Adobe Reader 可以完成这项工作,pdfbox 几乎可以读取整个页面,但会打乱文档的前两行和最后两行,以便互换字母。

有人知道如何解决这个问题吗?首先,在哪里问,第二,我如何与你分享PDF,第三,有人可以检查一下这个问题是否也存在于pdfbox 2.0.7版本中,我的理解是完全不同的,因此并不简单实现?

预先感谢您的帮助 斯蒂芬

Adobe Reader:

ScalableCapitalHRB217778,AmtsgerichtMünchenSeite1von1 
VermögensverwaltungGmbHUSt-IdNr.DE300434774 
Prinzregentenstr. 
48Geschäftsführung:80538München 
ErikPodzuweit,FlorianPrucker 

pdf 盒:

SVecramlaöbgleenCsavpeitrawlaltung GmbH UHSRtB-I2d1N7r7.7D8E,3A0m0t4s3g4e7ri7c4ht München Seite 1 von 1
8P0ri5n3zr8egMeünntcehnesntr. 48 GEreikscPhoädftzsufwüheritu,nFglo: rian Prucker

PDF链接(我已验证问题与我上传的未修改和修改后的PDF相同):

https://wetransfer.com/downloads/5930649bce9a1d1a686a0da63f1b9bce20170808071518/9b9140

P.S.:同时,我也尝试了 pdfbox 1.8.13 中的 PDDocument.loadNonSeq 版本,但这导致了同样的问题。

最佳答案

感谢@tilman-hausherr 提供的有用提示。与他们一起,我成功地解决了我的问题。

您是对的,即使在 pdfbox-1.8.13 中,省略排序选项(我不知道为什么之前在我现在从事的项目中使用它)也解决了加扰问题。您是对的,使用 pdfbox-2.0.7 的文本提取结果给出了更好的结果。

我在 pdfbox-1.8.13 中使用的相关 Java 代码片段是:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;
...
PDDocument doc = PDDocument.load(file);
PDFTextStripper textStripper = new PDFTextStripper();
textStripper.setSortByPosition(true);
String text = textStripper.getText(doc);

如果我理解正确的话,从pdfbox-1.8.13pdfbox-2.0.7的简单文本提取API并不相同,但非常相似, PDFTextStripper 刚刚从 util 移至 text:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
...
PDDocument doc = PDDocument.load(file);
PDFTextStripper textStripper = new PDFTextStripper();
// textStripper.setSortByPosition(true);
String text = textStripper.getText(doc);

要了解所有这些,正如您所说,命令行工具非常有用,以下是使用不同选项( https://pdfbox.apache.org/1.8/commandline.htmlhttps://pdfbox.apache.org/2.0/commandline.html )提取文本的结果:

java -jar pdfbox-app-1.8.13.jar ExtractText -sort“20170801 Rechnung.pdf”:

SVecramlaöbgleenCsavpeitrawl HRBPrinzregentenstra.l4tu8ng GmbH GUSest-I
2d1N7r7.7D8E,3A0m0t4s3g4e7ri7c4ht München Seite 1 von 1
80538 München ErikcPhoädftzsufwüheritu,nFglo: rian Prucker

java -jar pdfbox-app-1.8.13.jar ExtractText“20170801 Rechnung.pdf”:

Scalable CapitalVermögensverwaltung GmbHPrinzregentenstr. 4880538 München
HRB 217778, Amtsgericht MünchenUSt-IdNr. DE300434774Geschäftsführung:Erik 
Podzuweit, Florian Prucker
Seite 1 von 1

java -jar pdfbox-app-2.0.7.jar ExtractText -sort“20170801 Rechnung.pdf”:

Scalable Capital HRB 217778, Amtsgericht München Seite 1 von 1
Vermögensverwaltung GmbH USt-IdNr. DE300434774
Prinzregentenstr. 48 Geschäftsführung:
80538 München Erik Podzuweit, Florian Prucker

java -jar pdfbox-app-2.0.7.jar ExtractText“20170801 Rechnung.pdf”

Scalable Capital
Vermögensverwaltung GmbH
Prinzregentenstr. 48
80538 München
HRB 217778, Amtsgericht München
USt-IdNr. DE300434774
Geschäftsführung:
Erik Podzuweit, Florian Prucker
Seite 1 von 1

所以我认为 pdfbox-2.0.7 在这种情况下给出了最好的结果,特别是没有 -sort 选项,即使我不知道为什么算法行为有所不同,因为 pdfbox-1.8.3 在使用或不使用 -nonSeq 选项时都会给出相同的结果。

关于java - 两行字母互换,Adobe Reader 可以完成这项工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45560748/

相关文章:

java - 在java中提取PDF的页脚数据

java - 无法使用 CAdES 方法签署 PDF,尽管使用 PAdES 签署成功

java - PDFBox 2.0.3 - 从 PrintImageLocations.java 返回的图像坐标不符合预期

java - 使用二进制搜索从排序的 int[] 中删除重复项

Java如何扩展隐藏类

java - 在 Apache Camel 中从 Json 检索对象

java - 静态最终字段的同步 getter

java - 我正在尝试在 IBM Domino 服务器上使用 PDFbox,得到 NoClassDefFoundError

java - 用于 MS SQL Server 的 Eclipse 中 Tomcat 的连接池

java - 有没有办法使用 pdfbox 从现有 pdf 中读取页眉、页脚、带水印的图像/文本?