是否可以通过 pdf-reader 读取 rubyzip 中的 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"。
- 根据对象响应
seek
和read
判断是否"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" 并对其进行适当处理。
是否可以通过 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"。
- 根据对象响应
seek
和read
判断是否"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" 并对其进行适当处理。