使用 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}
)
我想用 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}
)