【问题标题】:Convert a PDF to .txt gives me an empty .txt file将 PDF 转换为 .txt 给了我一个空的 .txt 文件
【发布时间】:2012-11-16 01:53:28
【问题描述】:

您好,我正在尝试用 Ruby 阅读 pdf,首先我想将其转换为 txt。 path 是 PDF 的路径,关键是我得到了一个空的 .txt 文件,正如有人告诉我的那样,这是一个 pdftotext 问题,但我不知道如何解决。

  spec = path.sub(/\.pdf$/, '')
  `pdftotext #{spec}.pdf`
  file = File.new("#{spec}.txt", "w+")
  text = []
  file.readlines.each do |l|
  if l.length > 0
    text << l
    Rails.logger.info l
  end
 end
 file.close

我的代码有什么问题?谢谢!

【问题讨论】:

  • 你应该先检查它是否被创建。这是肯定的。
  • 是的,它被创建了,但是是空的,我不知道为什么......
  • 那么pdftotext 有问题。如果您在命令行中执行此操作并且仍然得到一个空白文件,那么 ruby​​ 就没有什么了。
  • 是的,我刚刚下载了这个:foolabs.com/xpdf/download.html

标签: ruby pdf text


【解决方案1】:

无法从每个 PDF 中提取文本。一些 PDF 文件使用 字体编码,这使得使用简单的工具(例如 pdftotext)无法提取文本(一些 PDF 文件甚至完全不受使用 any 的直接文本提取的影响 我知道的工具——在这些情况下,您必须先应用 OCR 才能有机会提取文本...)。

因此,如果您一直使用同一个“奇怪”的 PDF 文件测试您的代码,您很可能会对您的代码感到沮丧,而实际上问题出在 PDF 上。

首先确保pdftotxt 的命令行用法适用于给定的 PDF,然后使用该 PDF 测试(并进一步开发)您的代码。

【讨论】:

    【解决方案2】:

    问题是您正在以写入(“w”)模式打开文件,这会截断文件。您可以在http://ruby-doc.org/core-1.9.3/IO.html 上查看文件模式表及其含义。

    尝试这样的事情,它使用 pdftotext 选项将文本发送到标准输出以避免创建临时文件并使用块来获得更惯用的 ruby​​。

    text = `pdftotext #{path} -`
    text.split.select { |line|
      line.length > 0
    }.each { |line|
      Rails.logger.info(line)
    }
    

    【讨论】:

    • 谢谢,但问题是当它执行时我得到了这个 []:Rails.logger.info (line)
    【解决方案3】:

    您需要以写入权限打开 txt 文件。

    file = File.new("#{spec}.txt", "w")
    

    您可以咨询How to create a file in Ruby


    更新:您的代码不完整,看起来有问题。

    1. 不能说path是什么
    2. 看起来您正在尝试读取您打算写入的文本文件file.readlines.each
    3. 拼写检查length你有它l.lenght

    您可能需要粘贴实际代码。


    检查这个要点https://gist.github.com/4160587

    如前所述,您的代码无法正常工作,因为您正在读取和写入同一个文件。

    示例

    Ruby代码file_write.rb做文件写操作

    pdf_file = File.open("in.txt") 
    output_file = File.open("out.txt", "w") # file to which you want to write
    #iterate over input file and write the content to output file
    pdf_file.readlines.each do |l|
        output_file.puts(l)
    end
    output_file.close
    pdf_file.close
    

    示例txt文件in.txt

    Some text in file
    Another line of text
    
    1. Line 1
    2. Not really line 2
    

    运行file_write.rb 后,您应该会看到名为out.txt 的新文件,其内容与in.txt 相同。您可以根据需要更改输入文件的内容。在您的情况下,您将使用 pdf 阅读器来获取内容并将其写入文本文件。基本上第一行代码都会改变。

    【讨论】:

    • `path' 是 PDF 的路径。是的,我正在尝试阅读它,我这样做的方式不正确吗?
    • 您是否仍然收到相同的错误消息?使用完整的错误堆栈更新您的问题。在更新的代码中,您仍在阅读您打算编写的文件。
    • 不,我现在没有任何错误,问题是我得到一个空的.txt文件,代码再次更新。
    • 我再次更新了答案。您不应该阅读您打算写入的文件。 file.readlines.each do |l| 错了应该是spec.readlines.each do |l|
    猜你喜欢
    • 2020-01-08
    • 2017-09-13
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 2016-10-11
    相关资源
    最近更新 更多