这是一个奇怪的小问题,导致我在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的选项,以确保它从本地文件加载?我很困惑。谢谢!
答案 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。