Nodejs:将请求有效负载流式传输到java应用程序,然后再响应

时间:2015-12-09 11:58:54

标签: java node.js stream pipe wkhtmltopdf

我需要通过流将html转换为pdf,因为将html保存到文件然后再次读取以发送到wkhtmltopdf会占用所有可用内存。

以下是我认为可以使用wkhtmltopdf完成的方式:

Node stream > java application wrapping wkhtmltopdf > Node stream

因此,在我的应用程序中,我将从数据源读取数据,将数据传输到java应用程序,该应用程序将数据转换为pdf,然后通过管道传输到响应流。

目前,我正在做一些简单的测试,看它是如何工作的。我的问题是将数据从节点传递到java应用程序并将其返回以将其传输到响应流。

这两个代码都很简单:

节点(是的,那是coffeescript):

http = require 'http'
child = require('child_process').spawn 'java', ['PdfStream'], stdout: ['pipe', 'pipe', process.stderr]

server = http.createServer().listen 8000
server.on 'request', (req, res) ->
    res.writeHead 200, 'Content-Type': 'application/pdf'
    req.pipe(child.stdout, end: false).pipe res, end: true

爪哇:

public class PdfStream {

public static void main(String[] args) throws IOException {

    String[] command = {"wkhtmltopdf", "-", "-"};
    ProcessBuilder builder = new ProcessBuilder(command);
    Process process = builder.start();

    BufferedWriter pdfOut = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    try {
        String line;
        while ((line = in.readLine()) != null) {
            pdfOut.write(line);
            pdfOut.flush();
        } 
    } catch (IOException e) {
        //  exception? what exception?
    } finally {
        if (pdfOut != null) {
            pdfOut.close();
        }
        if (in != null) {
            in.close();
        }
    }
}
}

但是当我向节点服务器发出POST请求时,没有任何结果。我试着写信给Sytem.out,如果我

cat file.html | java PdfStream

,它有效。另外,如果我更改传递给ProcessBuilder的输出流,如

String[] command = {"wkhtmltopdf", "-", "test.pdf"};

一切都很好。

你能说出这段代码有什么问题吗?

1 个答案:

答案 0 :(得分:0)

突然间,它打击了我:使用java包装器执行程序的重点是什么?我可以直接从节点做到。然后,我阅读了wkhtmltopdf文档,在寻找将流传递到其中的正确方法的同时,我偶然发现了一个名为wkhtmltox(https://www.npmjs.com/package/wkhtmltox)的好灵魂的npm包,它实际上是极端的。做我尝试的方式并不简单:

server = http.createServer().listen 8000
server.on 'request', (req, res) ->
    res.writeHead 200, 'Content-Type': 'application/pdf'
    converter.pdf(req).pipe(res).on('finish', -> console.log 'finished')

它按照承诺行事。