我有一个场景,需要基于一个对象数组生成一个多页pdf。
以下是我的模型:

# Member has_many certificates

class Member < ActiveRecord::Base

  has_many :certificates, dependent: :destroy

  before_save :set_expiry

  def self.delete_expired
    where(expire_at: Date.today).destroy_all
  end

  private
    def set_expiry
      self.expire_at = 15.days.from_now
    end
end

# certificate belongs_to member
class Certificate < ActiveRecord::Base
  belongs_to :member
  belongs_to :certificate_type
  belongs_to :company

  def company_name
    company.name
  end

  def page_orientation
    company_name == 'CompanyA' ? 'Landscape' : 'Portrait'
  end

  def page_height
    company_name == 'CompanyA' ? '10.5in' : '11in'
  end

  def page_width
    company_name == 'CompanyA' ? '7in' : '8.5in'
  end
end

# each type can have many certificates
class CertificateType < ActiveRecord::Base
  has_many :certificates
end

用户流如下:
用户上载包含成员记录的Excel文件。系统存储记录。
然后,用户可以为单个成员生成证书(已经在工作)。
用户可以为上载的所有成员中的多个成员批量生成证书。
我有一个自定义表单,在其中创建证书对象(选中复选框),然后提交表单控制器接收证书对象的哈希。我必须逐个循环遍历所有对象,才能为其关联成员创建证书问题是每个证书都有自己的模板和一些自定义页面布局设置,如方向、宽度和高度。我想生成一个包含多个页面的pdf文件,其中每个页面都是一个证书我不知道应该在何处以及如何传递每个证书的页面布局设置。我尝试在控制器中呈现字符串,并尝试在那里设置页面布局选项,但似乎不起作用我需要一些建议或指点。

最佳答案

建立在@fdisk的答案之上,但是使用ruby nativecombine_pdf gem。你可以试试:

require 'combine_pdf'

merged_certificates = CombinePDF.new

@member.certificates.each do |certificate|
  pdf_data = WickedPdf.new.pdf_from_string(render_to_string(something, layout: some_layout))
  merged_certificates  << CombinePDF.parse(pdf_data)
end

send_data merged_certificates.to_pdf, filename: 'mypdf.pdf' #...

10-08 04:24