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

时间:2013-01-21 01:36:53

标签: ruby-on-rails ruby pdf wkhtmltopdf

这是一个奇怪的小问题,导致我在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) => "" 

注意最后一位。我指的是本地文件,但它正在通过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 (sometimes it will work just to ignore this error with --load-error-handling ignore)
=> false 

请注意,这个在库中以小写“l”失败。有没有搞错? (并且,根据建议忽略该开关的错误,它没有任何改善。)

有什么想法吗?是否有Rails或Ruby设置会导致系统命令被重写?有没有我可以添加到wkhtmltopdf的选项,以确保它从本地文件加载?我很困惑。谢谢!

3 个答案:

答案 0 :(得分:1)

我在使用绝对文件路径时取得了成功(注意file://之后的额外斜杠)

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

这在Windows上是一样的

Unix路径

file:///absolute/path/to/file

Windows路径

file:///C:/absolute/path/to/file

答案 1 :(得分:1)

最后0.11 whicked-pdf我发现了一个bug 例 C:\ Ruby193 \ lib中\红宝石\宝石\ 1.9.1 \宝石\ wicked_pdf-0.11.0 \ lib中> wicked_pdf.rb 第198行我改变了:
options [hf] [:html] [:url] =" file://#{tf.path}" to options [hf] [:html] [:url] =" file:///#{tf.path}" - (将//更改为///)
改变后whicked-pdf再次起作用。

答案 2 :(得分:0)

看看wicked_pdf gem。 您可以添加PDF mime类型,然后添加您想要pdf的任何页面,只需将.pdf添加到URL。

我在生产中使用它并且效果很好。 无需直接调用wkhtmltopdf。