Ruby on rails pdf阅读器是否可以读取rubyzip中的pdf文件?
PDF阅读器是否可以读取Ruby on rails pdf阅读器是否可以读取rubyzip中的pdf文件?,ruby-on-rails,pdf-reader,rubyzip,Ruby On Rails,Pdf Reader,Rubyzip,PDF阅读器是否可以读取zip文件中的PDF文件?我试过这个代码,但不起作用 require 'zip' Zip::File.open('/path/to/zipfile') do |zip_file| zip_file.each do |entry| if entry.directory? puts "#{entry.name} is a folder!" elsif entry.symlink? puts "#{entry.name} is a symlink!" elsif en
zip
文件中的PDF
文件?我试过这个代码,但不起作用
require 'zip'
Zip::File.open('/path/to/zipfile') do |zip_file|
zip_file.each do |entry|
if entry.directory?
puts "#{entry.name} is a folder!"
elsif entry.symlink?
puts "#{entry.name} is a symlink!"
elsif entry.file?
puts "#{entry.name} is a regular file!"
reader = PDF::Reader.new("#{entry.name}")
page = reader.pages.each do |page|
puts page.text
end
else
puts "#{entry.name} is something unknown"
end
end
end
感谢
PDF::Reader
根据两个标准验证输入是否为“类似IO的对象或文件名”
- 根据响应
和seek
read
- 根据
File.File?
Zip::InputStream
相当好地模拟了IO
对象,但它没有定义seek
,因此无法通过上述验证。您可以做的是通过以下方式从Zip::InputStream
的内容创建一个新的StringIO
StringIO.new(entry.get_input_stream.read)
这将保证
PDF::Reader
将其视为“类似IO的对象”,并对其进行适当的处理 上面代码的输出是什么?这是一个错误,`ArgumentError(输入必须是类似IO的对象或文件名)`。可能有更好的方法,但我找不到它。所以我会尝试PDF::Reader.new(StringIO.new(entry.get\u input\u stream.read))
问题是PDF::Reader
基于:read
和:seek
方法验证类似IO的对象,而Zip::InputStream
没有定义seek
。但是,它确实包含一个未公开的实例变量@archive\u io
,它是一个文件或io
对象,因此您也可以使用PDF::Reader.new(entry.get\u input\u stream.instance\u variable\u get(:@archive\u io))
,但感觉脏了PDF::Reader.new(StringIO.new(entry.get\u input\u stream.read))
可以工作,但第二个有一个错误,如:PDF::Reader::MalformedPDFError(PDF不包含EOF标记)
@engineersmnky如果使用第一个,您认为我以后会遇到某种错误吗?无论如何,谢谢你,如果你提供第一个选项作为答案,我会接受它。
StringIO.new(entry.get_input_stream.read)