解析PDF删除月份

Posted

技术标签:

【中文标题】解析PDF删除月份【英文标题】:Parsing PDF removing month 【发布时间】:2015-07-21 02:23:29 【问题描述】:

我通过拆分行然后搜索它们来解析包含一些日期的 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 吗?我错过了什么吗?

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

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

【问题讨论】:

您出错的第一个地方是认为您可以(以一般方式)像您正在做的那样编辑 PDF 文件。 PDF 文件在很大程度上取决于许多因素,其中最重要的是从一个部分到另一个部分的字节偏移量。它不是一种可编辑的格式,让您可以随心所欲地做自己想做的事情并认为它会起作用。 @KevinBrown OP 可能不打算编辑 PDF 文件,而只是从中提取信息。 @KevinBrown 是的,sawa 是这么说的。我不是在编辑,只是在解析。 请分享有问题的PDF进行分析。 哦,确实,他做到了。好的,我已经查看了 PDF。缺失部分的表示并没有什么特别之处,有(02/05/2015) Tj(CA 3491819) Tj绘制它们的操作,没什么花哨的。唯一特别的是,这些字符串被绘制得比前面的相应标签略高。可能这就是为什么 pdf 阅读器不认为它们与标签在同一行的原因,而对于后面的字符,离标签更远,这种高度差异不被认为是问题 【参考方案1】:

问题出现在多段文本位于同一行但未完全使用同一基线的位置。如果手头有 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 就足够了。

【讨论】:

以上是关于解析PDF删除月份的主要内容,如果未能解决你的问题,请参考以下文章

Android:使用语言环境解析月份

月份是英文的日期解析

[月份维度]日志数据提取包含关键词的事件,解析落入的月份计数,matplotlib绘制统计图,python

[月份维度]日志数据提取包含关键词的事件,解析落入的月份计数,matplotlib绘制统计图,python

PDF解析

pdf解析与结构化提取