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

Letters from two lines are interchanged, Adobe Reader can do the job

我有一个关于 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 

pdfbox:

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

Link到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.html and https://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 选项给出相同的结果。