From b586af0b2084aafcd2178c7f163382c6816ef616 Mon Sep 17 00:00:00 2001 From: "xTCry [Vladislav Kh]" Date: Sat, 6 Jul 2024 15:27:32 +0300 Subject: [PATCH 1/4] fix(metadata): correct PDF metadata key from `Creator` to `Producer` --- lib/mixins/metadata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mixins/metadata.js b/lib/mixins/metadata.js index 9268da62..d5eaa5f2 100644 --- a/lib/mixins/metadata.js +++ b/lib/mixins/metadata.js @@ -58,7 +58,7 @@ export default { this.appendXML(` - ${this.info.Creator}`, false); + ${this.info.Producer}`, false); if (this.info.Keywords) { this.appendXML(` From 427119deaabf8b1002ca9ede0e6f30aa57eba8b8 Mon Sep 17 00:00:00 2001 From: "xTCry [Vladislav Kh]" Date: Sat, 6 Jul 2024 15:28:54 +0300 Subject: [PATCH 2/4] chore(metadata): make field `Producer` optional --- lib/mixins/metadata.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/mixins/metadata.js b/lib/mixins/metadata.js index d5eaa5f2..42ae3fb9 100644 --- a/lib/mixins/metadata.js +++ b/lib/mixins/metadata.js @@ -56,18 +56,25 @@ export default { `); } - this.appendXML(` - - ${this.info.Producer}`, false); + if (this.info.Producer || this.info.Keywords) { + this.appendXML(` + + `); + + if (this.info.Producer) { + this.appendXML(` + ${this.info.Producer}`, false); + } + + if (this.info.Keywords) { + this.appendXML(` + ${this.info.Keywords}`, false); + } - if (this.info.Keywords) { this.appendXML(` - ${this.info.Keywords}`, false); + + `); } - - this.appendXML(` - - `); }, endMetadata() { From 9b3cee43b853e1d04ccb7fcb046fc614f33d067f Mon Sep 17 00:00:00 2001 From: "xTCry [Vladislav Kh]" Date: Sat, 6 Jul 2024 15:30:16 +0300 Subject: [PATCH 3/4] chore(metadata): make field `Creator` as `CreatorTool` optional --- lib/mixins/metadata.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/mixins/metadata.js b/lib/mixins/metadata.js index 42ae3fb9..cf8a9bbd 100644 --- a/lib/mixins/metadata.js +++ b/lib/mixins/metadata.js @@ -10,11 +10,19 @@ export default { _addInfo() { this.appendXML(` - ${this.info.CreationDate.toISOString().split('.')[0]+"Z"} - ${this.info.Creator} - - ` + `); + this.appendXML(` + ${this.info.CreationDate.toISOString().split('.')[0]+"Z"}` ); + if (this.info.Creator) { + this.appendXML(` + ${this.info.Creator}` + ); + } + + this.appendXML(` + + `); if (this.info.Title || this.info.Author || this.info.Subject) { this.appendXML(` From 8dc3ed6a175374923097f74a3800dc5e0e4a487a Mon Sep 17 00:00:00 2001 From: "xTCry [Vladislav Kh]" Date: Sat, 6 Jul 2024 16:50:57 +0300 Subject: [PATCH 4/4] chore(metadata): improve tabulating for drawing xml tree combine `xmlns:xmp`, `xmlns:pdf`, `xmlns:dc` into to one `rdf:Description` --- lib/metadata.js | 25 +++++---- lib/mixins/metadata.js | 116 ++++++++++++++++++++++------------------- lib/mixins/pdfa.js | 12 ++--- lib/mixins/pdfua.js | 6 +-- lib/string.js | 12 +++++ 5 files changed, 97 insertions(+), 74 deletions(-) create mode 100644 lib/string.js diff --git a/lib/metadata.js b/lib/metadata.js index 0742bd50..1b8736e7 100644 --- a/lib/metadata.js +++ b/lib/metadata.js @@ -1,25 +1,28 @@ +import { sfix } from "./string" class PDFMetadata { constructor() { - this._metadata = ` + this._metadata = sfix` - - + + + `; } - + _closeTags() { - this._metadata = this._metadata.concat(` - + this._metadata = this._metadata.concat( + ' \n' + + sfix` - - `); + `, + ); } - append(xml, newline=true) { - this._metadata = this._metadata.concat(xml); + append(xml, newline = true) { + this._metadata = this._metadata.concat(xml); if (newline) - this._metadata = this._metadata.concat('\n'); + this._metadata = this._metadata.concat('\n'); } getXML() { return this._metadata; } diff --git a/lib/mixins/metadata.js b/lib/mixins/metadata.js index cf8a9bbd..ede9c7be 100644 --- a/lib/mixins/metadata.js +++ b/lib/mixins/metadata.js @@ -1,93 +1,101 @@ import PDFMetadata from "../metadata" +import { sfix } from "../string" export default { initMetadata() { this.metadata = new PDFMetadata(); }, - appendXML(xml, newline=true) { this.metadata.append(xml,newline); }, + appendXML(xml, tabs = 0, newline = true) { + tabs += 2 + xml = xml.split('\n').map(x => ' '.repeat(4).repeat(tabs) + x).join('\n'); + this.metadata.append(xml, newline); + }, _addInfo() { - this.appendXML(` - - `); - this.appendXML(` - ${this.info.CreationDate.toISOString().split('.')[0]+"Z"}` + this.appendXML( + sfix` + `, + 0, + ); + this.appendXML( + sfix` + ${this.info.CreationDate.toISOString().split('.')[0] + 'Z'}`, + 1, ); if (this.info.Creator) { - this.appendXML(` - ${this.info.Creator}` + this.appendXML( + sfix` + ${this.info.Creator}`, + 1, ); } - this.appendXML(` - - `); - - if (this.info.Title || this.info.Author || this.info.Subject) { - this.appendXML(` - - `); - - if (this.info.Title) { - this.appendXML(` + if (this.info.Title) { + this.appendXML( + sfix` ${this.info.Title} - - `); - } + `, + 1, + ); + } - if (this.info.Author) { - this.appendXML(` + if (this.info.Author) { + this.appendXML( + sfix` ${this.info.Author} - - `); - } + `, + 1, + ); + } - if (this.info.Subject) { - this.appendXML(` + if (this.info.Subject) { + this.appendXML( + sfix` ${this.info.Subject} - - `); - } - - this.appendXML(` - - `); + `, + 1, + ); } - if (this.info.Producer || this.info.Keywords) { - this.appendXML(` - - `); - - if (this.info.Producer) { - this.appendXML(` - ${this.info.Producer}`, false); - } - - if (this.info.Keywords) { - this.appendXML(` - ${this.info.Keywords}`, false); - } + if (this.info.Producer) { + this.appendXML( + sfix` + ${this.info.Producer}`, + 1, + ); + } - this.appendXML(` - - `); + if (this.info.Keywords) { + this.appendXML( + sfix` + ${this.info.Keywords}`, + 1, + ); } + + this.appendXML( + sfix` + `, + 0, + ); }, endMetadata() { this._addInfo(); - + this.metadata.end(); /* diff --git a/lib/mixins/pdfa.js b/lib/mixins/pdfa.js index f06dfc4a..7d9aea40 100644 --- a/lib/mixins/pdfa.js +++ b/lib/mixins/pdfa.js @@ -1,4 +1,5 @@ import fs from 'fs'; +import { sfix } from "../string" export default { initPDFA(pSubset) { @@ -42,12 +43,11 @@ export default { }, _getPdfaid() { - return ` - - ${this.subset} - ${this.subset_conformance} - - `; + return sfix` + + ${this.subset} + ${this.subset_conformance} + `; }, _addPdfaMetadata() { diff --git a/lib/mixins/pdfua.js b/lib/mixins/pdfua.js index 89fd9e3a..f86009b4 100644 --- a/lib/mixins/pdfua.js +++ b/lib/mixins/pdfua.js @@ -1,3 +1,4 @@ +import { sfix } from "../string" export default { @@ -14,11 +15,10 @@ export default { }, _getPdfuaid() { - return ` + return sfix` ${this.subset} - - `; + `; }, } \ No newline at end of file diff --git a/lib/string.js b/lib/string.js new file mode 100644 index 00000000..d60cb9db --- /dev/null +++ b/lib/string.js @@ -0,0 +1,12 @@ + +export const sfix = (strings, ...expressions) => { + const indent = !strings[0].startsWith('\n') + ? null + : new RegExp(`\n {${strings[0].match(/\n+( *)/)[1].length}}`, 'g'); + return expressions + .reduce( + (acc, expr, i) => `${acc}${expr}${strings[i + 1].replace(indent, '\n')}`, + strings[0].replace(indent, '\n'), + ) + .replace(/^\n|\n$/g, ''); +}; \ No newline at end of file