我只使用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看起来像
如果我使用
%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)
替换为相同的结果
答案 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看起来像: