如何将PDF双页合并为单页?含Prawn生成PDF的定制合并需求
用Prawn实现PDF双页合并(保留封面+添加中心竖线)
嘿,针对你要把PDF封面后页面两两合并、还得加中心竖线的需求,咱们完全可以直接用Prawn来处理,不用转成图片折腾!这样能最大程度保留原PDF的矢量格式和清晰度,下面是具体的实现方案:
核心思路
- 直接读取原PDF的所有页面,避免格式转换带来的损耗
- 封面单独保留为新PDF的第一页
- 从第二页开始,每两页作为一组,绘制到新的横向页面(或对应尺寸页面)的左右两侧
- 在合并后的页面中心绘制一条竖线,模拟书籍排版的装订线
具体代码实现
首先确保你安装了必要的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
相关产品推荐
相关产品推荐

