From eeaf298cc8fcb4c0f33c9d5ba797fc0e79291642 Mon Sep 17 00:00:00 2001 From: Jernej Logar Date: Wed, 13 Oct 2021 11:58:30 +0200 Subject: [PATCH] tiling pattern support (bpampuch#2348) Based on plandela/pdfmake@7fc4fbf83b237b0ba126508bf4d3492d39a92f29 --- examples/pdfs/styling_properties.pdf | Bin 23504 -> 24108 bytes examples/pdfs/tables.pdf | Bin 60370 -> 61837 bytes examples/pdfs/vectors.pdf | Bin 11568 -> 12054 bytes examples/styling_properties.js | 15 +++++++++- examples/tables.js | 15 +++++++++- examples/vectors.js | 17 +++++++++-- src/helpers.js | 15 +++++++++- src/printer.js | 41 +++++++++++++++++++++------ src/textDecorator.js | 10 +++++-- 9 files changed, 98 insertions(+), 15 deletions(-) diff --git a/examples/pdfs/styling_properties.pdf b/examples/pdfs/styling_properties.pdf index 7f550b895c78878975f38aa845b54a4d5607bedf..b6a22d9d7ef28999e6431132e54157ddef69d7aa 100644 GIT binary patch delta 3453 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 Pus9q91~WEiCqn)N(<{i4 diff --git a/examples/pdfs/tables.pdf b/examples/pdfs/tables.pdf index e9b56868cee837a396732bc886a98cfac36653e3..38dcc1711c23d5c65659585770e5705c833c3262 100644 GIT binary patch delta 6487 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, ] as used by pdfmake +// into [, ] as used by pdfkit +// (the pattern has to be registered in the doc definition of course) +function getPattern(color, patterns){ + return [patterns[color[0]], color[1]]; +} + module.exports = { isString: isString, isNumber: isNumber, @@ -109,5 +120,7 @@ module.exports = { pack: pack, fontStringify: fontStringify, offsetVector: offsetVector, - getNodeId: getNodeId + getNodeId: getNodeId, + isPattern: isPattern, + getPattern: getPattern }; diff --git a/src/printer.js b/src/printer.js index e0032629f..bdb3b36c0 100644 --- a/src/printer.js +++ b/src/printer.js @@ -15,6 +15,8 @@ var isNumber = require('./helpers').isNumber; var isBoolean = require('./helpers').isBoolean; var isArray = require('./helpers').isArray; var isUndefined = require('./helpers').isUndefined; +var isPattern = require('./helpers').isPattern; +var getPattern = require('./helpers').getPattern; var getSvgToPDF = function () { try { @@ -96,8 +98,16 @@ function PdfPrinter(fontDescriptors) { * ], * styles: { * header: { fontSize: 30, bold: true } + * }, + * patterns: { + * stripe45d: { + * boundingBox: [1, 1, 4, 4], + * xStep: 3, + * yStep: 3, + * pattern: '1 w 0 1 m 4 5 l s 2 0 m 5 3 l s' + * } * } - * } + * }; * * var pdfKitDoc = printer.createPdfKitDocument(docDefinition); * @@ -157,7 +167,9 @@ PdfPrinter.prototype.createPdfKitDocument = function (docDefinition, options) { this.pdfKitDoc.options.size = [pageSize.width, pageHeight]; } - renderPages(pages, this.fontProvider, this.pdfKitDoc, options.progressCallback); + var patterns = createPatterns(docDefinition.patterns || {}, this.pdfKitDoc); + + renderPages(pages, this.fontProvider, this.pdfKitDoc, patterns, options.progressCallback); if (options.autoPrint) { var printActionRef = this.pdfKitDoc.ref({ @@ -355,7 +367,7 @@ function updatePageOrientationInOptions(currentPage, pdfKitDoc) { } } -function renderPages(pages, fontProvider, pdfKitDoc, progressCallback) { +function renderPages(pages, fontProvider, pdfKitDoc, patterns, progressCallback) { pdfKitDoc._pdfMakePages = pages; pdfKitDoc.addPage(); @@ -381,10 +393,10 @@ function renderPages(pages, fontProvider, pdfKitDoc, progressCallback) { var item = page.items[ii]; switch (item.type) { case 'vector': - renderVector(item.item, pdfKitDoc); + renderVector(item.item, patterns, pdfKitDoc); break; case 'line': - renderLine(item.item, item.item.x, item.item.y, pdfKitDoc); + renderLine(item.item, item.item.x, item.item.y, patterns, pdfKitDoc); break; case 'image': renderImage(item.item, item.item.x, item.item.y, pdfKitDoc); @@ -427,7 +439,7 @@ function offsetText(y, inline) { return newY; } -function renderLine(line, x, y, pdfKitDoc) { +function renderLine(line, x, y, patterns, pdfKitDoc) { function preparePageNodeRefLine(_pageNodeRef, inline) { var newWidth; var diffWidth; @@ -465,7 +477,7 @@ function renderLine(line, x, y, pdfKitDoc) { var ascenderHeight = line.getAscenderHeight(); var descent = lineHeight - ascenderHeight; - textDecorator.drawBackground(line, x, y, pdfKitDoc); + textDecorator.drawBackground(line, x, y, patterns, pdfKitDoc); //TODO: line.optimizeInlines(); for (var i = 0, l = line.inlines.length; i < l; i++) { @@ -539,7 +551,7 @@ function renderWatermark(page, pdfKitDoc) { pdfKitDoc.restore(); } -function renderVector(vector, pdfKitDoc) { +function renderVector(vector, patterns, pdfKitDoc) { //TODO: pdf optimization (there's no need to write all properties everytime) pdfKitDoc.lineWidth(vector.lineWidth || 1); if (vector.dash) { @@ -611,6 +623,10 @@ function renderVector(vector, pdfKitDoc) { vector.color = gradient; } + if (isPattern(vector.color)) { + vector.color = getPattern(vector.color, patterns); + } + var fillOpacity = isNumber(vector.fillOpacity) ? vector.fillOpacity : 1; var strokeOpacity = isNumber(vector.strokeOpacity) ? vector.strokeOpacity : 1; @@ -682,4 +698,13 @@ function endClip(pdfKitDoc) { pdfKitDoc.restore(); } +function createPatterns(patternDefinitions, pdfKitDoc) { + var patterns = {}; + Object.keys(patternDefinitions).forEach(function(p) { + var pattern = patternDefinitions[p]; + patterns[p] = pdfKitDoc.pattern(pattern.boundingBox, pattern.xStep, pattern.yStep, pattern.pattern, pattern.colored); + }); + return patterns; + } + module.exports = PdfPrinter; diff --git a/src/textDecorator.js b/src/textDecorator.js index 03d830e2a..921bf67b4 100644 --- a/src/textDecorator.js +++ b/src/textDecorator.js @@ -1,6 +1,8 @@ 'use strict'; var isArray = require('./helpers').isArray; +var isPattern = require('./helpers').isPattern; +var getPattern = require('./helpers').getPattern; function groupDecorations(line) { var groups = [], currentGroup = null; @@ -131,15 +133,19 @@ function drawDecorations(line, x, y, pdfKitDoc) { } } -function drawBackground(line, x, y, pdfKitDoc) { +function drawBackground(line, x, y, patterns, pdfKitDoc) { var height = line.getHeight(); for (var i = 0, l = line.inlines.length; i < l; i++) { var inline = line.inlines[i]; if (!inline.background) { continue; } + var color = inline.background; + if (isPattern(inline.background)) { + color = getPattern(inline.background, patterns); + } var justifyShift = (inline.justifyShift || 0); - pdfKitDoc.fillColor(inline.background) + pdfKitDoc.fillColor(color) .rect(x + inline.x - justifyShift, y, inline.width + justifyShift, height) .fill(); }