【问题标题】:Ruby: Reading PDF filesRuby:阅读 PDF 文件
【发布时间】:2009-04-21 15:31:45
【问题描述】:

我正在寻找一种在 Ruby(在 Linux 和 OSX 上)中读取/解析大型 PDF 文件的快速可靠的方法。

到目前为止,我发现了相当古老而简单的PDF-toolkitpdftotext-wrapper)和PDF-reader,它们无法读取我的大部分文件。虽然这两个库提供了我正在寻找的功能。

我的问题:我错过了什么吗?有没有更适合(更快、更可靠)解决我的问题的工具?

【问题讨论】:

    标签: ruby-on-rails ruby pdf pdf-parsing


    【解决方案1】:

    您可能会发现Docsplit 很有用:

    Docsplit 是一个命令行实用程序和 Ruby 库,用于将文档拆分为其组成部分:可搜索的 UTF-8 纯文本、任何格式的页面图像或缩略图、PDF、单页和文档元数据(标题、作者、页数...)

    【讨论】:

    • 哈维尔:看看 Docsplit。它包装了用于文本提取的 Apache PDFBox 库——因为我们使用 PDFBox 获得了比 pdftotext 更好的质量结果。
    • @pw。安装了所有的库并遵循了所有的文档,但是我很难过,你有没有超过 2 行代码的教程或文档的推荐?
    【解决方案2】:

    尝试不同的方法后,我现在使用PDF-Toolkit。它已经很老了,但它快速、稳定且可靠。此外,它真的不需要是新的,因为它只是包装了xpdf commandline utilities

    【讨论】:

      【解决方案3】:

      您可以使用 JRuby 和 Java PDF 库解析器,例如 ApachePDFBox (https://www.ohloh.net/p/pdfbox)。另见http://java-source.net/open-source/pdf-libraries

      【讨论】:

      • 这听起来像是一个有趣的选择。您是否在某处看到了实现或示例?
      • @Trejkaz 我想我的意思是说我“只是”想阅读它们,因此不打算为它购买软件?但谁知道我 6 年前在想什么? ;-)
      【解决方案4】:

      您看过CombinePDF 库吗?

      这是一个纯 ruby​​ 解决方案,允许进行一些 PDF 操作,例如提取页面、将一个 PDF 页面覆盖在另一个页面上、页码、编写基本文本和表格等。

      这是一个使用徽标来处理现有 PDF 文件的示例。该示例读取一个 PDF 文件,提取一页用作图章并在另一个 PDF 文件上盖章。

      require 'combine_pdf'
      company_logo = CombinePDF.load("company_logo.pdf").pages[0]
      pdf = CombinePDF.load "content_file.pdf"
      pdf.pages.each {|page| page << company_logo}
      pdf.save "content_with_logo.pdf"
      

      您还可以标记文本、编号页或使用:

      require 'combine_pdf'
      
      pdf = CombinePDF.load "content_file.pdf"
      
      pdf.number_pages #adds page numbers. you can add formatting and placement options.
      
      pdf.pages.each {|page| page.textbox "One Way To Stamp"}
      
      #you can a shortcut method to stamp pages
      pdf.stamp_pages "Another way to stamp"
      
      #you can use the shortcut method for both text and PDF stamps
      company_logo = CombinePDF.load("company_logo.pdf").pages[0]
      pdf.stamp_pages company_logo
      
      # you can use write simple tables
      pdf.pages[0].write_table headers: ['first name', 'surname'], table_data: [['John', 'Doe'], ['Mr.', 'Smith']]
      
      pdf.save "content_with_logo.pdf"
      

      它不适用于复杂的操作,但它补充了大多数 PDF 创作库,并允许您使用 PDF 模板而不是从头开始编写整个内容。

      【讨论】:

        【解决方案5】:

        这里有一些选项:

        http://en.wikipedia.org/wiki/List_of_PDF_software

        通过该链接并搜索 sourceforge,有几个命令行实用程序可以满足您的需求,例如:http://pdftohtml.sourceforge.net/

        根据您的要求和 PDF 的外观,您可以考虑使用 Google Docs API(上传 PDF,然后将其下载为文本),或者也可以尝试类似 gocr 的方法。过去我很幸运地使用 gocr 解析图像文本,而您只需跳出到 shell 即可,例如 gocr -i whatever.pdf(我认为它适用于 PDF)。

        所有这些的缺点是它们不是纯 Ruby 实现,但许多好的(和免费的)OCR 项目似乎都是以这种方式完成的。

        【讨论】:

        • 为什么我需要 OCR(“光学字符识别”)来阅读不包含扫描文本的 PDF?这不会不必要地减慢整个过程吗?
        • 没有。 OCR 是将图像转换为文本的过程。 PDF 阅读器和 PDF 工具包利用这一概念将图像(例如从扫描仪输出的图像)转换为文本。
        • 所以基本上你的意思是,PDF 中的所有文本都包含一个需要首先被识别为文本的图像?
        • 如果我说是或否,我就是在撒谎。我只知道我在 OCR 方面取得了成功。
        • 一些 PDF 被扫描,另一些则以超奇怪的格式对文本进行编码,例如 (t)(h)(i)(s) (s)(o)(m)(e) (t)( e)((x)(t)) 也有些使用放气。
        【解决方案6】:

        如果您只需要从 pdf 文件中获取文本内容,sourceforge 中的 pdftohtml 非常有效。 它不适合处理图像。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-17
          • 1970-01-01
          • 2011-07-03
          相关资源
          最近更新 更多