首页 > 解决方案 > 如何根据 Rails 应用程序中的视图生成 PDF

问题描述

概述

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

问题

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

我尝试过的事情

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

但是我遇到了几个问题:

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

标签: ruby-on-railsrubyweb-applicationspdf-generationwicked-pdf

解决方案


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

  1. 渲染 PDF 需要很长时间:您可以缓存 PDF 并将它们保存在您的服务器中(使用回形针、activestorage、神殿或其他与 rails 一起使用的文件管理器)。这样,PDF 的生成将只需要时间一次。
  2. 无法使用现有样式表,因为不支持像 flexbox 这样的一些 CSS:正如github this issue所述,flexbox 不受完全支持,即使有一些事情可以工作,例如更改display: flexfor display: -webkit-box。如果在该问题中找到的部分修复不起作用,则解决方案是为 PDF 生成使用非弹性视图。
  3. 格式已关闭:这很可能与由于不受支持的 CSS 属性而导致 CSS 无法正常工作有关。您可以一个一个地修复它们,它们不应该很多,因为 wicked_pdf 确实支持最常见和最常用的 CSS 属性(flexbox 可能是一个例外)
  4. 不支持 ES6:你是对的。您必须为这些视图正确地使用普通的 javascript。
  5. 调试 Javascript 很困难:调试 javascript 和理解它是如何工作的一个关键点,基本上是删除所有可能的动画。例如,如果您正在使用具有“渲染动画”的库(假设谷歌地图具有淡入效果),一旦您移除这些效果,wicked_pdf 将开始渲染谷歌地图,因此没有“淡入”也没有“延迟”,否则 wicked_pdf 将在第 0 秒呈现页面的“屏幕截图”。
  6. wicked_pdf 的调试选项 show_as_html 不能可靠地显示 PDF 的呈现方式:正确,这与 (5) 和 (3) 有关。
  7. ChatJS 和 Google Maps 等一些 JS 库无法正确渲染:如 5 所述,这与渲染方法中的“延迟”有关。wicked_pdf 支持一种名为 javascript_delay 的新 API 方法,您可以在此处找到有关该方法的问题

希望这可以帮助


推荐阅读