0

问题:应用程序有一个由各种打印机组成的网络。其中一些通过 PrintNode 工作。他们应该接收编码为 base64 的字符串。接收我的文档的代码看起来像

PrintNode::PrintJob.new printer_id, 'PrinterClass', method, Base64.encode64(document), 'AppName'

method应该包含方法——在我的例子中是 raw_base64 或 pdf_base64。所以我有下一个代码

case FileMagic.mime.buffer(document, true)
when 'text/plain'
  then method = 'raw_base64'
# when 'text/html' # this commented because I have to avoid it
#   then method = 'pdf_base64'
when 'application/pdf'
  then method = 'pdf_base64'
else
  raise InvalidDocumentError
end

Controller.render我用方法渲染文档

document = InstanceController.render :label, { id: instance.id, formats: :pdf, locals: { instance: instance_note } }

正如我所见,文档是一个字符串(包括 html),因此 FileMagic.mime 返回 text/html(我认为是这样)。这是个问题。我不在打印机附近,不能只用真正的打印机进行测试。此外,我们有 5 种打印机类型(条形码、a4 等)。所以我不确定我是否可以使用带注释的方法(text/html)。

所以主要问题Controller.render- 我可以用方法渲染真正的 PDF吗?(如果是,那么如何?)

注意:我们使用 PrinceXML 和 gem 王子。因此,当同一个控制器用于通过浏览器返回 PDF 时,我会得到有效的好 PDF。

4

1 回答 1

0

好的。这是王子的问题。它重写了实例方法render,而不是类方法。因此,要生成带有王子的 PDF,我必须调用InstanceController.new.render. 但是它的签名不一样,所以不是很有用。

  1. InstanceController.new.render 只有在第一个参数是哈希时才会调用王子,但在这种情况下我们不能发送动作名称。
  2. 因为第一个项目王子试图从控制器中获取动作名称action_name,在我们的例子中它是nil并且崩溃。

但同时,我找到了从html显式生成pdf的方法

princely = Princely::Pdf.new
document = princely.pdf_from_string(InstanceController.render action_name, options) # it generates valid PDF from html
于 2018-08-10T18:17:58.753 回答