swissqrbill
Advanced tools
Comparing version 1.2.0 to 1.3.0
# Change Log | ||
# [v1.3.0](https://github.com/rogerrrrrrrs/swissqrbill/compare/v1.2.0...v1.3.0) - 25.06.2020 | ||
* Tables | ||
- Added new header property on table rows to automatically insert a header row on new pages. | ||
- Table row height is now automatically calculated if not otherwise defined. | ||
- Added padding option to rows and cells. | ||
* Events | ||
- Added new beforeEnd event that could be used to add page numbers. | ||
- Added new pageAdded event that could be used to add a header to the pages. | ||
* Renamed `debitor` option to `debtor`. | ||
* Improved documentation. | ||
* TypeScript declaration improvements. | ||
* Fixed typos in examples. | ||
# [v1.2.0](https://github.com/rogerrrrrrrs/swissqrbill/compare/v1.1.0...v1.2.0) - 06.06.2020 | ||
@@ -9,14 +22,14 @@ * Added optional callback function that gets executed once the pdf file has completed writing. | ||
# [v1.1.0](https://github.com/rogerrrrrrrs/swissqrbill/compare/v1.0.6...v1.1.0) - 15.03.2020 | ||
* Fixed some validation checks | ||
* Improved error messages | ||
* Added new method to generate tables | ||
* Improved documentation | ||
* Fixed some validation checks. | ||
* Improved error messages. | ||
* Added new method to generate tables. | ||
* Improved documentation. | ||
# [v1.0.6](https://github.com/rogerrrrrrrs/swissqrbill/compare/v1.0.5...v1.0.6) - 04.03.2020 | ||
* Fixed QR Code fields | ||
* Validates user data | ||
* Fixed QR Code fields. | ||
* Added user data validation. | ||
# [v1.0.5](https://github.com/rogerrrrrrrs/swissqrbill/compare/v1.0.4...v1.0.5) - 03.03.2020 | ||
* Fixed french characters | ||
* Removes new lines in userdata | ||
* Fixes some layout issues | ||
* Fixed french characters. | ||
* Removes new lines in userdata. | ||
* Fixed some layout issues. |
@@ -8,3 +8,3 @@ import PDFDocument from "pdfkit"; | ||
y?: number; | ||
padding?: number; | ||
padding?: number | [number, number, number, number]; | ||
lineWidth?: number; | ||
@@ -19,4 +19,6 @@ font?: string; | ||
height?: number; | ||
padding?: number | [number, number, number, number]; | ||
font?: string; | ||
fontSize?: number; | ||
header?: boolean; | ||
} | ||
@@ -26,2 +28,3 @@ interface PDFColumn { | ||
width?: number; | ||
padding?: number | [number, number, number, number]; | ||
fillColor?: string; | ||
@@ -28,0 +31,0 @@ strokeColor?: string; |
@@ -27,11 +27,14 @@ "use strict"; | ||
const lineWidth = table.lineWidth !== undefined ? table.lineWidth : 0.3; | ||
const padding = table.padding !== undefined ? table.padding : 5; | ||
const defaultPadding = 5; | ||
const basePadding = table.padding !== undefined ? table.padding : defaultPadding; | ||
const baseFontSize = table.fontSize !== undefined ? table.fontSize : 11; | ||
const baseFont = table.font !== undefined ? table.font : "Helvetica"; | ||
let rowY = tableY; | ||
table.rows.forEach((row, rowIndex) => { | ||
rowLoop: for (let rowIndex = 0; rowIndex < table.rows.length; rowIndex++) { | ||
const row = table.rows[rowIndex]; | ||
const amountOfColumns = row.columns.length; | ||
const columnWidth = tableWidth / amountOfColumns; | ||
const rowHeight = row.height !== undefined ? row.height : 20; | ||
const rowNumber = rowIndex + 1; | ||
let rowHeight = row.height !== undefined ? row.height : 20; | ||
let padding = row.padding !== undefined ? row.padding : basePadding; | ||
let fillColor = row.fillColor !== undefined ? row.fillColor : ""; | ||
@@ -41,7 +44,2 @@ let strokeColor = row.strokeColor !== undefined ? row.strokeColor : ""; | ||
let font = row.font !== undefined ? row.font : baseFont; | ||
//-- Insert new page | ||
if (rowY + rowHeight >= this.page.height - this.page.margins.bottom) { | ||
this.addPage(); | ||
rowY = this.page.margins.top; | ||
} | ||
//-- Move to start position | ||
@@ -52,3 +50,4 @@ this.moveTo(tableX, tableY); | ||
let columnX = tableX; | ||
row.columns.forEach((column, columnIndex) => { | ||
for (let columnIndex = 0; columnIndex < row.columns.length; columnIndex++) { | ||
const column = row.columns[columnIndex]; | ||
const columnNumber = columnIndex + 1; | ||
@@ -66,2 +65,3 @@ let remainingColumns = row.columns.length; | ||
const columnWidth = column.width !== undefined ? column.width : (tableWidth - widthUsed) / (remainingColumns); | ||
padding = column.padding !== undefined ? column.padding : padding; | ||
fillColor = column.fillColor !== undefined ? column.fillColor : fillColor; | ||
@@ -76,4 +76,4 @@ strokeColor = column.strokeColor !== undefined ? column.strokeColor : strokeColor; | ||
width: columnWidth, | ||
height: rowHeight, | ||
baseline: "middle" | ||
lineBreak: true, | ||
baseline: "top" | ||
}; | ||
@@ -83,2 +83,41 @@ if (column.textOptions !== undefined) { | ||
} | ||
this.moveTo(columnX + columnWidth, rowY); | ||
this.font(font); | ||
this.fontSize(fontSize); | ||
//-- Set padding | ||
let paddings = { | ||
top: defaultPadding, | ||
right: defaultPadding, | ||
bottom: defaultPadding, | ||
left: defaultPadding | ||
}; | ||
if (typeof padding === "object" && padding.length === 4) { | ||
paddings = { top: padding[0], right: padding[1], bottom: padding[2], left: padding[3] }; | ||
} | ||
else if (typeof padding === "number") { | ||
paddings = { | ||
top: padding, | ||
right: padding, | ||
bottom: padding, | ||
left: padding | ||
}; | ||
} | ||
const columnHeight = this.heightOfString(column.text + "", textOptions) + paddings.top + paddings.bottom; | ||
if (columnHeight > rowHeight) { | ||
rowHeight = columnHeight; | ||
} | ||
textOptions.height = rowHeight; | ||
//-- Check for page overflow | ||
if (rowY + rowHeight >= this.page.height - this.page.margins.bottom) { | ||
//-- Insert new page | ||
this.addPage(); | ||
rowY = this.y; | ||
//-- Insert header | ||
for (const headerRow of table.rows) { | ||
if (headerRow.header === true) { | ||
table.rows.splice(rowIndex, 0, headerRow, headerRow); | ||
continue rowLoop; | ||
} | ||
} | ||
} | ||
//-- Draw rectangle | ||
@@ -91,12 +130,9 @@ this.rect(columnX, rowY, columnWidth, rowHeight) | ||
.fillAndStroke(); | ||
this.moveTo(columnX + columnWidth, rowY); | ||
this.font(font); | ||
this.fontSize(fontSize); | ||
this.fillColor("black") | ||
.fillOpacity(1) | ||
.text(column.text + "", columnX + padding, rowY + (padding / 2) + (rowHeight / 2), textOptions); | ||
.fillOpacity(1); | ||
this.text(column.text + "", columnX + paddings.left, rowY + paddings.top, textOptions); | ||
columnX = columnX + columnWidth; | ||
}); | ||
} | ||
rowY = rowY + rowHeight; | ||
}); | ||
} | ||
return this; | ||
@@ -103,0 +139,0 @@ } |
@@ -7,3 +7,4 @@ /// <reference types="pdfkit" /> | ||
creditor: creditor; | ||
debitor?: debitor; | ||
debtor?: debtor; | ||
debitor?: debtor; | ||
amount?: number; | ||
@@ -16,3 +17,3 @@ reference?: string; | ||
} | ||
interface debitor { | ||
interface debtor { | ||
name: string; | ||
@@ -25,3 +26,3 @@ address: string; | ||
} | ||
interface creditor extends debitor { | ||
interface creditor extends debtor { | ||
account: string; | ||
@@ -35,2 +36,5 @@ } | ||
} | ||
export import PDFTable = ExtendedPDF.PDFTable; | ||
export import PDFRow = ExtendedPDF.PDFRow; | ||
export import PDFColumn = ExtendedPDF.PDFColumn; | ||
type currency = "CHF" | "EUR"; | ||
@@ -131,2 +135,9 @@ type size = "A4" | "A6/5"; | ||
/** | ||
* Finalizes the document | ||
* | ||
* @returns | ||
* @memberof PDF | ||
*/ | ||
end(): void; | ||
/** | ||
* Adds the QR Bill to the bottom of the current page. | ||
@@ -185,3 +196,3 @@ * This function is automatically called when the option autoGenerate is set to true. | ||
* @private | ||
* @param {(debitor | creditor)} data creditor or debitor object containing the address. | ||
* @param {(debtor | creditor)} data creditor or debtor object containing the address. | ||
* @returns {string} string containing the formatted address. | ||
@@ -188,0 +199,0 @@ * @memberof PDF |
147
lib/index.js
@@ -14,3 +14,3 @@ "use strict"; | ||
constructor(data, outputPath, optionsOrCallback, callbackOrUndefined) { | ||
super({ autoFirstPage: false }); | ||
super({ autoFirstPage: false, bufferPages: true }); | ||
this.size = "A6/5"; | ||
@@ -39,3 +39,3 @@ this._scissors = true; | ||
} | ||
super.emit("finish", ev); | ||
this.emit("finish", ev); | ||
}); | ||
@@ -49,2 +49,5 @@ if (data === undefined || typeof data !== "object") { | ||
this._data = data; | ||
if (this._data.debtor === undefined && this._data.debitor !== undefined) { | ||
this._data.debtor = this._data.debitor; | ||
} | ||
this._cleanData(); | ||
@@ -85,3 +88,3 @@ this._validateData(); | ||
} | ||
this.info.Author = "SwissQRBill"; | ||
this.info.Producer = this.info.Creator = this.info.Author = "SwissQRBill"; | ||
this.addPage(); | ||
@@ -111,2 +114,12 @@ if (this._autoGenerate === true) { | ||
/** | ||
* Finalizes the document | ||
* | ||
* @returns | ||
* @memberof PDF | ||
*/ | ||
end() { | ||
this.emit("beforeEnd", this); | ||
return super.end(); | ||
} | ||
/** | ||
* Adds the QR Bill to the bottom of the current page. | ||
@@ -217,4 +230,4 @@ * This function is automatically called when the option autoGenerate is set to true. | ||
} | ||
//-- Debitor | ||
if (this._data.debitor !== undefined) { | ||
//-- Debtor | ||
if (this._data.debtor !== undefined) { | ||
this.fontSize(9); | ||
@@ -229,3 +242,3 @@ this.moveDown(); | ||
this.font("Helvetica"); | ||
this.text(this._formatAddress(this._data.debitor), { | ||
this.text(this._formatAddress(this._data.debtor), { | ||
width: this.mmToPoints(52) | ||
@@ -374,3 +387,3 @@ }); | ||
} | ||
if (this._data.debitor !== undefined) { | ||
if (this._data.debtor !== undefined) { | ||
this.fontSize(8); | ||
@@ -383,3 +396,3 @@ this.font("Helvetica-Bold"); | ||
this.font("Helvetica"); | ||
this.text(this._formatAddress(this._data.debitor), { | ||
this.text(this._formatAddress(this._data.debtor), { | ||
width: this.mmToPoints(87) | ||
@@ -470,3 +483,3 @@ }); | ||
if (typeof this._data.creditor.houseNumber !== "string" && typeof this._data.creditor.houseNumber !== "number") { | ||
throw new Error("Debitor houseNumber must be either a string or a number."); | ||
throw new Error("Debtor houseNumber must be either a string or a number."); | ||
} | ||
@@ -529,62 +542,62 @@ if (this._data.creditor.houseNumber.toString().length > 16) { | ||
} | ||
//-- Debitor | ||
if (this._data.debitor !== undefined) { | ||
//-- Debitor name | ||
if (this._data.debitor.name === undefined) { | ||
throw new Error("Debitor name cannot be undefined if the debitor object is available."); | ||
//-- Debtor | ||
if (this._data.debtor !== undefined) { | ||
//-- Debtor name | ||
if (this._data.debtor.name === undefined) { | ||
throw new Error("Debtor name cannot be undefined if the debtor object is available."); | ||
} | ||
if (typeof this._data.debitor.name !== "string") { | ||
throw new Error("Debitor name must be a string."); | ||
if (typeof this._data.debtor.name !== "string") { | ||
throw new Error("Debtor name must be a string."); | ||
} | ||
if (this._data.debitor.name.length > 70) { | ||
throw new Error("Debitor name must be a maximum of 70 characters."); | ||
if (this._data.debtor.name.length > 70) { | ||
throw new Error("Debtor name must be a maximum of 70 characters."); | ||
} | ||
//-- Debitor address | ||
if (this._data.debitor.address === undefined) { | ||
throw new Error("Debitor address cannot be undefined if the debitor object is available."); | ||
//-- Debtor address | ||
if (this._data.debtor.address === undefined) { | ||
throw new Error("Debtor address cannot be undefined if the debtor object is available."); | ||
} | ||
if (typeof this._data.debitor.address !== "string") { | ||
throw new Error("Debitor address must be a string."); | ||
if (typeof this._data.debtor.address !== "string") { | ||
throw new Error("Debtor address must be a string."); | ||
} | ||
if (this._data.debitor.address.length > 70) { | ||
throw new Error("Debitor address must be a maximum of 70 characters."); | ||
if (this._data.debtor.address.length > 70) { | ||
throw new Error("Debtor address must be a maximum of 70 characters."); | ||
} | ||
//-- Debitor houseNumber | ||
if (this._data.debitor.houseNumber !== undefined) { | ||
if (typeof this._data.debitor.houseNumber !== "string" && typeof this._data.debitor.houseNumber !== "number") { | ||
throw new Error("Debitor house number must be either a string or a number."); | ||
//-- Debtor houseNumber | ||
if (this._data.debtor.houseNumber !== undefined) { | ||
if (typeof this._data.debtor.houseNumber !== "string" && typeof this._data.debtor.houseNumber !== "number") { | ||
throw new Error("Debtor house number must be either a string or a number."); | ||
} | ||
if (this._data.debitor.houseNumber.toString().length > 16) { | ||
throw new Error("Debitor house number can be a maximum of 16 characters."); | ||
if (this._data.debtor.houseNumber.toString().length > 16) { | ||
throw new Error("Debtor house number can be a maximum of 16 characters."); | ||
} | ||
} | ||
//-- Debitor zip | ||
if (this._data.debitor.zip === undefined) { | ||
throw new Error("Debitor zip cannot be undefined if the debitor object is available."); | ||
//-- Debtor zip | ||
if (this._data.debtor.zip === undefined) { | ||
throw new Error("Debtor zip cannot be undefined if the debtor object is available."); | ||
} | ||
if (typeof this._data.debitor.zip !== "number") { | ||
throw new Error("Debitor zip must be a number."); | ||
if (typeof this._data.debtor.zip !== "number") { | ||
throw new Error("Debtor zip must be a number."); | ||
} | ||
if (this._data.debitor.zip.toString().length > 16) { | ||
throw new Error("Debitor zip must be a maximum of 16 characters."); | ||
if (this._data.debtor.zip.toString().length > 16) { | ||
throw new Error("Debtor zip must be a maximum of 16 characters."); | ||
} | ||
//-- Debitor city | ||
if (this._data.debitor.city === undefined) { | ||
throw new Error("Debitor city cannot be undefined if the debitor object is available."); | ||
//-- Debtor city | ||
if (this._data.debtor.city === undefined) { | ||
throw new Error("Debtor city cannot be undefined if the debtor object is available."); | ||
} | ||
if (typeof this._data.debitor.city !== "string") { | ||
throw new Error("Debitor city must be a string."); | ||
if (typeof this._data.debtor.city !== "string") { | ||
throw new Error("Debtor city must be a string."); | ||
} | ||
if (this._data.debitor.city.length > 35) { | ||
throw new Error("Debitor city must be a maximum of 35 characters."); | ||
if (this._data.debtor.city.length > 35) { | ||
throw new Error("Debtor city must be a maximum of 35 characters."); | ||
} | ||
//-- Debitor country | ||
if (this._data.debitor.country === undefined) { | ||
throw new Error("Debitor country cannot be undefined if the debitor object is available."); | ||
//-- Debtor country | ||
if (this._data.debtor.country === undefined) { | ||
throw new Error("Debtor country cannot be undefined if the debtor object is available."); | ||
} | ||
if (typeof this._data.debitor.country !== "string") { | ||
throw new Error("Debitor country must be a string."); | ||
if (typeof this._data.debtor.country !== "string") { | ||
throw new Error("Debtor country must be a string."); | ||
} | ||
if ((this._data.debitor.country).length !== 2) { | ||
throw new Error("Debitor country must be 2 characters."); | ||
if ((this._data.debtor.country).length !== 2) { | ||
throw new Error("Debtor country must be 2 characters."); | ||
} | ||
@@ -711,17 +724,17 @@ } | ||
qrString += this._data.currency + "\n"; | ||
//-- Debitor | ||
if (this._data.debitor !== undefined) { | ||
if (this._data.debitor.houseNumber !== undefined) { | ||
//-- Debtor | ||
if (this._data.debtor !== undefined) { | ||
if (this._data.debtor.houseNumber !== undefined) { | ||
// Address type | ||
qrString += "S\n"; | ||
// Name | ||
qrString += this._data.debitor.name + "\n"; | ||
qrString += this._data.debtor.name + "\n"; | ||
// Address | ||
qrString += this._data.debitor.address + "\n"; | ||
qrString += this._data.debtor.address + "\n"; | ||
// House number | ||
qrString += this._data.debitor.houseNumber + "\n"; | ||
qrString += this._data.debtor.houseNumber + "\n"; | ||
// Zip | ||
qrString += this._data.debitor.zip + "\n"; | ||
qrString += this._data.debtor.zip + "\n"; | ||
// City | ||
qrString += this._data.debitor.city + "\n"; | ||
qrString += this._data.debtor.city + "\n"; | ||
} | ||
@@ -732,10 +745,10 @@ else { | ||
// Name | ||
qrString += this._data.debitor.name + "\n"; | ||
qrString += this._data.debtor.name + "\n"; | ||
// Address | ||
qrString += this._data.debitor.address + "\n"; | ||
qrString += this._data.debtor.address + "\n"; | ||
// Zip + city | ||
if ((this._data.debitor.zip + " " + this._data.debitor.city).length > 70) { | ||
throw new Error("Debitor zip plus city must be a maximum of 70 characters."); | ||
if ((this._data.debtor.zip + " " + this._data.debtor.city).length > 70) { | ||
throw new Error("Debtor zip plus city must be a maximum of 70 characters."); | ||
} | ||
qrString += this._data.debitor.zip + " " + this._data.debitor.city + "\n"; | ||
qrString += this._data.debtor.zip + " " + this._data.debtor.city + "\n"; | ||
// Empty field zip | ||
@@ -747,3 +760,3 @@ qrString += "\n"; | ||
// Country | ||
qrString += this._data.debitor.country + "\n"; | ||
qrString += this._data.debtor.country + "\n"; | ||
} | ||
@@ -869,3 +882,3 @@ else { | ||
* @private | ||
* @param {(debitor | creditor)} data creditor or debitor object containing the address. | ||
* @param {(debtor | creditor)} data creditor or debtor object containing the address. | ||
* @returns {string} string containing the formatted address. | ||
@@ -872,0 +885,0 @@ * @memberof PDF |
{ | ||
"name": "swissqrbill", | ||
"version": "1.2.0", | ||
"version": "1.3.0", | ||
"description": "Swiss QR Bill generation in node.js ", | ||
@@ -5,0 +5,0 @@ "main": "./lib/index.js", |
@@ -72,3 +72,3 @@ # SwissQRBill | ||
}, | ||
debitor: { | ||
debtor: { | ||
name: "Pia-Maria Rutschmann-Schnyder", | ||
@@ -75,0 +75,0 @@ address: "Grosse Marktgasse 28", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
118723
1586