【问题标题】:How to pipe a stream using pdfkit with node js如何使用带有节点js的pdfkit管道流
【发布时间】:2014-07-09 09:09:01
【问题描述】:

在 PDFkit 0.5 之前 - 以下对我有用(通过 pdfkit 生成 pdf/通过 ipp 打印到 CUPS):

var ipp = require("ipp");
var PDFDocument = require("pdfkit");

var doc = new PDFDocument;
doc.text("Hello World");

doc.output(function(pdf)){
    var printer = ipp.Printer("http://127.0.0.1:631/printers/1");
    var file = {
        "operation-attributes-tag":{
            "requesting-user-name": "User",
        "job-name": "Print Job",
        "document-format": "application/pdf"
        },
        data: new Buffer(pdf, "binary")
    };

    printer.execute("Print-Job", file, function (err, res) {
        console.log("Printed: "+res.statusCode);
    });
}

从 PDFkit 0.5 开始 - output 方法已被弃用 - 但我似乎找不到在我的场景中使用新的 pipe 方法的示例。如果我不使用浏览器,是否还需要像 blob-stream 这样的模块?

【问题讨论】:

    标签: node.js node-pdfkit


    【解决方案1】:

    由于 pdfkit PDFDocument 现在是一个流,你必须缓冲来自缓冲区的数据:

    var ipp = require("ipp");
    var PDFDocument = require("pdfkit");
    
    var doc = new PDFDocument;
    doc.text("Hello World");
    
    var buffers = [];
    doc.on('data', buffers.push.bind(buffers));
    doc.on('end', function () {
        var printer = ipp.Printer("http://127.0.0.1:631/printers/1");
        var file = {
            "operation-attributes-tag":{
                "requesting-user-name": "User",
            "job-name": "Print Job",
            "document-format": "application/pdf"
            },
            data: Buffer.concat(buffers)
        };
    
        printer.execute("Print-Job", file, function (err, res) {
            console.log("Printed: "+res.statusCode);
        });
    });
    doc.end();
    

    或者你可以使用concat-stream模块之类的东西:

    var ipp = require("ipp");
    var PDFDocument = require("pdfkit");
    var concat = require("concat-stream");
    
    var doc = new PDFDocument;
    doc.text("Hello World");
    
    doc.pipe(concat(function (data) {
        var printer = ipp.Printer("http://127.0.0.1:631/printers/1");
        var file = {
            "operation-attributes-tag":{
                "requesting-user-name": "User",
            "job-name": "Print Job",
            "document-format": "application/pdf"
            },
            data: data
        };
    
        printer.execute("Print-Job", file, function (err, res) {
            console.log("Printed: "+res.statusCode);
        });
    }));
    doc.end();
    

    【讨论】:

    • 完美运行!谢谢!
    • 这也适用于我。请务必致电doc.end() 以实际触发结束事件。我已经为遇到这个新图书馆的任何人添加了一个编辑。
    • 您好!我想在我的代码中使用该建议。不幸的是,我遇到了一个问题:当我尝试保存执行 fs.writeFileSync('test.pdf', buffers) 以获取其内容的二进制数据时,它会生成一个损坏的文件。 @Josiah 有什么建议吗?非常感谢。
    • 是的,您可以将缓冲区连接到一个缓冲区中,然后才能将其传递给 fs.writeFileSync:fs.writeFileSync('test.pdf', Buffer.concat(buffers))。当然,要正确地做到这一点,您应该流式传输,并且不需要缓冲:doc.pipe (fs.createWriteStream('test.pdf'))
    • 这对使用doc.on('end') 很有帮助。花了 4 个小时试图让这个工作和你的解决方案修复它。让我创建一个临时文件上传到其他地方,而现在我可以直接发送缓冲区。
    猜你喜欢
    • 2019-11-27
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多