使用 ActiveJob 生成的 WickedPDF 正在创建边距 - 如何解决?

WickedPDF generated with ActiveJob is creating a margin - how to fix?

我想用 ActiveJob 生成 PDF,然后将其保存为记录的附件。

当我从控制器操作生成 PDF 时,它看起来不错:

当我将其移至后台作业时,它会在 pdf 周围创建此边距。

这是怎么回事,如何去掉边距使内容占满整个页面?

代码

按预期工作的控制器方法:

  def renderCatalogOnServer
      //declaring variables here -- removing to condense question
      respond_to do |format|
      format.html
      format.pdf do
        render pdf: "renderCatalogOnServer",
               layout: "pdf",
               page_size: "Letter",
               margin: { :top => 0, :bottom => 0, :left => 0 , :right => 0}
      end
    end
  end

在每页周围添加边距的活动作业方法:

class CreatePdfJob < ApplicationJob
  queue_as :default

  def perform(catalog_id)
    //declaring variables here -- removing to condense question

    generatedPdf  = WickedPdf.new.pdf_from_string(
      ApplicationController.render(
        template: 'catalog/renderCatalogOnServer',
        layout: 'layouts/pdf',
        page_size: "Letter",
        margin: { :top => 0, :bottom => 0, :left => 0 , :right => 0},
        locals: { catalog: @catalog, business_units: @business_units, brands: @brands },
      )
    )

    overlay = Tempfile.new('overlay')
    overlay.binmode
    overlay.write(generatedPdf)
    overlay.close
    pdfPath = overlay.path # to get path

    catalog_record.pdf.attach(io: URI.open(pdfPath), filename: "#{@catalog.name}.pdf")
  end
end

我猜这是我必须调用 ApplicationController.render 或在保存前创建临时文件的方式。我正在寻找如何从 PDF 中删除边距,但也欢迎任何有关使用 ActiveJob 和 WickedPDF 生成 PDF 的更好方法的反馈。它现在的工作方式似乎有点矫枉过正,但这是我发现实际生成 PDF 的唯一方法(尽管边距不正确)。

谢谢!

现在您正在将 PDF 选项传递给 ApplicationController#render,这实际上只是忽略它们(处理它们),因为该方法不知道这些选项的用途。

相反,您需要将 PDF 选项传递给 WickedPdf#pdf_from_string,以便他们可以控制 PDF 本身的生成方式。

要做到这一点,只需更改:

 generatedPdf  = WickedPdf.new.pdf_from_string(
      ApplicationController.render(
        template: 'catalog/renderCatalogOnServer',
        layout: 'layouts/pdf',
        page_size: "Letter",
        margin: { :top => 0, :bottom => 0, :left => 0 , :right => 0},
        locals: { catalog: @catalog, business_units: @business_units, brands: @brands },
      )
    )

收件人:

 generatedPdf  = WickedPdf.new.pdf_from_string(
      ApplicationController.render(
        template: 'catalog/renderCatalogOnServer',
        layout: 'layouts/pdf',
        locals: { catalog: @catalog, business_units: @business_units, brands: @brands}
      ),  
      page_size: "Letter",
      margin: { :top => 0, :bottom => 0, :left => 0 , :right => 0}
    )