如何解决多次使用或循环使用时,Canvas元素会导致错误的渲染-PDFMake
我正在尝试使用PDFMake生成多个PDF服务器端。每个PDF都有一个特定的部分,该部分在要生成的所有PDF中都是恒定的,general
。然后,将general
部分用line
分隔,然后将特定于该文档的信息加载到其下方。
这在第一个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,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,second];
pdfDoc = printer.createPdfKitDocument(docDefinition);
pdfDoc.pipe(fs.createWriteStream('two.pdf'));
pdfDoc.end();
解决方法
所以我在 GitHub issues page 上问了一个问题,得到的答复是:
一个 docDefinition
变量只能使用一次来生成 PDF。
虽然这可能是真的,但我确实通过使用只有 headerLine 的表格找到了一个合适的解决方法。这不是我的主意,但我不记得我从哪里得到的。
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 ]},//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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。