小编las*_*des的帖子

从WickedPDF获取PDF以通过Carrierwave进行附件

在Rails3中,我使用它WickedPDF gem来渲染我的一个模型的PDF格式.这很好用:/invoices/123返回HTML,/invoices/123.pdf下载PDF.

在我的发票模型中,我使用state_machine gem来跟踪发票状态.当发票从"未开单"状态变为"开票"状态时,我想获取发票PDF的副本并使用CarrierWave将其附加到发票模型.

我将这三个部分分开工作:控制器创建PDF视图,模型跟踪状态并在进行正确转换时触发回调,并正确设置CarrierWave.但是,我有一段时间让他们一起玩得很好.

如果我只是想获取发票的HTML版本,我可以render_to_string从模型中调用.但render_to_string似乎在收到PDF二进制文件时窒息.如果我可以获得一个数据流,那么很容易将这些数据写入临时文件并将其附加到上传器,但我无法弄清楚如何获取数据流.

有什么想法吗?代码如下:

发票控制器

def show
  @invoice = @agg_class.find(params[:id])

  respond_to do |format|
    format.pdf do
      render_pdf
    end
    format.html # show.html.erb
    format.json { render json: @aggregation }
  end
end
Run Code Online (Sandbox Code Playgroud)

...

def render_pdf(options = {})
  options[:pdf] = pdf_filename
  options[:layout] = 'pdf.html'
  options[:page_size] = 'Letter'
  options[:wkhtmltopdf] = '/usr/local/bin/wkhtmltopdf'
  options[:margin] = {
    :top      => '0.5in',
    :bottom   => '1in',
    :left     => '0in',
    :right    => '0in'
  }
  options[:footer] = {
    :html => { …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails wkhtmltopdf carrierwave wicked-pdf

15
推荐指数
1
解决办法
5407
查看次数

wkhtmltopdf尝试从http而不是文件加载

这是一个奇怪的小问题,导致我在SO上发布我的第一个问题.我使用wkhtmltopdf将HTML文档转换为PDF作为Rails应用程序的一部分.为此,我将Rails网页呈现为临时目录中的静态HTML文件,将静态页眉,页脚和图像复制到同一临时目录,然后使用"system"执行wkhtmltopdf.

这在开发和测试环境中非常有效.在我的Staging环境中,它没有.我首先怀疑权限,但该过程的前几部分(创建HTML静态文件并将它们复制到目录中)正在运行.我可以从该临时目录中的命令行运行wkhtmltopdf并获得预期的结果.最后,我通过"系统"和反引号在staging环境中通过Rails控制台运行wkhtmltopdf,这是我得到的输出:

> `wkhtmltopdf --footer-html tmp/invoices/footer.html --header-html tmp/invoices/header.html -s Letter -L 0in -R 0in -T 0.5in -B 1in tmp/invoices/test.html tmp/invoices/this.pdf`
Loading pages (1/6)
QPainter::begin(): Returned false                            ] 10% 
Error: Unable to write to destination                             
Error: Failed loading page http://tmp/invoices/test.html (sometimes it will work just to ignore this error with --load-error-handling ignore) => "" 
Run Code Online (Sandbox Code Playgroud)

注意最后一位.我指的是本地文件,但它正在通过http查找它们.好吧,我想,也许我需要明确并将其提供给file://协议,因此它不会寻找http.所以我试试这个:

> system("wkhtmltopdf --footer-html file://Library/Server/Web/Data/Sites/intranet-staging/current/tmp/invoices/footer.html --header-html file://Library/Server/Web/Data/Sites/intranet-staging/current/tmp/invoices/header.html -s Letter -L 0in -R 0in -T 0.5in -B 1in file://Library/Server/Web/Data/Sites/intranet-staging/current/tmp/invoices/test.html file://Library/Server/Web/Data/Sites/intranet-staging/current/tmp/invoices/this.pdf")
Loading pages (1/6)
Error: Failed loading page file://library/Server/Web/Data/Sites/intranet-staging/current/tmp/invoices/test.html …
Run Code Online (Sandbox Code Playgroud)

ruby pdf ruby-on-rails wkhtmltopdf

9
推荐指数
2
解决办法
3584
查看次数

标签 统计

ruby-on-rails ×2

wkhtmltopdf ×2

carrierwave ×1

pdf ×1

ruby ×1

wicked-pdf ×1