我正在处理用户上传的pdf,方法是从中提取文本并将输出保存在文本文件中以便以后处理。
在本地我将pdf存储在我的公共文件夹中,但是当我在Heroku上工作时,我需要使用S3。
我认为pdf路径是问题,所以我包括
如果Rails.env.test? || Rails.env.cucumber?
但我仍然收到
ArgumentError(输入必须是类似IO的对象或文件名):
有没有办法暂时将pdf存储在Heroku上的root / tmp文件夹中,从中获取文本,然后完成后,将文档上传到S3?
def convert_pdf
if Rails.env.test? || Rails.env.cucumber?
pdf_dest = File.join(Rails.root, "public", @application.document_url)
else
pdf_dest = @application.document_url
end
txt_file_dest = Rails.root + 'tmp/pdf-parser/text'
document_file_name = /\/uploads\/application\/document\/\d{1,}\/(?<file_name>.*).pdf/.match(@application.document_url)[:file_name]
PDF::Reader.open(pdf_dest) do |reader|
File.open(File.join(txt_file_dest, document_file_name + '.txt'), 'w+') do |f|
reader.pages.each do |page|
f.puts page.text
end
end
end
end
答案 0 :(得分:2)
您需要在上传器中设置自定义处理器。最重要的是,由于输出文件(.txt)不会与输入文件(.pdf)具有相同的扩展名,因此您需要更改文件名。以下内容属于您的上传器:
process :convert_to_text
def convert_to_text
temp_dir = Rails.root.join('tmp', 'pdf-parser', 'text')
temp_path = temp_dir.join(filename)
FileUtils.mkdir_p(temp_dir)
PDF::Reader.open(current_path) do |pdf|
File.open(temp_path, 'w') do |f|
pdf.pages.each do |page|
f.puts page.text
end
end
end
File.unlink(current_path)
FileUtils.cp(temp_path, current_path)
end
def filename
super + '.txt' if original_filename.present?
end
我没有运行此代码,所以可能存在一些错误,但至少应该给你这个想法。