如何直接从节点应用程序打印PDF文件?

时间:2015-10-01 13:42:32

标签: node.js pdf printing

我正在使用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一起发送到外部二进制文件。让我们看看何时会遇到第一个限制。

0 个答案:

没有答案