Ruby on rails pdf阅读器是否可以读取rubyzip中的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

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 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)