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

如何将PDF双页合并为单页?含Prawn生成PDF的定制合并需求

用Prawn实现PDF双页合并(保留封面+添加中心竖线)

嘿,针对你要把PDF封面后页面两两合并、还得加中心竖线的需求,咱们完全可以直接用Prawn来处理,不用转成图片折腾!这样能最大程度保留原PDF的矢量格式和清晰度,下面是具体的实现方案:

核心思路

  1. 直接读取原PDF的所有页面,避免格式转换带来的损耗
  2. 封面单独保留为新PDF的第一页
  3. 从第二页开始,每两页作为一组,绘制到新的横向页面(或对应尺寸页面)的左右两侧
  4. 在合并后的页面中心绘制一条竖线,模拟书籍排版的装订线

具体代码实现

首先确保你安装了必要的gem:

gem install prawn prawn-templates

然后是Ruby代码:

require 'prawn'
require 'prawn/templates'

# 配置参数
SOURCE_PDF_PATH = "your_source.pdf"
OUTPUT_PDF_PATH = "merged_output.pdf"
# 假设原页面是A5尺寸(210x148mm),合并后用A4横向(297x210mm),可根据实际尺寸调整
ORIGINAL_PAGE_WIDTH = 148.mm
ORIGINAL_PAGE_HEIGHT = 210.mm
MERGED_PAGE_WIDTH = 297.mm
MERGED_PAGE_HEIGHT = 210.mm
VERTICAL_LINE_COLOR = "000000" # 黑色,可自定义颜色
VERTICAL_LINE_WIDTH = 0.5.mm

# 初始化新的PDF文档
Prawn::Document.generate(OUTPUT_PDF_PATH, page_size: [MERGED_PAGE_WIDTH, MERGED_PAGE_HEIGHT]) do |pdf|
  # 读取原PDF的所有页面
  original_pages = Prawn::Templates::PDFReader.new(SOURCE_PDF_PATH).pages

  # 处理封面(第一页)
  if original_pages.any?
    pdf.start_new_page
    pdf.template original_pages.first, at: [0, MERGED_PAGE_HEIGHT]
  end

  # 处理封面后的页面,两两分组
  original_pages[1..-1].each_slice(2) do |page_pair|
    pdf.start_new_page

    # 绘制左侧页面
    if page_pair[0]
      left_x = 0
      pdf.template page_pair[0], at: [left_x, MERGED_PAGE_HEIGHT], scale: MERGED_PAGE_HEIGHT / ORIGINAL_PAGE_HEIGHT
    end

    # 绘制右侧页面
    if page_pair[1]
      right_x = MERGED_PAGE_WIDTH / 2
      pdf.template page_pair[1], at: [right_x, MERGED_PAGE_HEIGHT], scale: MERGED_PAGE_HEIGHT / ORIGINAL_PAGE_HEIGHT
    end

    # 绘制中心竖线
    line_y_start = MERGED_PAGE_HEIGHT
    line_y_end = 0
    pdf.stroke_color VERTICAL_LINE_COLOR
    pdf.line_width VERTICAL_LINE_WIDTH
    pdf.stroke_line([MERGED_PAGE_WIDTH/2, line_y_start], [MERGED_PAGE_WIDTH/2, line_y_end])
  end
end

puts "合并完成!输出文件:#{OUTPUT_PDF_PATH}"

关键细节说明

  • 页面尺寸适配:代码里默认用A5转A4横向的尺寸,你可以根据原PDF的实际尺寸调整ORIGINAL_PAGE_WIDTH、ORIGINAL_PAGE_HEIGHT和MERGED_PAGE_WIDTH、MERGED_PAGE_HEIGHT参数,确保缩放比例正确
  • 奇数页处理:如果原PDF封面后剩下奇数页,最后一页会单独放在合并页面的左侧,右侧留空(你也可以根据需求修改逻辑,比如把最后一页居中显示)
  • 竖线样式:可以修改VERTICAL_LINE_COLOR(支持十六进制颜色)和VERTICAL_LINE_WIDTH来调整竖线的粗细和颜色
  • 模板导入:用prawn-templates的template方法直接导入原PDF页面,保留矢量格式,比转图片的方式清晰度高得多

注意事项

  • 确保原PDF的所有页面尺寸一致,否则缩放后会出现排版错位的问题
  • 如果原PDF有复杂的交互元素(比如表单、超链接),这种方式可能会丢失,但书籍印刷用的PDF一般不会有这类问题
  • 测试时可以先拿小样本PDF调试参数,确保排版符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:37:50