技术咨询:能否使用pdf-reader读取Zip压缩包内的PDF文件?
可以用pdf-reader读取Zip压缩包内的PDF文件!
你的代码没法正常运行的核心问题是:你传给PDF::Reader.new的entry.name只是压缩包内的文件名称,并不是文件的实际内容数据流——pdf-reader没法直接通过这个文件名找到并读取压缩包内部的文件。
修正后的代码示例
你需要通过Zip条目对象的get_input_stream方法获取文件的输入流,再把这个流传给PDF::Reader,这样就能正确读取压缩包里的PDF内容了:
require 'zip' require 'pdf-reader' Zip::File.open('/path/to/zipfile') do |zip_file| zip_file.each do |entry| next if entry.directory? || entry.symlink? # 只处理PDF文件,避免非PDF文件报错 if entry.name.downcase.end_with?('.pdf') && entry.file? puts "#{entry.name} 是一个PDF文件,开始读取内容:" # 获取压缩包内文件的输入流 entry.get_input_stream do |stream| reader = PDF::Reader.new(stream) reader.pages.each_with_index do |page, index| puts "--- 第 #{index + 1} 页内容 ---" puts page.text end end else puts "#{entry.name} 不是PDF文件,跳过处理" end end end
关键改动说明
- 新增了对PDF文件的判断(通过后缀名),避免尝试读取非PDF文件导致报错
- 使用
entry.get_input_stream获取文件的数据流,而不是直接用文件名 - 用
each_with_index来标注页码,让输出更清晰
额外提示
- 确保你已经安装了所需的gem:
gem install zip pdf-reader - 如果压缩包很大,这种流式读取的方式也能避免把整个文件加载到内存,性能更友好
- 可以考虑添加异常捕获(比如
rescue PDF::Reader::MalformedPDFError),处理损坏的PDF文件情况
内容的提问来源于stack exchange,提问作者Tjax
相关产品推荐
相关产品推荐

