寻找有关如何将PDF转换为结构化格式的建议

时间:2013-08-19 18:48:53

标签: python ruby parsing pdf pdf-parsing

我想对即将举行的拍卖中列出的一些房产进行一些分析。不幸的是,运营拍卖的城市并没有以结构化格式发布信息,而是提供了700+ page PDF个要拍卖的房产。

我想知道社区是否有任何关于如何将PDF解析为结构化格式以插入数据库或创建属性的电子表格的想法。

这是每个页面代表的图像: Property Guide

这是一个列出一些属性的页面: Sample List of Properties

我对python和ruby很满意所以我没有任何问题脚本化解决方案,但因为“列”和那些列中的数据没有必要绑在一起,看起来这将是一个可疑的主张。

非常感谢任何想法。

2 个答案:

答案 0 :(得分:2)

在使用了3个小时后,我能够从数据中创建一个可解析的XML文档。不幸的是,我没有成功完成一套完全可重复使用的步骤,可用于未来的拍卖出版物。

顺便说一句,我确实试图打电话询问洛杉矶县是否可以提供另类格式的拍卖物品(excel等),答案是否定的。那是你的政府。

以下是我的方法的高级视图:

我使用http://xmlbeautifier.com/作为我的XML美化/验证器,因为它很快并且提供了准确的错误报告,包括行号。

使用Homebrew安装适用于Mac的Poppler:

brew install poppler

安装Poppler后,您应该可以访问pdftotext实用程序来转换PDF:

pdftotext -layout -f 24 -l 687 AuctionBook2013.pdf auction_book.txt

这是XML(Click here for full XML)的预览:

<?xml version="1.0" encoding="UTF-8"?>
<listings>
   <item id="1">
      <nsb>536</nsb>
      <minbid>3,422</minbid>
      <apn>2006 003 001</apn>
      <delinquent_year>03</delinquent_year>
      <apn_old>2006 003 001</apn_old>
      <description>LICENSED SURVEYOR'S MAP
          AS PER BK 25 PG 28 OF L S LOT 1              
          BLK 1 ASSESSED TO    J   AND   S
          LIMITED LLC C/O DUNA CSARDAS -
          JULIUS JANCSO LOCATION COUNTY OF
          LOS ANGELES</description>
      <address>VACANT LOT</address>
   </item>

编辑:添加我编写的Ruby,将XML转换为CSV格式。

require 'rexml/document'
require 'CSV'

class Auction

  def initialize

    f = File.new('AuctionBook2013.xml', 'r')
    doc = REXML::Document.new(f)

    CSV.open("auction.csv", "w+b") do |csv|
      csv << ['id', 'minbid', 'apn', 'delinquent_year', 'apn_old', 'description', 'address']

      doc.elements.each('/listings/item') do |item|
        csv << [item.attributes['id'],
                item.elements['minbid'].text,
                item.elements['apn'].text,
                item.elements['delinquent_year'].text,
                item.elements['apn_old'].text,
                item.elements['description'].text,
                item.elements['address'].text]
      end
    end
  end
end

a = Auction.new()

Link to Final CSV

答案 1 :(得分:1)

使用pdftotext命令将Xpdf转换为文本。

我使用以下内容转换了您的文件:

pdftottext.exe -layout -f 23 -l 510 AuctionBook2013.pdf AuctionBook2013.txt

此转换将文本完全保留在原始布局中(由于-layout选项)。选项-f-l表示要提取的页面范围的第一页和最后一页。

从那里开始,解析应该很简单 - 第8列中的数字表示记录的第一行,空白行结束记录。按照指南进行记录中元素的准确定位。