从 Rails CSS 文件渲染图像以用于 Wicked PDF

rendering an image from a rails css file for wicked PDF

提问人:Jerome 提问时间:11/9/2023 更新时间:11/9/2023 访问量:54

问:

对象的级联嵌套通过相对于嵌套级别的图像进行标识:

#nestedlist, #nestedlist li {
  font-size: 12px;
  list-style-type: none;
}
#nestedlist ul  {
  list-style-image: url("/yellow_dark.png"); 
} 
/* UL Layer # Rules based on quantity_of_ul */
#nestedlist ul ul  {
  list-style-image: url("red_base.png"); 
}
#nestedlist ul ul ul {
  list-style-image: url("/green_light.png");
}

等。

无论图像的位置如何,这都可以在浏览器中正确呈现,无论是在公共目录还是在资产目录中。但是,邪恶的 PDF 需要图像的绝对路径,并且无法处理上述内容;如果未指定,它将返回空白或黑色项目符号。尝试使用,但唉,不采取颜色选项。list-style-type: none;list-type: square;

如何强制转换 css 文件,以便为 wicked_pdf 布局调用的预编译 css 文件中的图像提供绝对 URL?pdf

CSS Ruby-on-Rails wicked-pdf

评论

0赞 dbugger 11/9/2023
将基础 css 文件复制到wicked_pdf版本,并将 url(“ 替换为 url(your_absolute_path
0赞 Jerome 11/9/2023
是的,我可以使用外部静态源来做到这一点。我想我应该指定目标是从应用程序的目录(公共或资产)中提供它,从而使用 rails 命令;我只是不清楚在 css 文件中正确呈现的语法。
0赞 dbugger 11/9/2023
可以动态生成 CSS,但在任何情况下,CSS URL 都采用绝对文件引用

答:

0赞 Alex 11/9/2023 #1

您必须配置asset_host,因为当它没有具体设置时,wickedpdf 将使用本地 url,这对我不起作用:file://

if pathname =~ URI_REGEXP
  # asset_path returns an absolute URL using asset_host if asset_host is set
  pathname
else
  File.join(Rails.public_path, asset.sub(/\A#{Rails.application.config.action_controller.relative_url_root}/, ''))
end

https://github.com/mileszs/wicked_pdf/blob/2.6.3/lib/wicked_pdf/wicked_pdf_helper/assets.rb#L131


# config/environment/development.rb

config.action_controller.asset_host = "http://localhost:3000"
/* app/assets/stylesheets/pdf.css */

ul {
  list-style-image: url("circle.svg");
}
<!-- show.pdf.erb -->

<%= wicked_pdf_stylesheet_link_tag "pdf" %>

<ul>
  <li>Peaches</li>
  <li>Apples</li>
  <li>Plums</li>
</ul>

wicked_pdf_stylesheet_link_taghelper 现在输出以下内容:

<style type='text/css'>
ul {
  list-style-image: url(http://localhost:3000/assets/circle-a438dbaaf222a262201c1d46bd32e81d2ecb96f95fd50d00a5ad9b57a7778248.svg);
}
</style>

pdf


您也可以尝试显式使用 来获取完整的 url 或内联数据 url。asset_url("circle.svg")wicked_pdf_asset_base64("circle.svg")