J'essaie de générer plusieurs fichiers PDF côté serveur à l'aide de PDFMake. Chaque PDF a une certaine section qui est constante dans tous les PDF à générer, general. Cette section general est ensuite séparée par un line, puis les informations spécifiques à ce document sont chargées en dessous.

Cela fonctionne très bien sur le premier PDF. Sur le second, cependant, la mise en page se brise. Comment puis-je réparer cela?

Premier PDF : entrez la description de l'image ici

Deuxième PDF : entrez la description de l'image ici

 "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();
0
S.Ramjit 11 nov. 2020 à 19:21

1 réponse

Meilleure réponse

J'ai donc posé une question sur la page des problèmes GitHub et la réponse était :

Une variable docDefinition ne peut être utilisée qu'une seule fois pour générer un PDF.

Bien que cela puisse être vrai, j'ai trouvé une solution de contournement adéquate en utilisant une table avec uniquement le headerLine. Ce n'est pas mon idée mais je ne me souviens plus d'où je l'ai eu.

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'
    }
} 

Ensuite, vous utilisez line() n'importe où dans votre docDefinition pour lequel vous avez besoin d'une ligne.

"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();
0
S.Ramjit 7 janv. 2021 à 12:31