我正在使用phantomjs在我的nodejs应用程序中用HTML创建一个pdf文档。到目前为止,这完全有效。现在我想直接将此文件打印到网络打印机。我正在使用节点打印机模块,打印本身也可以。但仅限RAW格式。
var format = 'RAW';
var printerName = '\\\\PRNTSRV\\Kyo Copy Printer';
var data = fs.readFileSync('./tmp/phantom.tmp.pdf');
printer.printDirect({
data: data,
printer: printerName,
type: format,
success: function(id) {
console.log('printing done with id', id);
res.json({
success: true,
message: 'printed at ' + printerName
});
},
error: function(err) {
console.log('error on printing: ' + err);
}
});
当一些打印机将pdf文档作为RAW发送时,它会理解它,但是我们的许多打印机(尤其是最终需要系统的标签打印机)不了解PDF文件格式,我必须将它们作为EMF发送。我试过TEXT也没用,所以这一切都指向EMF。
我尝试使用node-imagemagick和node-pdfium将pdf转换为emf但我无法同时运行。 Imagemagick生成了空文档,我没有得到node-pdfium来编译。当我使用 npm install pdfium 时,它每次都会中断。 github页面上存在一个关于此类错误的未解决问题,但自4月以来没有响应,所以我想我还要找到另一种选择。
现在我的问题是,如何在不使用imagemagick和node-pdfium的情况下将PDF文件转换为EMF格式?
更新
我现在使用ghostscript(pdf2ps)生成一个postscript文件,并尝试将其作为RAW发送到多台打印机,但这也不起作用。我正在生成这样的postscript,它工作正常并生成有效的level2 postscript文件:
var exec = require('child_process').exec;
exec(
'"' + config.gs_binary + '" '
+ '-dNOPAUSE -dBATCH -sDEVICE=ps2write '
+ '-sOutputFile=' + outFile '
+ inputFile
, function(err, stdout,stderr) {
console.log(err, stdout, stderr);
// continue with sending to printer with RAW and printer.printDirect and
// using the ps file instead of the pdf file...
}
);
postscript文件的内容(摘录)
%!PS-Adobe-3.0
%%BoundingBox: 0 0 216 111
%%HiResBoundingBox: 0 0 216.00 111.00
%%Creator: GPL Ghostscript 915 (ps2write)
%%LanguageLevel: 2
%%CreationDate: D:20151002103717+02'00'
%%Pages: 1
%%EndComments
%%BeginProlog
/DSC_OPDFREAD true def
/SetPageSize true def
/EPS2Write false def
currentdict/DSC_OPDFREAD known{
currentdict/DSC_OPDFREAD get
}{
false
}ifelse
10 dict begin
[...]
将ps文档作为RAW发送到打印机后,它仍然可以识别它,但结果因打印机而异。例如他们拒绝打印,他们展示了一个protocolerror或他们打印了很多页面的胡言乱语(胡言乱语>不是ps内容作为文本)。
更新2
由于我没有得到RAW发送给打印机的PostScript文件,我做了另一种有效的方法(现在)。我像往常一样生成pdf,然后将其与处理打印部件require('child_process').exec(...)
的printername一起发送到外部二进制文件。让我们看看何时会遇到第一个限制。