From 4a24d109a1d244dbb55a6b445a5deacbfbd8fab2 Mon Sep 17 00:00:00 2001 From: Leon Ho Date: Fri, 29 Apr 2022 16:28:32 +0700 Subject: [PATCH] Refactor on equality check function (#1280) Avoidable 'if' statement --- demo/spotColor.pdf | Bin 0 -> 15595 bytes demo/testSpotColor.js | 50 ++++++++++++++++++++++++++++++++++++++++++ lib/document.js | 1 + lib/mixins/color.js | 29 ++++++++++++++++++++++++ lib/object.js | 2 +- lib/page.js | 6 +++++ 6 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 demo/spotColor.pdf create mode 100644 demo/testSpotColor.js diff --git a/demo/spotColor.pdf b/demo/spotColor.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3a1d217fae26fc23dbde38c1b64ea7b694dbdbd4 GIT binary patch literal 15595 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 Mk!ffolq8Y=4+4DQwEzGB literal 0 HcmV?d00001 diff --git a/demo/testSpotColor.js b/demo/testSpotColor.js new file mode 100644 index 000000000..47824968d --- /dev/null +++ b/demo/testSpotColor.js @@ -0,0 +1,50 @@ +var PDFDocument = require('../'); + +var fs = require('fs'); + +// Create a new PDFDocument +var doc = new PDFDocument(); + +doc.pipe(fs.createWriteStream('spotColor.pdf')); + +// Set some meta data +doc.info['Title'] = 'Test Document for Sport Color'; + +doc.info['Author'] = 'Nicola A.'; + + +// Register a font name for use later +doc.registerFont('Palatino', 'fonts/PalatinoBold.ttf'); + +// Set the font, draw some text, and embed an image +doc + .font('Palatino') + .fontSize(18) + .text('Testing Spot Colors: MYFIRST_SPOT_COLOR, MYSECOND_SPOT_COLOR', 50, 50) + .fontSize(12) + .text('Check it out on Swatches palette', 50, 100) + +// Add another page +// doc +// .addPage() +// .fontSize(25) +// .text('Here is some vector graphics...', 100, 100); + +doc.addSpotColor('MYFIRST_SPOT_COLOR', 0, 50, 0, 0); +doc.addSpotColor('MYSECOND_SPOT_COLOR', 50, 0, 0, 0); + + +// Draw a triangle and a circle +doc + .moveTo(100, 150) + .lineTo(100, 250) + .lineTo(200, 250) + .stroke('MYFIRST_SPOT_COLOR'); + +doc + .moveTo(200, 250) + .lineTo(100, 150) + .lineTo(200, 150) + .lineTo(200, 250) + .fillAndStroke('MYFIRST_SPOT_COLOR', 'MYSECOND_SPOT_COLOR'); +doc.end(); diff --git a/lib/document.js b/lib/document.js index 310d3ebf6..9671597ee 100644 --- a/lib/document.js +++ b/lib/document.js @@ -328,6 +328,7 @@ Please pipe the document into a Node stream.\ _finalize() { // generate xref const xRefOffset = this._offset; + this._putSpotColors(); this._write('xref'); this._write(`0 ${this._offsets.length + 1}`); this._write('0000000000 65535 f '); diff --git a/lib/mixins/color.js b/lib/mixins/color.js index 318c8ab14..1eb02df34 100644 --- a/lib/mixins/color.js +++ b/lib/mixins/color.js @@ -5,6 +5,8 @@ const { PDFGradient, PDFLinearGradient, PDFRadialGradient } = Gradient; const { PDFTilingPattern } = pattern; export default { + spotColors: {}, + spotColorsCount: 0, initColor() { // The opacity dictionaries this._opacityRegistry = {}; @@ -38,6 +40,8 @@ export default { color = color.map(part => part / 100); } return color; + } else if (this.spotColors[color]) { + return color; } return null; @@ -48,6 +52,9 @@ export default { color.apply(stroke); return true; // see if tiling pattern, decode & apply it it + } else if (typeof color === 'string') { + this.addContent(`/CS${this.spotColors[color].index} ${stroke ? 'CS' : 'cs'} 1 ${op}`); + return false; } else if (Array.isArray(color) && color[0] instanceof PDFTilingPattern) { color[0].apply(stroke, color[1]); return true; @@ -163,6 +170,28 @@ export default { pattern(bbox, xStep, yStep, stream) { return new PDFTilingPattern(this, bbox, xStep, yStep, stream); + }, + + addSpotColor: function (name, C, M, Y, K) { + this._offsets.push(this._offset); + this.spotColors[name] = { + id: this._offsets.length, + index: ++this.spotColorsCount, + name: name, + values: [C, M, Y, K], + }; + }, + _putSpotColors: function () { + for (var item in this.spotColors) { + let output = ''; + item = this.spotColors[item]; + output += `${item.id} 0 obj \n`; + output += `[/Separation /${item.name} /DeviceCMYK << /Range [0 1 0 1 0 1 0 1] /C0 [0 0 0 0] /C1 [${ + item.values.map(value => value / 100.0).join(' ') + }] /FunctionType 2 /Domain [0 1] /N 1>>]`; + output += `\nendobj`; + this._write(output); + } } }; diff --git a/lib/object.js b/lib/object.js index e2ecc36fb..327e3eed3 100644 --- a/lib/object.js +++ b/lib/object.js @@ -40,7 +40,7 @@ class PDFObject { static convert(object, encryptFn = null) { // String literals are converted to the PDF name type if (typeof object === 'string') { - return `/${object}`; + return /^[\/\[\(\d].*/.test(object) ? object : '/' + object; // String objects are converted to PDF strings (UTF-16) } else if (object instanceof String) { diff --git a/lib/page.js b/lib/page.js index 32b8dc580..2d858425c 100644 --- a/lib/page.js +++ b/lib/page.js @@ -157,6 +157,12 @@ class PDFPage { end() { this.dictionary.end(); + this.resources.data.ColorSpace = {}; + let i = 1; + for (let item in this.document.spotColors) { + item = this.document.spotColors[item]; + this.resources.data.ColorSpace[`CS${i++}`] = `${item.id} 0 R`; + } this.resources.end(); return this.content.end(); }