Элемент Canvas вызывает некорректную визуализацию при использовании более одного раза или в цикле — PDFMake

#node.js #pdfmake

#node.js #pdfmake

Вопрос:

Я пытаюсь сгенерировать несколько файлов PDF на стороне сервера с помощью PDFMake. Каждый PDF-файл имеет определенный раздел, который является постоянным для всех создаваемых PDF general -файлов. Затем этот general раздел разделяется line символом, а затем под ним загружается информация, относящаяся к этому документу.

Это отлично работает с первым PDF. Однако на втором этапе макет прерывается. Как я могу это исправить?

Первый PDF: введите описание изображения здесь

Второй PDF: введите описание изображения здесь

  "use strict";
  const fs = require("fs");
  const PdfPrinter = require("pdfmake");

  const fonts = {
    Helvetica: {
      normal: "Helvetica",
      bold: "Helvetica-Bold",
      italics: "Helvetica-Oblique",
      bolditalics: "Helvetica-BoldOblique",
    },
  };

  const printer = new PdfPrinter(fonts);

  const general = [{ text: "This is general text" }];

  const first = [{ text: "This is the text for the first pdf" }];

  const second = [{ text: "This is the text for the second pdf" }];

  const line = [{canvas: [{ type: 'line', x1: 0, y1: 5, x2: 595-2*40, y2: 5, lineWidth: 2 }],margin: [ 0, 10, 0, 10 ]},];


  let docDefinition = {
    pageSize: "letter",
    defaultStyle: {
      font: "Helvetica"
    }
  };

  docDefinition.content = [general,line,first];
  let pdfDoc = printer.createPdfKitDocument(docDefinition);
  pdfDoc.pipe(fs.createWriteStream('one.pdf'));
  pdfDoc.end();


  docDefinition.content = [general,line,second];
  pdfDoc = printer.createPdfKitDocument(docDefinition);
  pdfDoc.pipe(fs.createWriteStream('two.pdf'));
  pdfDoc.end();
  

Ответ №1:

Итак, я задал вопрос на странице проблем GitHub, и ответ был:

Одна docDefinition переменная может быть использована только один раз для создания PDF.

Хотя это может быть правдой, я нашел адекватный обходной путь, используя таблицу только с заголовком. Это не моя идея, но я не могу вспомнить, откуда я ее взял.

 function line() {
  //Usually one would use a canvas to draw the line
  //{canvas: [{ type: 'line', x1: 0, y1: 5, x2: 595-2*40, y2: 5, lineWidth: 2 }],margin: [ 0, 10, 0, 0 ]},
  //For some reason, that's not working and the layout just breaks
    return {
      table : {
        headerRows : 1,
        widths: ['100%'],
        body : [
                [''],
                ['']
                ]
        },
        layout : 'headerLineOnly'
    }
} 
  

Затем вы используете line() любую docDefinition нужную вам строку.

 "use strict";
  const fs = require("fs");
  const PdfPrinter = require("pdfmake");

  const fonts = {
    Helvetica: {
      normal: "Helvetica",
      bold: "Helvetica-Bold",
      italics: "Helvetica-Oblique",
      bolditalics: "Helvetica-BoldOblique",
    },
  };

  const printer = new PdfPrinter(fonts);

  const general = [{ text: "This is general text" }];

  const first = [{ text: "This is the text for the first pdf" }];

  const second = [{ text: "This is the text for the second pdf" }];



  let docDefinition = {
    pageSize: "letter",
    defaultStyle: {
      font: "Helvetica"
    }
  };

  docDefinition.content = [general,line(),first];
  let pdfDoc = printer.createPdfKitDocument(docDefinition);
  pdfDoc.pipe(fs.createWriteStream('one.pdf'));
  pdfDoc.end();