解析PDF删除月份

时间:2015-07-21 02:23:29

标签: ruby pdf pdf-reader

我通过拆分行然后搜索它来解析具有一些日期的pdf。以下是示例行:

Posted Date: 02/11/2015
Effective Date: 02/05/2015

当我找到Posted Date时,我会分开:并拉出02/11/2015。但是当我对effective date执行相同操作时,它只会返回/05/2015。当我编写所​​有行时,它会将该日期显示为/05/2015,而PDF具有0202会因某种原因转换为nil吗?我错过了什么吗? PDF part I'm parsing

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:                $0
To:       $1,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

编辑显示代码甚至添加图片。我按行拆分然后再在冒号和有时空格上拆分。它不是很干净,但我认为这不是一个更好的方法。

1 个答案:

答案 0 :(得分:4)

问题出现在多个文本位于同一行但不使用完全相同基线的位置。如果手头有PDF,

(至少)政策编号和生效日期的位置略高于各自的标签。

原因是OP使用pdf-reader library将页面上绘制的文本组合在一起的方式:

  • 确定用于排列字母和
  • 的列数和行数
  • 创建一个行数组,其中包含空格列数。
  • 然后它将PDF中的连续文本片段组合在完全相同的基线和
  • 最后将这些组合的文本片段放入字符串数组中,从最符合PDF原始位置的位置开始。

由于PDF中使用的字体通常不是等宽字符,因此该过程可能导致字符串重叠,即擦除两者中的一个。在同一基线上组合字符串的步骤可防止在这种情况下擦除,但对于略有不同的基线上的字符串,仍可能发生这种重叠效应。

可以做的是增加此处使用的列数。

page_layout.rb中的库定义了

def col_count
  @col_count ||= ((@page_width  / @mean_glyph_width) * 1.05).floor
end

如您所见,已经有一些幻数 1.05正在使用,以略微增加列数。通过进一步增加该数量,不再出现OP所观察到的擦除。但是,不应该过多地增加因子,因为这可能会引入不需要的空间字符。

OP报告说,在他的情况下,将幻数增加到1.10就足够了。