繁体   English   中英

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

[英]How can I generate a PDF based on a view in a Rails app

总览

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

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

我尝试过的事情

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

但是我遇到了一些问题:

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

一定会有更好的办法...

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

  1. 渲染PDF需要很长时间:您可以缓存PDF并将其保存在服务器中(使用回形针,活动存储,神社或其他可与Rails配合使用的文件管理器)。 这样,PDF的生成将只花费一次时间。
  2. 无法使用现有样式表,因为不支持某些CSS(例如flexbox):如github所述,即使有几项有用的工作,例如,完全不支持flexbox,例如更改display: flex for display: -webkit-box 如果在该问题中发现的部分修正不起作用,解决方案将是为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方法,您可以在此处找到相关问题

希望这可以帮助

如果要在使用端点时从模型生成报告并渲染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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM