我有两个PDF文件,我必须用iTextSharp解析(因为我们没有源数据,用于构建该PDF)。
我能够在C#中构建解析过程,逐行解析第一个PDF。相同的程序应该适用于第二个文件,但不幸的是它没有,因为第二个PDF中的行顺序完全被破坏,它与视觉结构不同。
奇怪的是,不仅iTextSharp正在解释第二个文件,甚至Acrobat Reader DC的文本选择工具也无法选择具有正确行顺序的信息(当我开始选择行时,某些文本仍未被选中并获得在使用插入符号到达下几行之后突出显示。
第1版PDF中的文字选择(在Acrobat Reader DC中)
第二个PDF中的文本选择(在Acrobat Reader DC中)
基本上每条信息(一个单词或一个短语)都放在它自己的行(!)上。有些单词/短语实际上是在页面底部读取的,而它们显然是靠近顶部等等
如何正确修复/阅读第二张PDF?任何想法该文件发生了什么?
更新
添加两个PDF文件的链接
答案 0 :(得分:1)
PDF本身不知道“行”或“段落”等。
如果您有结构化PDF,则可以使用该结构来确定属于哪些内容。
如果没有,您将必须读出文本片段的边界框并使用一些启发式方法来确定属于哪些内容。
答案 1 :(得分:1)
@Max已经回答了,
PDF本身不知道“行”或“段落”等。
特别是文本绘图说明在页面内容流中出现的顺序可以逐行排序,使文本提取和分析变得简单,但也可以是半随机,完全不直观的顺序。
我会稍微充实他的答案。
如果是PDF,您可以看到这两个选项的示例,“HUTTIG - ThermaTru JAN2016.pdf”第7页上的文本位按此顺序绘制
Glass & Caming Options Door Only Pricing Classic-Craft®
LE - Low - E A-Brass For Prehung Units see:
FXG-Fixed Grille C-Brushed Nickel Frame Adder and Options Pages
RG-Removable Grille D-Black Nickel Pricing Valid only when Prehung
SDL-Simulated Divide Lite
GBGF-Flat(W,B,A) Grille In Glass
GBGC-Cntr(W,B,A) Grille In Glass
W-Wrought Iron For Additional Options See Adder Page
?=Stock s=Rapid Ship
American Collection™
~~CCA210 ~~CCA210XC ~~CCA210XJ ~~CCA210XN ~~CCA210XR ~~CCA211
1 CCA210-LE CCA210XC CCA210XJ CCA210XN CCA210XR CCA211
Low-E Chord Chinchilla Granite Rainglass Homeward C D
2'8" x 6'8"
2'10" x 6'8"
3'0" x 6'8" $582.67 ? $865.22 ? $898.90 $898.90 $898.90 $923.30 ??
3'6" x 6'8"
Slab CANF3026L1L CANF3026DXC CANF3026DXJ CANF3026DXN CANF3026DXR CANF3026D1HW1C
Insert
Grille
~~CCA212 ~~CCA220 ~~CCA220XC ~~CCA220XJ ~~CCA220XN ~~CCA220XR
1 CCA212 CCA220-SDLLE CCA220XC-SDL CCA220XJ-SDL CCA220XN-SDL CCA220XR-SDL
Villager C D SDL Low-E SDL Chord SDL Chinchilla SDL Granite SDL Rainglass
2'8" x 6'8"
2'10" x 6'8"
3'0" x 6'8" $1,176.57 $641.72 ? $924.27 ? $957.94 $957.94 $957.94
3'6" x 6'8"
Slab CANF3026D1VG1C CANF3026L1L CANF3026DXC CANF3026DXJ CANF3026DXN CANF3026DXR
Insert
Grille CCALD2618V24 CCALD2618V24 CCALD2618V24 CCALD2618V24 CCALD2618V24
~~CCA221 ~~CCA222 ~~CCA230 ~~CCA230XC ~~CCA230XJ ~~CCA230XN
1 CCA221-SDL CCA222-SDL CCA230-SDLLE CCA230XC-SDL CCA230XJ-SDL CCA230XN-SDL
SDL Homeward C D SDL Villager C D SDL Low-E SDL Chord SDL Chinchilla SDL Granite
2'8" x 6'8"
2'10" x 6'8"
3'0" x 6'8" $1,042.37 ? $1,258.06 $701.26 ? $983.81 ? $1,017.48 $1,017.48
3'6" x 6'8"
Slab CANF3026D2HW1C CANF3026D2VG1C CANF3026L1L CANF3026DXC CANF3026DXJ CANF3026DXN
Insert
Grille CCALD2618V24 CCALD2618V24 CCALD2618V24 CCALD2618V24 CCALD2618V24 CCALD2618V24
March 2016 Confidential | Huttig Building Products | Prices Subject to Change Without Notice Page 7 of 814
如您所见,订单大致与我们阅读页面的顺序相同。
另一方面,“Huttig - 2017 Therma-Tru Catalog.pdf”第7页的文本位按此顺序绘制
Confidential | Prices Subject to Change Without Notice | Terms & Conditions: www.huttig.com/salesterms January 28,2017 Page 7 of 820
Glass & Caming Options Classic-Craft® Standard Single Unit Includes:
LE - LOW - E
FXG - Fixed Grille
RG - Removable Grille
SDL - Simulated Divide Lite
GBGF - Flat(W,B,A) Grille In Glass
GBGC - Cntr(W,B,A) Grille In Glass
W - Wrought Iron
SDLF1 - 1-1/8" SDL
SDLF2 - 3-1/2" SDL
A - Brass
C - Brushed Nickel
D - Black Nickel
XC - Chord
XJ - Chinchilla
XN - Granite
XR - Rainglass
XE - Satin Etch
For Prehung Units See:
Frame Adders and Options Pages
Pricing Valid only when Prehung
For Additional Options See Adder Page
= Rapid = Stock
American Collection™
Slab
Grille
Chinchilla
$940.38 $906.22
CANF3026DXC
$940.38
CANF3026DXN
$940.38
CANF3026DXR
$967.22
CANF3026D1HW1D
CCA212 CCA220-SDLLE CCA220XJ-SDL CCA220XC-SDL CCA220XN-SDL CCA220XR-SDL
Villager SDL Low-E SDL Chinchilla SDL Chord SDL Granite SDL Rainglass
$1,231.71 $672.46
CCALD2618V24
$1,002.35
CCALD2618V24
$968.19
CCALD2618V24
$1,002.35
CCALD2618V24
$1,002.35
CCALD2618V24
CCA221-SDL CCA222-SDL CCA230-SDLLE CCA230XJ-SDL CCA230XC-SDL CCA230XN-SDL
SDL Homeward SDL Villager SDL Low-E SDL Chinchilla SDL Chord
$1,090.68
CANF3026D2HW1D
$1,316.62 $734.44 $1,064.82 $1,030.66 $1,064.82
SDL Granite
CANF3026DXJ
CCA210-LE
Low-E
CCA210XJ CCA210XC CCA210XN CCA210XR CCA211
Chord Rainglass Homeward
CCALD2618V24 CCALD2618V24 CCALD2618V24 CCALD2618V24 CCALD2618V24 CCALD2618V24
CANF3026D2VG1D CANF3026L1L CANF3026DXJ CANF3026DXC CANF3026DXN
CANF3026DXR CANF3026DXN CANF3026DXC CANF3026DXJ CANF3026L1L CANF3026D1VG1D
C D
C D C D
Granite
CANF3026L1L
$610.00 3' 0" x 6'8"
3' 0" x 6'8"
3' 0" x 6'8"
Slab
Insert
Grille
Slab
Grille
Insert
Insert
C D
Available
Available
Available
正如您所看到的那样,第一张桌子的价格(最左边的610美元除外)很早就开始了,然后是其他牌桌的价格,然后是顶级的 CCA 和底部的 CANF 第一个表的标识符,然后是所有表的 C 和 D 列标题,然后是其他一些条目,然后是第一个表中缺少的$ 610价格,然后是所有表的行标题,最后出现三次“可用”,它们在页面上存在但不可见。
该文件发生了什么想法?
我可以推测。根据PDF的生产者属性,2016年目录直接从MS Excel 2010导出,而2017年目录由Ghostscript创建。此外,目录看起来相似但不同,足以假设2017年的目录不是从相同的源Excel文件创建的,而是可能使用完全不同的工具链,其任务是生成看起来类似于的东西目录,而不是看起来相同的内容,更不用说内部构建的内容了。
如何正确修复/阅读第二张PDF?
首先,没有什么可以修复的:对于通用PDF,不需要以任何特定顺序绘制文本。因此,第二个PDF没有被破坏(至少在这方面没有),因此无法修复。
要正确阅读和分析,你必须按@Max回答,
你必须读出文本片段的边界框并使用一些启发式方法来确定属于哪些内容。
很遗憾,您尚未发布(文字提取策略的关键部分)。如需更详细的帮助,请发布。
但是,考虑到你能够在C#中构建一个解析过程,它逐行解析第一个PDF 而不是第二个文件,因为第二个PDF中的行顺序是完全的它与视觉结构不同,我假设您的自定义文本提取策略基于SimpleTextExtractionStrategy
,因为它假定文本位按行逐行排列。最重要的是,它可能使用文本位坐标(至少 x 坐标)来确定文本位出现的列。
逐行假设并非总是如此,特别是2017年目录中的情况并非如此。因此,您应该基于LocationTextExtractionStartegy
代码重新实现您的策略,即首先收集页面中包含其相关坐标(边界框,基线,......)的所有文本位,然后对这些位进行排序(从上到下,从左到右),然后执行附加逻辑以识别列。