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

Rails应用如何合并含可选内容(optional content)的PDF文件

解决方案

方案1:使用Ghostscript预处理PDF,扁平化可选内容

该方案兼容你现有的CombinePDF使用逻辑,不需要修改原有合并代码,仅需提前将带可选内容的PDF转换为无OCG层的普通PDF即可。

  • 首先在服务器安装Ghostscript:
    Debian/Ubuntu环境执行:apt install ghostscript
    CentOS/RHEL环境执行:yum install ghostscript
  • 单文件预处理命令:
    gs -sDEVICE=pdfwrite -dNEWPDF=false -dProcessColorModel=/DeviceRGB -dCompatibilityLevel=1.4 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output_flat.pdf input_with_ocg.pdf
    
  • Rails中批量自动化预处理示例:
    require 'open3'
    
    def flatten_ocg_pdf(input_path, output_path)
      cmd = [
        'gs', '-sDEVICE=pdfwrite', '-dNEWPDF=false', '-dProcessColorModel=/DeviceRGB',
        '-dCompatibilityLevel=1.4', '-dNOPAUSE', '-dQUIET', '-dBATCH',
        "-sOutputFile=#{output_path}", input_path
      ]
      _stdout, stderr, status = Open3.capture3(*cmd)
      raise "PDF预处理失败: #{stderr}" unless status.success?
    end
    

处理后的文件已无可选内容层,直接用原CombinePDF逻辑合并不会触发报错。


方案2:切换到HexaPDF库实现合并(支持保留可选内容)

如果合并后需要保留PDF的可选内容开关功能,可以替换CombinePDF为功能更完整的HexaPDF库,其原生支持OCG层的导入合并。

  • Gemfile中添加依赖:
    gem 'hexapdf'
    
    执行bundle install完成安装。
  • 合并代码示例:
    require 'hexapdf'
    
    merged_pdf = HexaPDF::Document.new
    # 替换为你的待合并PDF路径数组
    %w[file1.pdf file2.pdf file3.pdf].each do |path|
      source_pdf = HexaPDF::Document.open(path)
      source_pdf.pages.each { |page| merged_pdf.pages << merged_pdf.import(page) }
    end
    merged_pdf.write('merged_result.pdf', optimize: true)
    

方案3:使用pdftk工具直接合并

服务器允许安装pdftk的场景下可以直接用该工具完成带可选内容PDF的合并,不需要额外预处理:

  • 合并命令:pdftk file1.pdf file2.pdf file3.pdf cat output merged.pdf
  • Ruby侧同样可以通过Open3调用该命令实现自动化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:09:04