jspdf-autotable
Version:
Generate pdf tables with javascript (jsPDF plugin)
56 lines (46 loc) • 1.88 kB
text/typescript
const jsPDF = require('jspdf');
/**
* Improved text function with halign and valign support
* Inspiration from: http://stackoverflow.com/questions/28327510/align-text-right-using-jspdf/28433113#28433113
*/
jsPDF.API.autoTableText = function(text, x, y, styles) {
styles = styles || {};
let FONT_ROW_RATIO = 1.15;
if (typeof x !== 'number' || typeof y !== 'number') {
console.error('The x and y parameters are required. Missing for text: ', text);
}
let k = this.internal.scaleFactor;
let fontSize = this.internal.getFontSize() / k;
let splitRegex = /\r\n|\r|\n/g;
let splitText = null;
let lineCount = 1;
if (styles.valign === 'middle' || styles.valign === 'bottom' || styles.halign === 'center' || styles.halign === 'right') {
splitText = typeof text === 'string' ? text.split(splitRegex) : text;
lineCount = splitText.length || 1;
}
// Align the top
y += fontSize * (2 - FONT_ROW_RATIO);
if (styles.valign === 'middle')
y -= (lineCount / 2) * fontSize * FONT_ROW_RATIO;
else if (styles.valign === 'bottom')
y -= lineCount * fontSize * FONT_ROW_RATIO;
if (styles.halign === 'center' || styles.halign === 'right') {
let alignSize = fontSize;
if (styles.halign === 'center')
alignSize *= 0.5;
if (lineCount >= 1) {
for (let iLine = 0; iLine < splitText.length; iLine++) {
this.text(splitText[iLine], x - this.getStringUnitWidth(splitText[iLine]) * alignSize, y);
y += fontSize;
}
return this;
}
x -= this.getStringUnitWidth(text) * alignSize;
}
if (styles.halign === 'justify') {
this.text(text, x, y, {maxWidth: styles.maxWidth || 100, align: 'justify'});
} else {
this.text(text, x, y);
}
return this;
};