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

使用Ruby的Prawn库合并扫描JPEG为PDF的问题求助

使用Ruby Prawn库解决扫描JPEG转PDF的尺寸异常问题

我来帮你搞定这个问题!之前用ImageMagick遇到的页面缩放异常,用Prawn完全可以解决,而且能精准控制每个页面的尺寸。下面给你两种实用方案,按需选择:

方案1:每个PDF页面匹配图片实际尺寸

这个方案会让每张图片对应一个和它实际大小一致的PDF页面,完全避免缩放失真,适合需要保留原始扫描尺寸的场景。

步骤:

  1. 先安装依赖:

    gem install prawn mini_magick
    

    (如果用Bundler,就在Gemfile里加gem 'prawn'和gem 'mini_magick',然后跑bundle install)

  2. 编写Ruby脚本:

    require 'prawn'
    require 'mini_magick'
    
    # 替换成你的图片路径列表
    image_paths = ['image1.jpg', 'image2.jpg', 'image3.jpg']
    
    # 生成PDF,跳过初始页面创建,我们手动为每张图建页面
    Prawn::Document.generate('output.pdf', skip_page_creation: true) do |pdf|
      image_paths.each do |img_path|
        # 用MiniMagick获取图片的真实像素尺寸(比Prawn自带方法更可靠)
        img = MiniMagick::Image.open(img_path)
        pixel_width = img.width
        pixel_height = img.height
    
        # 扫描件通常是300DPI,把像素转换成PDF的点单位(1英寸=72点)
        dpi = 300
        page_width = (pixel_width.to_f / dpi) * 72
        page_height = (pixel_height.to_f / dpi) * 72
    
        # 创建对应尺寸的新页面
        pdf.start_new_page(size: [page_width, page_height])
    
        # 插入图片,让它刚好填满整个页面
        pdf.image(img_path, fit: [page_width, page_height])
      end
    end
    

方案2:统一所有PDF页面尺寸

如果你希望所有页面大小一致(比如统一用最大的那张图的尺寸),可以用这个方案,图片会自动居中适配页面,保持比例不变。

脚本示例:

require 'prawn'
require 'mini_magick'

image_paths = ['image1.jpg', 'image2.jpg', 'image3.jpg']

# 先找出所有图片里的最大宽高
max_pixel_width = 0
max_pixel_height = 0
image_paths.each do |path|
  img = MiniMagick::Image.open(path)
  max_pixel_width = [max_pixel_width, img.width].max
  max_pixel_height = [max_pixel_height, img.height].max
end

# 转换为PDF页面尺寸(同样基于300DPI)
dpi = 300
uniform_page_width = (max_pixel_width.to_f / dpi) * 72
uniform_page_height = (max_pixel_height.to_f / dpi) * 72

# 生成统一尺寸的PDF
Prawn::Document.generate('output_uniform.pdf', size: [uniform_page_width, uniform_page_height]) do |pdf|
  image_paths.each do |img_path|
    # 图片居中显示,自动适配页面,不会拉伸变形
    pdf.image(img_path, position: :center, vposition: :center, fit: [uniform_page_width, uniform_page_height])
  end
end

注意事项:

  • 这里用MiniMagick是因为它能精准获取图片的原始像素尺寸,比Prawn自带的图片解析更稳定,尤其是处理扫描件这类可能带有元数据的图片。
  • 如果你的扫描件DPI不是300,记得把代码里的dpi值改成实际的(比如200或600),这样转换后的页面尺寸才会准确。
  • 运行脚本后,就能得到没有尺寸异常的PDF了,再也不会出现某页突然变成1/10大小的情况!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:09:43