这 ...
PDF 查看器如何知道加拿大在第二列而不是第三列。
是错误的问题——但“为什么”包含可能解决方案的提示。
这个问题是“错误的”,因为您的“PDF 查看器”不知道文本应该在第二列中。PDF 中没有“勺子”列:查看者得到的只是 (x,y) 位置列表和要在其上显示的文本。它所要做的就是将光标移动到 (x,y) 位置并绘制文本。看?不涉及列。也不是一个 [Tab] 字符(或任何其他类型的魔法\specialChar
,就此而言)。
一个愚蠢的、直接的文本转换器扫描输入文件中的文本运行并立即将它们写出。它可能会测试大于预期的 x 位置,并在必要时插入一个空格 - 事实上,iText 似乎这样做是因为检查您的文件显示在“1”和“WJC”之间没有存储“空格”字符:季后赛加拿大”。在相同的 y 位置上移动到更大的 x 位置,因此 iText 推断存在“某些东西”。
一种可能的解决方案是存储所有文本片段的所有 (x,y) 坐标,对它们进行排序,然后测试每个文本片段的结尾是否在下一个开头的合理距离内。(这也需要您检索字符宽度。)如果距离或多或少等于空格宽度,则可以输出“空格”。如果更多,您可以输出一个[Tab]。以下是执行此操作的简单 PDF 阅读器的输出:
1 WJC:PLAYOFFS CANADA TSN+ M.W.... 19:30 21:57 5133
2 WJC:PLYOFF CAN PSTGM TSN+ ..W.... 21:54 22:21 3558
3 BIG BANG THEORY CTV Total ...T... 20:00 20:31 3334
-- 为了清楚起见,我手动对齐了列,因为每列之间只有一个 [Tab]。您的文档很“简单”,因为每一列都包含一些文本。如果没有,它会稍微困难一些(但如果有必要,您可以创建一个可能的制表符位置列表,并针对它测试每个新的文本字符串)。
简而言之,您不能使用普通函数getTextFromPage
,您需要检索正确的 x 和 y 位置并进行处理。
令人惊讶的是:出于某种未知原因,这条线
20 LAW AND ORDER:SVU CTV Total W 21:00 23:00 1295
本文档在完全相同的位置包含两次。我没有预料到,所以在排序后,我在输出中得到了这个:
20<FONT ArialMT>20 LALAWW ANANDD ORDEORDER:SR:SVUVU CTCTVV TTotalotal ..WW.... 21:0021:00 23:0023:00 1295<FONT Arial-BoldMT>1295
更简单的解决方案
...将是手动创建“广播网点”列表。该列表具有相当可预测的格式:([digits] [Title] [Outlet] ..
等),并且只有 Title 和 Outlet 不遵循特定模式。在这个列表中,我只计算了 4 家不同的广播公司。解析剩余的“列”应该很简单。