如何基于Rails应用程序中的视图生成PDF

时间:2019-07-04 11:25:10

标签: ruby-on-rails ruby web-applications pdf-generation wicked-pdf

概述

我想使用自己在应用程序本身中的模型基于Rails应用程序中的视图生成PDF(即访问特定端点将呈现PDF报告)。

问题

这样做的标准/有效方式是什么?

我尝试过的事情

我尝试使用wicked_pdfPDFKit。两者都依赖于wkhtmltopdf

但是我遇到了一些问题:

  • 渲染PDF需要很长时间
  • 无法使用现有样式表,因为不支持某些CSS,例如flexbox
  • 格式已关闭
  • 不支持ES6
  • 调试Java脚本很困难
  • wicked_pdf的调试选项show_as_html不能可靠地向您展示PDF的呈现方式
  • ChatJS和Google Maps等一些JS库无法正确显示
  • 使用javascript_delay似乎是灵丹妙药,但不能解决第三方库的问题

一定有更好的方法...

2 个答案:

答案 0 :(得分:1)

我能想到的实现这种目标的唯一方法是一一解决您要提出的问题。根据我的经验,wicked_pdf是最好的选择。关于您要提出的问题:

  1. 渲染PDF需要很长时间:您可以缓存PDF并将其保存在服务器中(使用回形针,activestorage,shrine或其他与rails配合使用的文件管理器)。这样,PDF的生成只需一次。
  2. 由于不支持某些CSS(如flexbox),因此无法使用现有样式表:如github this issue所述,即使有一些有效的方法,例如更改{{1} } display: flex。如果在该问题中发现的部分修正不起作用,则解决方案是为PDF生成提供非弹性视图。
  3. 格式已关闭:这很可能与CSS由于不受支持的CSS属性而无法正常工作有关。您可以一一修复它们,但不应太多,因为wicked_pdf确实支持最常用和最常用的CSS属性(flexbox可能是一个例外)
  4. 不支持ES6:您是对的。对于这些视图,您必须使用普通的javascript。
  5. 调试Java脚本很困难:调试Java脚本并了解其工作原理的一项主要收获是,基本上消除了所有可能的动画。例如,如果您使用的库具有“渲染动画”(假设Google地图具有淡入淡出的效果),则wicked_pdf将在您删除这些效果后开始渲染Google地图,因此不会出现“淡入”或“延迟”,否则wicked_pdf将获取在第二秒0呈现的页面的“屏幕快照”。
  6. wicked_pdf的调试选项show_as_html无法可靠地显示PDF的呈现方式:正确,这与(5)和(3)有关。
  7. 某些JS库(如ChatJS和Google Maps)无法正确渲染:如5中所述,这与render方法中的“延迟”有关。 wicked_pdf支持一种名为javascript_delay的新API方法,您可以在其中找到问题about here

希望这会有所帮助

答案 1 :(得分:-1)

如果要使用模型生成报告并使用端点渲染pdf,则必须在服务器上生成报告。

但是,如果您不想在服务器上使用pdf生成器(wickedpdf或pdfkit)来生成它,并且您拥有html,则可以使用javascript打印功能,而不想包含的标签可以隐藏使用媒体打印CSS进行打印。

但是,如果要生成某种证书,这不是一个好方法(安全),因为用户可以使用浏览器检查功能编辑html,然后打印。

<!DOCTYPE html>
<html>
<body>
<style type="text/css">
@page { size: auto;  margin: 0mm; }
@media print {
  .hide_printing {
      display :  none;
  }
}
</style>
<p>Click the button to print the current page.</p>

<button class="hide_printing" onclick="myFunction()">Print this page</button>

<script>
function myFunction() {
  window.print();
}
</script>

</body>
</html>