【问题标题】:PDF rendering hangs rails 4 serverPDF渲染挂起rails 4服务器
【发布时间】:2017-12-16 23:29:36
【问题描述】:

我有一个 Rails 应用程序,我需要将其中一个视图呈现为可下载的 PDF。视图本身由许多部分组成,而这些部分又由更多部分组成,依此类推。这是顶层视图:

<meta charset="utf-8" />
<%= javascript_include_tag "jquery-ui.min", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "report", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag "report_style", media: "all", "data-turbolinks-track" => true %>
<div class="report">
    <%= render partial: "details", locals: { examinee: @examinee, te: @test_event } %>
    <div class="page-break"></div>
    <%= render partial: "grades", locals: { scores: @test_event.scores, tasks: Task.tasks_for_report(@test_event.language) } %>
    <div class="page-break"></div>
    <%= render partial: "ld", locals: { test_event: @test_event } %>
    <%= render partial: "review", locals: { test_event: @test_event } %>
    <div class="page-break"></div>
    <%= render partial: "appendix" %>
</div>

由于渲染视图的复杂性,我更喜欢从 html 生成 PDF,而不是将所有内容写入两次,一次为 .html.erb,另一次为 pdf.erb。

我已经尝试过 pdfkit 和 wickedpdf,但在这两种情况下我都失败了:

pdfkit 让我的瘦服务器挂起,无论我尝试什么 - 建议的解决方案都没有 hereherehere 有任何影响,事情仍然很糟糕。

wicked_pdf 实际上已成功生成 PDF,但它再次忽略了我所有的 css 和 js 代码,即使使用 wicked_pdf_javascript_include_tag 及其相应的 css 双胞胎调用也是如此。这无法进行,因为我需要分页符和各种 js 脚本创建的所有内容(例如,chartist 制作的一些绘图)。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails-4 pdf wkhtmltopdf pdfkit wicked-pdf


    【解决方案1】:

    如果您使用单线程网络服务器(例如 webrick)运行 Rails,并且您的 PDF 生成过程涉及从应用程序中的另一个端点获取数据(例如 JavaScript 中的 AJAX),它将挂在死锁,因为构建 PDF 的资产请求在实际构建 PDF 之后排队。

    它在生产环境中应该可以正常工作,因为大多数生产环境都设置为运行多个网络工作者(使用乘客或独角兽或其他),但要在开发模式下正确测试它,您需要将应用配置为运行多个网络工作者,因此您的 Ajax 请求可以在另一个线程中发生并返回到您的主请求。

    我建议您将puma gem 添加到您的Gemfile,并使用rails server Puma --workers 3 运行您的开发服务器(顺便说一下,puma 默认包含在新的 Rails 5 应用程序中,因为人们遇到了同样的问题与 ActionCable 请求)。

    wicked_pdf_javascript_include_tag 用于从磁盘读取以加快构建 PDF 的速度,并且在一些库中确实存在一些问题,并且根据您的配置,可能需要在 config.assets.precompile 中命名您的 JS 和 CSS列表。

    【讨论】:

    • 正如我上面所写的,我正在使用支持多线程的 Thin。
    • @Spätzle 但是您是否使用多个线程运行它?默认情况下,它仍然一次只服务一个请求。 thin start --servers 3 应该启动 3 个线程。
    猜你喜欢
    • 2017-12-09
    • 2018-03-21
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2019-05-27
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多