Play Framework:PDF'通过Job使用highcharts JS库的模板

时间:2011-12-14 08:26:18

标签: java playframework pdf-generation highcharts

这是我制作的previous post的扩展名。

总结一下发生了什么:

  • 我正在使用一个每小时执行一次的Job,它将生成一个PDF作为附件发送到电子邮件中
  • 作业没有做太多工作,但直接呼叫控制器以生成PDF并发送电子邮件。我打电话给控制器来完成工作,因为我正在使用PDF模块(当前)需要HTTP请求作为其PDF处理的一部分。以下是我通过Job调用控制器的方法:

    WS.url( “我的/ URL /该/点/到/与/控制器”)得到();

  • 我之前发布的包含高图JS图表的PDF的问题在于它生成了图表客户端,这对于PDF生成来说已经太晚了,因此我的PDF生成减去了图表。为了解决这个问题,我现在使用highcharts-serverside-export生成图表服务器端

如果我使用上面的相同类并在浏览器中呈现模板(即直接通过控制器并忽略作业),则会在服务器端创建图表,并在浏览器中正确呈现视图。

我通过调用另一个控制器来生成模板中的图表:

<img src="@{ChartGenerator.go()}">

ChartGenerator控制器基本上按照highcharts-serverside-export文档构建图表服务器端,并调用Play的renderBinary方法。

正如我所说,模板在浏览器中使用服务器端生成的图表呈现正常。但是,当通过每小时执行一次的Job时,ChartGenerator.go()调用似乎不起作用。控制台吐了出来:

INFO  ~ /chartgenerator/go is not a URL; may be relative.

有没有人有任何想法如何解决这个问题?我已经证明它可以减去工作,现在需要弄清楚为什么在通过工作时,它似乎不起作用。

编辑:根据Pere的建议,我的模板现在通过这样做来调用ChartGenerator类(注意双@):

 <img src="@@{ChartGenerator.go()}">

我认为这让我更进一步,现在这在日志中出现了争吵:

Error during job execution (fun.EmailJob)
Execution exception (In /fun/EmailJob.java around line 19)
RuntimeException occured : java.util.concurrent.ExecutionException: java.util.concurrent.TimeoutException: No response received after 60000
...
09:23:54,687 WARN  ~ bad URL given: http://<full url>/chartgenerator/go
java.net.SocketTimeoutException: Read timed out

如果我点击 http://&lt;的网址在浏览器中,full urrts&gt; / chartgenerator / go 正确地在浏览器中呈现了highcharts png文件。正如预期的那样,即使在这个double @ change之后,如果我在浏览器中渲染模板(没有pdf'ing),模板也会正确地呈现服务器端生成的图表。

编辑#2:我遇到这些问题似乎是通过从模板中调用控制器来渲染图像(二进制),我想知道是否可以传递文件object(包含图像)作为模板的render(...)方法的参数。例如,假设呈现模板的控制器执行此操作:

File image = ... // PNG chart as built by the highcharts-serverside-export library
...
File emailAttachment = new File("attachment.pdf");
PDF.writePDF(emailAttachment, "myTemplate.html", image); // This calls the PDF module to render the PDF from the given template and write it to the attachment.pdf File object

我想知道我是否可以直接在模板中渲染该图像而无需通过 @@ {...} 方式?

我尝试在模板中添加 $ {image} ,但这只是在屏幕上呈现 attachment.pdf (有点期待)。

编辑#3 :这是ChartGenerator类的样子:

public final class ChartGenerator extends Controller {
    public static void go() throws Exception {
        ChartOptions options = SamplesFactory.getSingleton().createColumnBasic();
        HighchartsExporter pngExporter = ExportType.png.createExporter();
        File chart = new File("column-basic.png");
        pngExporter.export(options, null, chart);
        response.setContentTypeIfNotSet("image/png");
        renderBinary(chart);
    }
}

我目前只是生成一个示例图表服务器端来证明它可以是pdf'ed。生成示例图表是根据highcharts-serverside-export文档完成的。

编辑#4:我还尝试向控制器添加一个动作方法以允许在浏览器中进行pdf'ing,而服务器端生成的高图也不会出现在pdf和之前提到的异常仍然发生。所以我可以排除它是Job to Controller工作流程的问题。 (当然渲染没有pdf的模板仍然可以正常工作)

编辑#5:为了帮助缩小问题的可能原因,我决定忽略highcharts(以及highcharts-serverside-export库)并只使用简单的服务器端图表库jfreechart的。同样,我可以在没有pdf的情况下渲染模板,但是一旦我尝试pdf包含图表的模板(通过前面提到的@@调用呈现),它最终会因同样的原因失败(即给出错误的URL, java.net.SocketTimeoutException:读取超时)。

2 个答案:

答案 0 :(得分:1)

好的,我已经设法让它工作(最后)。 这一切都源于我处于DEV模式的事实(显然是因为我仍在开发这一点功能)。但在DEV模式下,我(默认情况下)只能访问一个线程。所以我所要做的就是取消注释application.conf中的执行池:

play.pool=3

然后我的高图开始在服务器上呈现,然后作为PDF的一部分插入。附加线程用于呈现图表的请求。一个线程对于这种情况是不够的,因此调用URL来呈现图像二进制文件。

答案 1 :(得分:0)

您的问题似乎是相对网址,请将代码更改为:

<img src="@@{ChartGenerator.go()}"> //notice double @@

生成绝对路径