HAML :: Engine,图像不渲染

时间:2018-03-17 21:29:53

标签: ruby rubygems haml pdfkit

我只使用Ruby(没有rails)来创建一个gem,它将yaml文件作为输入,它生成一个pdf。 我正在使用pdfKit和Haml。在haml文件中,我需要渲染图像。使用纯HTML时,PDFKit会显示图像,但是当使用Haml :: Engine和haml文件时,图像不会被渲染。

我已将图片,.module和haml文件放在一个文件夹下,以确保问题不是路径。

在我的gemspec中,我有以下内容 。

gem.add_development_dependency("pdfkit", "0.8.2")
gem.add_development_dependency("wkhtmltopdf-binary")
gem.add_development_dependency("haml")

有效的HTML:

<html>
  <head>
    <title>
      junk
    </title>
  </head>
  <body>
    HI
    <img src="watermark.png"/>
    Bye
  </body>
</html>

不起作用的Haml版本:

%html
  %head
    %title
      junk
  %body
    HI
    = img "watermark.png"
    Bye

模块:

require "pdfkit"
require "yaml"
require "haml"
require "pry"
.
.

junk = Haml::Engine.new(File.read("lib/abc/models/junk.haml")).render
kit2 = PDFKit.new(junk)
kit2.to_file("pdf/junk.pdf")

当使用html文件时,pdf渲染图像,但是,当我使用haml时,现在我的pdf看起来像

enter image description here

如果我使用

%img(src="watermark.png")

生成pdf时出现以下错误 Exit with code 1 due to network error: ContentNotFoundError

PDF仍会生成,但仍然看起来像上图。

所以我试图在不使用任何rails和img_tag,image_tag等的情况下看到..如何在haml文件中使用%img来呈现正确的图像

当我创建@img = "watermark.png"

时,以下是垃圾输出

1 pry(DD)&gt;垃圾

=> "<html>\n<head>\n<title>\njunk\n</title>\n</head>\n<body>\nHI\n<img src='watermark.png'>\nBye\n</body>\n</html>\n"

将img标记%img(src=@img)替换为相同的结果

2 个答案:

答案 0 :(得分:2)

我认为这不是HAML问题,而是wkhtmltopdf。显然它在处理图像的相对网址方面并不是很擅长。它应该使用绝对路径,例如:

%img(src="/home/user/junk/watermark.png")

答案 1 :(得分:0)

要在HAML中创建图像标记,您需要使用

%img(src="foo.png")
# or
%img{src: "foo.png"}

如果您使用

= img "watermark.png"

然后调用img方法(如果存在),将其作为参数传递给"watermark.png",并在生成的HTML中输出该方法的返回值。

老实说,当生成相同HTML的HAML模板没有时,我不确定HTML模板应该如何工作。所以我猜你从不同的目录运行那个脚本?

无论如何:问题是,您需要文件的绝对路径。否则wkhtmltopdf将无法解析您的图像。 您可以使用File.expand_path(请参阅示例),或编写自定义帮助程序。

我试过以下:

创建了两个文件:

/tmp/script.rb
/tmp/watermark.png
/tmp/template.haml

watermark.png 是我从这个问题中截取的截图, script.rb 是:

require "pdfkit"
require "haml"

template = File.read("template.haml")
html = Haml::Engine.new(template).render
File.write("template.html", html)
pdf = PDFKit.new(html)
pdf.to_file("output.pdf")

template.haml 是:

%html
  %head
    %title Something
  %body
    BEFORE
    %img(src="#{File.expand_path(__dir__, "watermark.png")}")
    AFTER

当我运行这样的脚本时:

ruby-2.5.0 tmp$ ruby script.rb

然后生成的HTML是:

<html>
<head>
<title>Something</title>
</head>
<body>
BEFORE
<img src='/tmp/watermark.png'>
AFTER
</body>
</html>

生成的PDF看起来像:

enter image description here