是否可以通过 pdf-reader 读取 ruby​​zip 中的 pdf 文件?

Is it possible to read pdf file inside rubyzip by pdf-reader?

是否可以通过 pdf-reader 读取 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 根据 2 个条件验证输入是 "IO-like object or a filename"。

  • 根据对象响应seekread判断是否"IO-like"
  • 根据File.file?判断是否为File

摘录Source

def extract_io_from(input)
   if input.respond_to?(:seek) && input.respond_to?(:read)
     input
   elsif File.file?(input.to_s)
     StringIO.new read_as_binary(input)
   else
     raise ArgumentError, "input must be an IO-like object or a filename"
   end
 end

不幸的是,虽然 Zip::InputStream 很好地模拟了一个 IO 对象,但它没有定义 seek,因此它没有通过上面的验证。您可以做的是通过

Zip::InputStream 的内容创建一个新的 StringIO
StringIO.new(entry.get_input_stream.read)

这将保证 PDF::Reader 将其视为 "IO-like object" 并对其进行适当处理。