如何在ruby中组合PDF?

Pau*_*ber 16 ruby pdf pdf-generation itext pdftk

这是在2008被问到的.希望现在有更好的答案.

如何在ruby中组合PDF?

我正在使用pdf-stamper gem填写PDF格式的表单.我想拍摄n个 PDF,在每个PDF中填写一个表格,并将结果保存为n页文档.

你能用像prawn这样的本地库来做到这一点吗?你能用rjb和iText做到这一点吗?pdf-stamper是iText的包装器.

如果可能的话,我想避免使用两个库(即pdftk和iText).

小智 20

截至2013年,您可以使用Prawn合并pdf.要点:https://gist.github.com/4512859

class PdfMerger

  def merge(pdf_paths, destination)

    first_pdf_path = pdf_paths.delete_at(0)

    Prawn::Document.generate(destination, :template => first_pdf_path) do |pdf|

      pdf_paths.each do |pdf_path|
        pdf.go_to_page(pdf.page_count)

        template_page_count = count_pdf_pages(pdf_path)
        (1..template_page_count).each do |template_page_number|
          pdf.start_new_page(:template => pdf_path, :template_page => template_page_number)
        end
      end

    end

  end

  private

  def count_pdf_pages(pdf_file_path)
    pdf = Prawn::Document.new(:template => pdf_file_path)
    pdf.page_count
  end

end
Run Code Online (Sandbox Code Playgroud)

  • 它不会起作用,因为Prawn放弃了模板支持.在此处查看更多相关信息:https://github.com/prawnpdf/prawn/issues/376 (7认同)
  • 只是为每个人找到这个答案的一个注释 - 他们现在正式删除了模板.你将不得不回到0.14.0版本来取回它们. (6认同)

Mys*_*yst 16

经过长时间搜索纯Ruby解决方案后,我最终从头开始编写代码来解析和合并/合并PDF文件.

(我觉得现在的工具太混乱了 - 我想要一些原生的东西,但它们似乎都有不同的问题和依赖...甚至Prawn放弃了他们用来拥有的模板支持)

我在网上发布了宝石,你也可以在GitHub上找到它.

你可以安装它:

gem install combine_pdf
Run Code Online (Sandbox Code Playgroud)

它非常易于使用(有或没有将PDF数据保存到文件中).

例如,这是一个"单行":

(CombinePDF.load("file1.pdf") << CombinePDF.load("file2.pdf") << CombinePDF.load("file3.pdf")).save("out.pdf")
Run Code Online (Sandbox Code Playgroud)

如果您发现任何问题,请告诉我,我会解决问题.


0x4*_*672 11

使用ghostscript组合PDF:

 options = "-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite"
 system "gs #{options} -sOutputFile=result.pdf file1.pdf file2.pdf"
Run Code Online (Sandbox Code Playgroud)


Pau*_*ber 5

我写了一个红宝石宝石来做到这一点 - PDF :: Merger.它使用iText.以下是您使用它的方式:

pdf = PDF::Merger.new
pdf.add_file "foo.pdf"
pdf.add_file "bar.pdf"
pdf.save_as "combined.pdf"
Run Code Online (Sandbox Code Playgroud)