我需要通过流将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"};
一切都很好。
你能说出这段代码有什么问题吗?
答案 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')
它按照承诺行事。