gpt4 book ai didi

java - 如何在 PDFTextStripperByArea 中定义区域?

转载 作者:行者123 更新时间:2023-12-01 13:03:31 25 4
gpt4 key购买 nike

我正在使用 PDFBox 从 PDF 文件中提取文本。我面临的一个问题是:PDFBox 将主要内容与我想忽略的 PDF 页脚/页眉部分混合在一起。

我被告知以下代码会有帮助:

Rectangle rec = new Rectangle();
# init rec...
PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.addRegion("cropbox", rec);
stripper.setSortByPosition(true);

有人能告诉我 stripper.setSortByPosition(true) 到底是什么意思吗?我阅读了文档,但仍然很困惑:

当我使用上面的代码从 PDF 文件中提取文本时,出现以下错误:

Exception in thread "main" java.lang.IllegalArgumentException:
Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:747)
at java.util.TimSort.mergeAt(TimSort.java:483)
at java.util.TimSort.mergeCollapse(TimSort.java:408)
at java.util.TimSort.sort(TimSort.java:214)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)
at org.apache.pdfbox.util.PDFTextStripper.writePage(PDFTextStripper.java:565)
at org.apache.pdfbox.util.PDFTextStripperByArea.writePage(PDFTextStripperByArea.java:190)
at org.apache.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.java:457)
at org.apache.pdfbox.util.PDFTextStripperByArea.extractRegions(PDFTextStripperByArea.java:153)

有人可以帮我解决这个问题吗?

PS:供您引用,这里是setSortByPosition的文档:

PDF 文件中文本标记的顺序可能与屏幕上显示的顺序不同。例如,PDF 编写者可能会按字体写出所有文本,因此所有粗体或较大的文本,然后进行第二遍并写出普通文本。

默认不按位置排序。

PDF 编写者可以选择以不同的顺序编写每个字符。默认情况下,由于性能原因,PDFBox 在处理文本标记之前不会对其进行排序。

PPS:@Tilman Hausherr:这是一个已知问题:-(

请参阅:issues.apache.org/jira/browse/PDFBOX-1512

更新:避免这些异常的一种可能方法[1]是:

System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");

[1] https://issues.apache.org/jira/browse/PDFBOX-1512?focusedCommentId=13937402&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13937402

最佳答案

我查看了源代码,发现他们的 TextPositionComparator (Comparator 用于对文本位置进行排序)似乎违反了契约(Contract)。 (TimSort [java 7+] 在这种情况下可能会抛出异常;PDFBox 似乎仍然与 java 4 兼容,并且他们计划更新到 java 6 版本 2.0,因此它们可能不是最新的...)

您最好将该错误告知开发人员 ( PDFBox )。但是您可以下载源代码并自行更改比较器。我很确定错误位于 TextPositionComparator 的第 63 行(修订版 1575836) .

它们允许 y 值存在一定的公差。您可以提出违反 Comparator 接口(interface)契约的一部分的 TextPositions:

实现者还必须确保关系是可传递的:((compare(x, y)>0) && (compare(y, z)>0)) 意味着compare(x, z)>0。

要显示可能违反条件:选择 TextPosition.getYDirAdj() (posYBottom) 为 0、0.05 和 0.11,并确保行中的条件64、65 是错误的,您可以通过正确选择 x 位置来选择 3 个比较结果中的 1 个。

关于java - 如何在 PDFTextStripperByArea 中定义区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23377520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com