如何在Node.js中使用pdflatex子进程获取PDF流?

8
这是我的文件:
.
├── app.js
├── res.cls
└── res.tex

以下是我的app.js文件的相关内容:

const { spawn } = require('child_process')
const latex = spawn('pdflatex', ['res.tex'])

成功运行此代码将在同一目录中创建一个res.pdf文件。然而,我想要的不是创建文件,而是获取PDF流并将其作为响应立即发送给浏览器。 我试图避免在服务器上创建任何PDF文件,我只想立即发送生成的PDF作为响应。是否可以修改此代码以实现此目的?


这会有点棘手。我尝试在输出目录中创建了一个名为 res.pdf 的命名管道。这个方法可以让 pdflatex 尝试向其中写入(而不删除它),但显然它也试图在其输出文件中寻找,这在管道中当然是不可能的。为什么不直接读取输出文件呢?如果你在内存文件系统上完成所有操作,速度应该足够快。 - Thomas
抱歉,我想澄清一下,实际上我正在尝试防止创建文件。我不想真正保存文件,我只想将其创建并直接作为响应发送,而不必在目录中创建文件。 - Saad
一个典型的LaTeX运行会创建多个文件。例如,它通常还会生成.aux.log文件。你仍然没有澄清为什么要防止创建文件...不要陷入XY问题的陷阱 :) - Thomas
你说得对,很抱歉没有提供更多的信息。我基本上正在创建一个Web应用程序,它接受用户表单输入,从中创建自定义PDF,然后将PDF发送回用户。因此,我不想用生成的PDF堵塞服务器。我忘记了.aux.log和其他生成的东西,我想避免这些东西。我目前唯一能想到的就是在发送响应后立即删除所有生成的文件,但这似乎不是很好的做法。 - Saad
你尝试过这个node.js latex-wrapper吗? - Asmus
嘿,Asumus,那就是我最初尝试使用的东西。不幸的是,如果我的.tex文件需要与.cls文件或字体文件一起使用,我认为我不能使用它。不过我可能错了,如果有任何帮助,将不胜感激。 - Saad
3个回答

1
这可能有点晚了,但我最终还是写了一个自己的latex包装器。它允许您使用字体和.cls等其他输入。它创建了一个temp目录,将生成的PDF放在其中,然后将PDF流返回给您。之后会清理temp目录。
您可以在此处查看该模块:node-latex

0

0

node-pdflatex有以下方法。

var util = require('util');
var path = require('path');
var fs = require('fs');
var exec = require('child_process').exec;

/*
 PDFLatex class
*/
// constructor
function PDFLatex(inputPath) {
    // default settings
    this.outputDirectory = process.cwd() + "/";
    this.inputPath = inputPath;
};

PDFLatex.prototype.outputDir = function(path) {
    this.outputDirectory = path;
    return this;
};

PDFLatex.prototype.process = function() {
    if (this.inputPath && this.inputPath.length > 0) {
        var command = "pdflatex -output-directory " + this.outputDirectory + " '" + this.inputPath + "'";
        util.puts(command);
        exec(command, function(err) {
            if (err) throw err;
        });
    }
};
解决方案

一旦文件生成,我们可以读取文件,从目录中取消链接并将响应发送到浏览器。

 var outputDir = '/dir/pdf/a.pdf'.
 if(fs.existsSync(outputDir)) {

    var check = fs.readFileSync(outputDir);
    fs.unlinkSync(outputDir);
    res.attachment(name+'.pdf');
    res.end(check);
 }

希望这能有所帮助。

这个操作是否仍会在我的服务器上创建PDF文件?我正在尝试修改代码,使得PDF文件不再实际创建于服务器上,而是直接作为响应发送到浏览器,避免其留存在我的服务器中。 - Saad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接