解析PDF去除月份
Parsing PDF removing month
我正在通过拆分行然后搜索来解析具有一些日期的 pdf。以下是示例行:
Posted Date: 02/11/2015
Effective Date: 02/05/2015
当我找到 Posted Date
时,我在 :
上拆分并拉出 02/11/2015
。但是当我对 effective date
做同样的事情时,它只会 returns /05/2015
。当我写下所有行时,它将该日期显示为 /05/2015
,而 PDF 具有 02
。 02
会因为某种原因转换为 nil
吗?我错过了什么吗?
lines = reader.pages[0].text.split(/\r?\n/)
lines.each_with_index do |line, index|
values_to_insert = []
if line.include? "Legal Name:"
name_line = line.split(":")
values_to_insert.push(name_line[1])
end
if line.include? "Active/Pending Insurance"
topLine = lines[index+2].split(" ")
middleLine = lines[index+5].split(" ")
insuranceLine = lines[index + 7]
insurance_line_split = insuranceLine.split(" ")
insurance_line_split.each_with_index do |word, i|
if word.include? "Insurance"
values_to_insert.push(insuranceLine.split(":")[1])
end
end
topLine.each_with_index do |word, i|
if word.include? "Posted"
values_to_insert.push(topLine[i + 2])
end
end
middleLine.each_with_index do |word, i|
if word.include? "Effective" or word.include? "Cancellation"
#puts middleLine[0]
puts middleLine[1]
#puts middleLine[i + 1].split(":")[1]
end
end
end
end
这是我打印所有行时发生的情况:
Active/Pending Insurance:
Form: 91X Type: BIPD/Primary Posted Date: 02/11
/2015
Policy/Surety Number:A 3491819 Coverage From: [=12=]
To: ,000,000
Effective Date:/05/2015 Cancellation Date:
Insurance Carrier: PROGRESSIVE EXPRESS INSURANCE COMPANY
Attn: CUSTOMER SERVICE
Address: P. O. BOX 94739
CLEVELAND, OH 44101 US
Telephone: (800) 444 - 4487 Fax: (440) 603 - 4555
编辑以显示代码甚至添加图片。我按行拆分,然后再按冒号拆分,有时按空格拆分。它不是非常干净,但我认为没有更好的方法。
问题发生在多段文本在同一行但不使用完全相同基线的位置。如果是手头的 PDF,
(至少)保单编号和生效日期的位置略高于各自的标签。
原因在于 OP 使用的 pdf-reader library 将页面上绘制的文本片段组合在一起的方式:
- 确定排列字母的列数和行数
- 创建一个由行数为 space 的列数填充的字符串组成的数组。
- 然后它会在完全相同的基线上合并 PDF 中的连续文本片段,并且
- 最终将这些组合的文本片段放入字符串数组中,从与它们在 PDF 中的起始位置最匹配的位置开始。
由于 PDF 中使用的字体通常不是单声道spaced,此过程可能会导致字符串重叠,即擦除两者之一。在同一基线上合并字符串的步骤在这种情况下可防止擦除,但对于略微不同的基线上的字符串,这种重叠效果仍然会发生。
可以做的是增加此处使用的列数。
page_layout.rb 中的库定义了
def col_count
@col_count ||= ((@page_width / @mean_glyph_width) * 1.05).floor
end
如您所见,已经使用了一些 幻数 1.05
来稍微增加列数。通过更多地增加这个数字,OP 观察到的擦除不会再发生。但是,不应将因子增加太多,因为这会引入不需要的 space 字符,而 none 属于该字符。
OP 报告说,将幻数增加到 1.10
就足够了。
我正在通过拆分行然后搜索来解析具有一些日期的 pdf。以下是示例行:
Posted Date: 02/11/2015
Effective Date: 02/05/2015
当我找到 Posted Date
时,我在 :
上拆分并拉出 02/11/2015
。但是当我对 effective date
做同样的事情时,它只会 returns /05/2015
。当我写下所有行时,它将该日期显示为 /05/2015
,而 PDF 具有 02
。 02
会因为某种原因转换为 nil
吗?我错过了什么吗?
lines = reader.pages[0].text.split(/\r?\n/)
lines.each_with_index do |line, index|
values_to_insert = []
if line.include? "Legal Name:"
name_line = line.split(":")
values_to_insert.push(name_line[1])
end
if line.include? "Active/Pending Insurance"
topLine = lines[index+2].split(" ")
middleLine = lines[index+5].split(" ")
insuranceLine = lines[index + 7]
insurance_line_split = insuranceLine.split(" ")
insurance_line_split.each_with_index do |word, i|
if word.include? "Insurance"
values_to_insert.push(insuranceLine.split(":")[1])
end
end
topLine.each_with_index do |word, i|
if word.include? "Posted"
values_to_insert.push(topLine[i + 2])
end
end
middleLine.each_with_index do |word, i|
if word.include? "Effective" or word.include? "Cancellation"
#puts middleLine[0]
puts middleLine[1]
#puts middleLine[i + 1].split(":")[1]
end
end
end
end
这是我打印所有行时发生的情况:
Active/Pending Insurance:
Form: 91X Type: BIPD/Primary Posted Date: 02/11
/2015
Policy/Surety Number:A 3491819 Coverage From: [=12=]
To: ,000,000
Effective Date:/05/2015 Cancellation Date:
Insurance Carrier: PROGRESSIVE EXPRESS INSURANCE COMPANY
Attn: CUSTOMER SERVICE
Address: P. O. BOX 94739
CLEVELAND, OH 44101 US
Telephone: (800) 444 - 4487 Fax: (440) 603 - 4555
编辑以显示代码甚至添加图片。我按行拆分,然后再按冒号拆分,有时按空格拆分。它不是非常干净,但我认为没有更好的方法。
问题发生在多段文本在同一行但不使用完全相同基线的位置。如果是手头的 PDF,
(至少)保单编号和生效日期的位置略高于各自的标签。
原因在于 OP 使用的 pdf-reader library 将页面上绘制的文本片段组合在一起的方式:
- 确定排列字母的列数和行数
- 创建一个由行数为 space 的列数填充的字符串组成的数组。
- 然后它会在完全相同的基线上合并 PDF 中的连续文本片段,并且
- 最终将这些组合的文本片段放入字符串数组中,从与它们在 PDF 中的起始位置最匹配的位置开始。
由于 PDF 中使用的字体通常不是单声道spaced,此过程可能会导致字符串重叠,即擦除两者之一。在同一基线上合并字符串的步骤在这种情况下可防止擦除,但对于略微不同的基线上的字符串,这种重叠效果仍然会发生。
可以做的是增加此处使用的列数。
page_layout.rb 中的库定义了
def col_count
@col_count ||= ((@page_width / @mean_glyph_width) * 1.05).floor
end
如您所见,已经使用了一些 幻数 1.05
来稍微增加列数。通过更多地增加这个数字,OP 观察到的擦除不会再发生。但是,不应将因子增加太多,因为这会引入不需要的 space 字符,而 none 属于该字符。
OP 报告说,将幻数增加到 1.10
就足够了。