gpt4 book ai didi

java - 如何使用 iText 解析未标记的 pdf 文件

转载 作者:行者123 更新时间:2023-12-03 02:37:41 26 4
gpt4 key购买 nike

我想用 iText 解析这个文件 ( http://www.bbm.ca/_documents/top_30_tv_programs_english/2011/nat01032011.pdf )。问题是它没有标记,所以我无法获取 XML 文件。我决定从中提取文本,我认为例如第一行将如下所示:

1\specialCharWJC:PLAYOFFS CANADA\specialCharTSN+\specialCharM.W....\specialChar19:30\specialChar21:57\specialChar5133

我为第一行提取的文本是

1 WJC:PLAYOFFS CANADA TSN+ M.W.... 19:30 21:57 5133

我使用以下方法提取文本:

PdfReader reader = new PdfReader(filename);
String str = PdfTextExtractor.getTextFromPage(reader, 1);

PDF 查看器如何知道加拿大位于第二列而不是第三列。

我当前的解决方案是使用http://www.idrsolutions.com/online-pdf-to-html5-converter/将pdf文件转换为html5谁可以确定每列的文本。

感谢您的回复

最佳答案

我编写了 iText 文本提取器。 iText 中有两种提取策略 - 一种是简单的(更多概念证明),只是在文本命中时转储文本。另一个(LocationTextExtractionStrategy)更加精致,它如何使用@Jongware建议的位置和字体信息构建字符串(它还考虑了所有坐标转换)。如果您像现在这样调用 getTextFromPage() ,则后者是默认策略。

第 20 行文本显示两次的原因是一些 PDF 制作者这样做是为了模拟粗体字形(他们稍微移动字符并重新渲染)。所以这确实不是一个错误,但肯定可能是一个改进的机会。如果我们检测到彼此位于某个缇区域内的相同内容 block ,我们可能可以做一些事情。我们还没有这样做的原因是,这可能非常棘手,因为您可能有一个 block 是整个单词,而另一组 block - 每个字母一个。我们有能力进行子 block 分析(事实上,这是在解析器接口(interface)中的某个地方公开的 - 无法立即记忆起来 - 如果您需要它,请告诉我,我会追踪它) - 但这会发生性能损失相当大,所以我不愿意这样做。

无论如何,我解决这个特定挑战的方法是设置物理区域并将区域过滤器传递到 LocationTextExtractionStrategy#getResultantText() 调用中。

如果您确实需要根据文本的水平位置插入制表符(或某些列标记),这是完全可行的 - 查看 LocationTextExtractionStrategy 源代码中调用 isChunkAtWordBoundary() 方法的位置并添加您自己的处理程序,用于在空格之外插入特殊字符。还可以进行某种上下文分析(即,注意有一堆 block 恰好共享相同的 X 位置和方向,并将该 X 位置指定为制表位)。

如果您提出了一个很好且通用的想法(即不特定于这个解析任务),请告诉我,我会看看如何将其合并到 iText 中。

关于java - 如何使用 iText 解析未标记的 pdf 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21355363/

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