【问题标题】:Play Framework: Generate PDF from template that uses Javascript for graphingPlay Framework:从使用 Javascript 进行绘图的模板生成 PDF
【发布时间】:2012-01-08 10:36:09
【问题描述】:

我有一个模板,其中包含一些用于在浏览器中生成图形的 Javascript。我想使用相同的模板创建 PDF 并在电子邮件中作为附件发送。在这种情况下,将没有浏览器/客户端交互。

我正在使用 Play 网站上提供的 PDF 模块,并且我已经设法让 PDF 渲染工作。唯一的问题是图形不会显示在 PDF 中,但所有其他静态文本都会显示。我假设由于在 PDF 生成之前没有执行 Javascript,这些图表没有出现在 PDF 中。

有人对如何解决这个问题有任何想法吗?

【问题讨论】:

    标签: java javascript pdf-generation playframework


    【解决方案1】:

    由于您使用的是 Play 框架,因此最简单的方法可能是使用 Rhino。 http://www.mozilla.org/rhino/ 那是 Mozilla 在 JVM 上运行的 Javascript 的实现,Play 框架就是在它上面运行的。您可能必须对 Javascript 进行一些更改,例如,如果它使用浏览器 Canvas API,您将必须创建一个外观对象,将这些绘图命令发送到 PDF 绘图对象而不是屏幕。或者如果你想要的话,两个地方都可以。

    如果您提供有关 Javascript 图形代码的更多信息,您可能会得到更详细的答案。

    【讨论】:

    • 我们正在使用渲染为 SVG 的 hicharts 库 (highcharts.com)。
    • 而且人们正在使用 Rhino 在服务器上运行 highcharts highslide.com/forum/viewtopic.php?f=9&t=6971&start=15
    • @Michael 我是你提到的“人”,我们放弃了 Rhino 的 highCharts。对于 SVG 元素的 (0,0,0,0) 边界框,我们有很多与位置相关的问题,这迫使我们在服务器端重新实现 Highcharts。我们改用 wkhtmltopdf
    【解决方案2】:

    如果找不到更好的选择,请考虑直接使用 itext。它是一个用于 pdf-plugin 的 pdf 渲染库。您必须手动重写模板以生成 pdf,但您可以完全控制结果。

    【讨论】:

      【解决方案3】:

      我不知道这是否对你有帮助,但这对我来说真的很快。

      我将画布转换为 PNG:

      var datastring = document.getElementById('myCanvas').toDataURL("image/png");
      

      然后我将该数据字符串发送到服务器,以便 Play 生成 PDF,并将变量传递给 PDF 生成器

      public static void reportPDF(String graphData){
          PDF.renderPDF(graphData);
      }
      

      我的 pdf 代码如下所示:

          <body>
              <img width="100%" src="${graphData}"/>
          </body>
      

      【讨论】:

        猜你喜欢
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-11
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        相关资源
        最近更新 更多