Arhn - архитектура программирования

Как передать поток с помощью pdfkit с узлом js

До PDFkit 0.5 у меня работало следующее (создание pdf через pdfkit/печать через 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?

20.05.2014

Ответы:


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();
21.05.2014
  • Работал отлично! Спасибо! 22.05.2014
  • Это работает и для меня. Обязательно вызовите doc.end(), чтобы фактически запустить конечное событие. Я добавил редактирование для всех, кто сталкивается с этим новым в библиотеке. 07.01.2015
  • Всем привет! Я хотел бы использовать это предложение в своем коде. К сожалению, у меня есть проблема: когда я пытаюсь сохранить двоичные данные, выполняя fs.writeFileSync('test.pdf', буферы), чтобы вернуть его содержимое, он создает поврежденный файл. @ Джозия, какое предложение? Большое тебе спасибо. 23.07.2019
  • Да, вы можете объединить буферы в один буфер, и только тогда вы можете передать его в fs.writeFileSync: fs.writeFileSync('test.pdf', Buffer.concat(buffers)). Конечно, чтобы сделать это правильно, вы должны транслировать на него, и вам не понадобится буферизация: doc.pipe (fs.createWriteStream('test.pdf')) 24.07.2019
  • Это было действительно полезно при использовании doc.on('end'). Потратил 4 часа, пытаясь заставить это работать, и ваше решение исправило это. Спасает меня от создания временного файла для загрузки в другое место, тогда как теперь я могу просто отправить Buffer напрямую. 12.06.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..