解析 PDF 以获取地址和日期之间的文本

parsing a pdf to get the text between address and date

提问人:snoozy 提问时间:5/25/2023 最后编辑:snoozy 更新时间:5/26/2023 访问量:80

问:

我想从解析pdf中获取一些信息(Rel类型)。现在的问题是文本卡在地址和日期之间的某个时间。我附上了pdf页面Example of a pdf page的图片。当我解析页面时,我得到了以下文本。

 Court Order -  01/30/2023    400 Block HANLON WAY\n                                                                                             Own\n                                                                                             Recognizance\n\n

如何获得rel_type = 法院命令 - 自己的认可 我已经尝试过这个正则表达式,但它只给了我完整的 rel 类型,它没有分成很多行

rel_typesmacthes = total_page.scan(/([MF])\s+(\d{2})\s+(\d{3})\s+([A-Z]{3}|t Specif t Spee)?\s+([A-Z]{3}|t Specif| t Spee)?\s+(.+)?(\d{1,2}\/\d{1,2}\/\d{2}\s+\d{1,2}:\d{2}\s+(?:am|pm))\s+(.+)?\s+(?:(\d{1,2}\/\d{1,2}\/2023))?/)

这是页面。Inspect 看起来像

                Name                                       BookDate Time                DateOfBirth              Booking #            Bail Amount

                    MARK,DEONTAE                                   1/28/23 9:40 am               02/25/1998              CC23NM711        $0 Race          Gen    Height   Weight    Hair  Eyes     Job Description    Arrest Date Time   Rel type       Release Date Arrest Location

BLACK           M      72       159     BLK    BRO                     1/28/23 8:26 am                                 800 Block VAQUEROS AVE RODEO   Arrest Type

     On View

        Charge                                     Charge Description
              148(A)(1) PC                         OBSTRUCT/ETC PUB OFCR/ETC

        Charge                                     Charge Description

              273.6(A) PC                          VIO ORD:PREVNT DOMES VIOL   Arrest Type

     Parole Hold

        Charge                                     Charge Description

              3000.08 PC                           VIOLATION OF PAROLE
        Charge                                     Charge Description

              AB109                                AB109 REALIGNMENT

                        Name                                       BookDate Time                DateOfBirth              Booking #        Bail Amount
                MENDOZA-FREGOZA,LIDIO                              1/28/23 3:25 pm               10/20/1989              CC23NM719        $0

Race          Gen    Height   Weight    Hair  Eyes     Job Description Arrest Date Time   Rel type       Release Date Arrest Location HISPANIC        M      67       175     BLK    BRO                     1/28/23 2:42 pm    Court Order -  01/30/2023    400 Block HANLON WAY
                                                                                             Own
                                                                                             Recognizance

  Arrest Type
     Bench Warrant

        Charge                                     Charge Description

              10851(A) VC                          VEHICLE THEFT

        Charge                                     Charge Description
              466 PC                               POSSESS BURGLARY TOOLS

        Charge                                     Charge Description

              496D(A) PC                           POSS STOLEN VEH/VES/ETC

        Charge                                     Charge Description
              594(A) PC                            VANDALISM

        Charge                                     Charge Description

              978.5 PC                             BENCH WARRANT:FTA:FELONY

                                                       
正则表达式 Ruby 解析 PDF

评论

2赞 Gerhard 5/25/2023
PDF 会将您的示例分布在多行上。代码需要处理多行代码。
0赞 snoozy 5/25/2023
以及如何获得 rel 类型?
2赞 teapot418 5/25/2023
通常,pdf是一种图形格式。有时还有一堆字母及其位置。其主要目标是外观一致且打印可靠。提供遵循数据逻辑结构的可解析格式不是优先事项。你还有什么其他选择?
2赞 Gerhard 5/25/2023
如果我们需要帮助您了解详细信息,请显示输出。您应该能够通过查找 的位置来确定列的开始和停止偏移量。对于下一行,获取列中的文本。page.text.inspectrel_type
1赞 Gerhard 5/25/2023
我建议你阅读这个:为什么不上传代码/数据/错误的图像

答:

0赞 Gerhard 5/25/2023 #1

从你的数据中,我得到了:

s = ["Race          Gen    Height   Weight    Hair  Eyes     Job Description Arrest Date Time   Rel type       Release Date Arrest Location HISPANIC        M      67       175     BLK    BRO                     1/28/23 2:42 pm    Court Order -  01/30/2023    400 Block HANLON WAY",
     "                                                                                               Own",
     "                                                                                             Recognizance"]

要巧妙地从 pdf 中读取文本并将其解析为数组中的一行一行,如上所示的数据:

require 'pdf/reader'

reader = PDF::Reader.new(pdf_file_path)

reader.pages.each do |page|
  page.text.lines each do |line|
    # now you handling it as array, line by line
  end
end

逐行扫描:

(start, stop) = s[0].scan(/Rel type/).map { [Regexp.last_match.begin(0), Regexp.last_match.end(0)] }[0]

检查我们是否找到了带有发布类型标头的下一行:

if (start != nil)

拆分现有行并从当前(拆分线)和以下行中获取数据文本:

data = s[0].scan(/Rel type.*Arrest Location(.*)/)
puts data[0][0][90 .. 105].strip
puts s[1][start .. -1].strip
puts s[2][start .. -1].strip

最初,我想使用start和stop来确定是否有多列文本。但是列是固定的(根据我抓取 PDF 的经验),因此所有行的文本位置都应该相同,您可以使用固定偏移量。如果没有,请使用 start 和 stop。

执行此代码可为我提供:

Court Order -
Own
Recognizance

评论

0赞 snoozy 5/25/2023
它没有给我“法院命令 - ”它应该是“法院命令 - 自己的承认”,我只得到“自己的承认”
0赞 snoozy 5/25/2023
我本来打算接受你的回答,但你如此巧妙地将字符串分成了 3 个部分。为什么?在解析 pdf 时,我们将所有这些作为单个字符串获得
1赞 Gerhard 5/26/2023
如果你要尝试一次处理一页,你会很难过。一次处理一行要聪明得多。
0赞 snoozy 5/27/2023
但我有将近 256 页的 pdf
0赞 Gerhard 5/29/2023
这就是为什么红宝石中有环的原因。