0

嗨,我正在尝试用 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

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

4

3 回答 3

2

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

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

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

于 2012-11-28T17:57:13.303 回答
1

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

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

text = `pdftotext #{path} -`
text.split.select { |line|
  line.length > 0
}.each { |line|
  Rails.logger.info(line)
}
于 2012-11-28T11:31:13.693 回答
0

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

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

您可以咨询如何在 Ruby 中创建文件


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

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

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


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

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

例子

file_write.rb进行文件写入操作的Ruby 代码

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 阅读器来获取内容并将其写入文本文件。基本上第一行代码会改变。

于 2012-11-28T09:02:28.433 回答