You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程解码PDF内的二维码(无需扫描)

解码PDF中的二维码(Ruby实现)

核心思路

先把PDF的每一页转换成图片格式,再对每张图片进行二维码扫描解码。需要用到几个Ruby工具库配合系统依赖完成整个流程。

步骤1:安装系统依赖

首先得装底层的图像处理和二维码识别工具:

  • Ubuntu/Debian:
    sudo apt-get install libzbar-dev imagemagick
    
  • macOS:
    brew install zbar imagemagick
    

步骤2:添加Ruby Gem依赖

在你的Gemfile里加入:

gem 'pdf-reader'
gem 'mini_magick'
gem 'ruby-zbar'

然后执行bundle install完成安装。

步骤3:编写解码代码

以下是完整的示例代码,会遍历PDF所有页面,解码其中的所有二维码并输出结果:

require 'pdf-reader'
require 'mini_magick'
require 'zbar'

def decode_qr_codes_from_pdf(pdf_path)
  reader = PDF::Reader.new(pdf_path)
  qr_results = []

  reader.pages.each_with_index do |page, index|
    # 将PDF页面转成临时PNG图片(设置高分辨率保证二维码清晰)
    temp_image_path = "/tmp/pdf_page_#{index}.png"
    MiniMagick::Tool::Convert.new do |convert|
      convert.density 300 # 提高分辨率,避免小二维码无法识别
      convert << "#{pdf_path}[#{index}]"
      convert << temp_image_path
    end

    # 用zbar扫描图片中的所有二维码
    image = ZBar::Image.from_file(temp_image_path)
    image.format = ZBar::Format::PNG
    scanner = ZBar::Scanner.new
    results = scanner.scan(image)

    results.each do |result|
      qr_results << {
        page_number: index + 1,
        qr_content: result.data
      }
    end

    # 删除临时图片
    File.delete(temp_image_path) if File.exist?(temp_image_path)
  end

  qr_results
end

# 调用示例
pdf_path = "./your_qr_pdf.pdf" # 替换成你的PDF路径
decoded_codes = decode_qr_codes_from_pdf(pdf_path)

puts "解码结果:"
decoded_codes.each do |code|
  puts "第#{code[:page_number]}页:#{code[:qr_content]}"
end

注意事项

  • 调整density参数:如果二维码很小或者模糊,把分辨率调得更高(比如400)能提升识别率。
  • 处理复杂PDF:如果PDF里有重叠或变形的二维码,可能需要额外的图像预处理(比如裁剪、降噪),可以用MiniMagick的相关API实现。
  • 编码问题:如果二维码内容有非ASCII字符,确保你的Ruby环境编码设置正确(比如Encoding.default_external = 'UTF-8')。

内容的提问来源于stack exchange,提问作者Talha Chouhdary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:15:37