diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fa63f83..9cac8ea2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### Unreleased - Allow applying 'underline' and 'strike' text styling together on a text +- Text will flow to the following page instead of always appending a new page at the end ### [v0.12.0] - 2021-04-04 diff --git a/lib/document.js b/lib/document.js index 310d3ebf..ec28e325 100644 --- a/lib/document.js +++ b/lib/document.js @@ -163,12 +163,25 @@ class PDFDocument extends stream.Readable { return this; } - continueOnNewPage(options) { - const pageMarkings = this.endPageMarkings(this.page); - - this.addPage(options); + continueOnNextPage(options) { + let pageIndex; + + if ( + this._pageBuffer && + (pageIndex = this._pageBuffer.indexOf(this.page)) !== + this._pageBuffer.length - 1 + ) { + // The page isn't the last in the buffer, so jump to the next page + this.switchToPage(pageIndex + 1); + // Now position the cursor at the top margin + this.y = this.page.margins.top; + } else { + const pageMarkings = this.endPageMarkings(this.page); + // If the page is the last one in the buffer, add a new page. + this.addPage(options); - this.initPageMarkings(pageMarkings); + this.initPageMarkings(pageMarkings); + } return this; } @@ -216,7 +229,9 @@ class PDFDocument extends stream.Readable { addNamedEmbeddedFile(name, ref) { if (!this._root.data.Names.data.EmbeddedFiles) { // disabling /Limits for this tree fixes attachments not showing in Adobe Reader - this._root.data.Names.data.EmbeddedFiles = new PDFNameTree({ limits: false }); + this._root.data.Names.data.EmbeddedFiles = new PDFNameTree({ + limits: false + }); } // add filespec to EmbeddedFiles diff --git a/lib/line_wrapper.js b/lib/line_wrapper.js index b1e05a3e..7391a650 100644 --- a/lib/line_wrapper.js +++ b/lib/line_wrapper.js @@ -310,7 +310,7 @@ class LineWrapper extends EventEmitter { return false; } - this.document.continueOnNewPage(); + this.document.continueOnNextPage(); this.column = 1; this.startY = this.document.page.margins.top; this.maxY = this.document.page.maxY(); diff --git a/package-lock.json b/package-lock.json index 4a31d300..c5a11197 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pdfkit", - "version": "0.11.0", + "version": "0.12.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2153,6 +2153,15 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2710,15 +2719,42 @@ } }, "browserslist": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.3.tgz", - "integrity": "sha512-GcZPC5+YqyPO4SFnz48/B0YaCwS47Q9iPChRGi6t7HhflKBcINzFrJvRfC+jp30sRMKxF+d4EHGs27Z0XP1NaQ==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001131", - "electron-to-chromium": "^1.3.570", - "escalade": "^3.1.0", - "node-releases": "^1.1.61" + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001228", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", + "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.737", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.737.tgz", + "integrity": "sha512-P/B84AgUSQXaum7a8m11HUsYL8tj9h/Pt5f7Hg7Ty6bm5DxlFq+e5+ouHUoNQMsKDJ7u4yGfI8mOErCmSH9wyg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "node-releases": { + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "dev": true + } } }, "bser": { @@ -2803,12 +2839,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "caniuse-lite": { - "version": "1.0.30001131", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001131.tgz", - "integrity": "sha512-4QYi6Mal4MMfQMSqGIRPGbKIbZygeN83QsWq1ixpUwvtfgAZot5BrCKzGygvZaV+CnELdTwD0S4cqUNozq7/Cw==", - "dev": true - }, "canvas": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", @@ -3030,6 +3060,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, "combine-source-map": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", @@ -3065,6 +3101,18 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -3609,12 +3657,6 @@ "safer-buffer": "^2.1.0" } }, - "electron-to-chromium": { - "version": "1.3.570", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.570.tgz", - "integrity": "sha512-Y6OCoVQgFQBP5py6A/06+yWxUZHDlNr/gNDGatjH8AZqXl8X0tE4LfjLJsXGz/JmWJz8a6K7bR1k+QzZ+k//fg==", - "dev": true - }, "elliptic": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", @@ -3638,6 +3680,12 @@ } } }, + "email-addresses": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", + "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==", + "dev": true + }, "emittery": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", @@ -3770,12 +3818,6 @@ "ext": "^1.1.2" } }, - "escalade": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", - "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", - "dev": true - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -4540,6 +4582,33 @@ "flat-cache": "^2.0.1" } }, + "filename-reserved-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", + "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", + "dev": true + }, + "filenamify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", + "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", + "dev": true, + "requires": { + "filename-reserved-regex": "^1.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "filenamify-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz", + "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=", + "dev": true, + "requires": { + "filenamify": "^1.0.0", + "humanize-url": "^1.0.0" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4549,6 +4618,17 @@ "to-regex-range": "^5.0.1" } }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -4637,6 +4717,17 @@ "map-cache": "^0.2.2" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs-minipass": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", @@ -4733,6 +4824,42 @@ "assert-plus": "^1.0.0" } }, + "gh-pages": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.2.0.tgz", + "integrity": "sha512-VQTwyRtxoaId0YmDXdC/G854dojpwTuOdpZUL3PGG6WQZvSoGVD8ggedKARZltixIREMezoDywE+g3g2paLxPw==", + "dev": true, + "requires": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify-url": "^1.0.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "globby": "^6.1.0" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -4999,6 +5126,16 @@ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, + "humanize-url": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz", + "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=", + "dev": true, + "requires": { + "normalize-url": "^1.0.0", + "strip-url-auth": "^1.0.0" + } + }, "iconv-lite": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", @@ -5301,6 +5438,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -6914,6 +7057,15 @@ "minimist": "^1.2.5" } }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -7530,12 +7682,6 @@ "tar": "^4" } }, - "node-releases": { - "version": "1.1.61", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", - "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", - "dev": true - }, "nopt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", @@ -7564,6 +7710,18 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, "npm-bundled": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", @@ -7985,6 +8143,21 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, "pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", @@ -8019,6 +8192,12 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, "prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", @@ -8282,6 +8461,16 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -9194,6 +9383,15 @@ } } }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9425,6 +9623,12 @@ "readable-stream": "^2.0.2" } }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, "string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -9522,6 +9726,21 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "strip-url-auth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz", + "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=", + "dev": true + }, "subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", @@ -9799,6 +10018,15 @@ } } }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", @@ -10002,6 +10230,12 @@ "set-value": "^2.0.1" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -10426,9 +10660,9 @@ } }, "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true }, "xml-name-validator": { diff --git a/tests/unit/markings.spec.js b/tests/unit/markings.spec.js index acc88a42..6a3ba508 100644 --- a/tests/unit/markings.spec.js +++ b/tests/unit/markings.spec.js @@ -23,7 +23,7 @@ EMC 'binary' ); - document.markContent("Span"); + document.markContent('Span'); document.endMarkedContent(); document.end(); @@ -56,9 +56,9 @@ EMC 'binary' ); - const structureContent1 = document.markStructureContent("Span"); + const structureContent1 = document.markStructureContent('Span'); document.endMarkedContent(); - const structureContent2 = document.markStructureContent("Span"); + const structureContent2 = document.markStructureContent('Span'); document.endMarkedContent(); document.end(); @@ -97,8 +97,8 @@ EMC 'binary' ); - document.addStructure(document.struct('Span', () => {})); - document.addStructure(document.struct('Span', () => {})); + document.addStructure(document.struct('Span', () => {})); + document.addStructure(document.struct('Span', () => {})); document.end(); expect(docData).toContainChunk([ @@ -135,17 +135,17 @@ EMC 'binary' ); - document.markContent("Artifact", { - type: "Pagination", + document.markContent('Artifact', { + type: 'Pagination', bbox: [40, 50, 570, 70], - attached: [ "Top" ] + attached: ['Top'] }); document.endMarkedContent(); - document.markContent("Span", { - lang: "en-AU", - alt: "Hi, earth! ", - actual: "Hello, world! ", - expanded: "Greetings, terrestrial sphere! " + document.markContent('Span', { + lang: 'en-AU', + alt: 'Hi, earth! ', + actual: 'Hello, world! ', + expanded: 'Greetings, terrestrial sphere! ' }); document.endMarkedContent(); document.end(); @@ -195,14 +195,14 @@ EMC 'binary' ); - document.markContent("Span"); - document.markStructureContent("P"); - document.markContent("Span"); - document.markStructureContent("P"); - document.markContent("Artifact"); - document.markContent("Artifact"); - document.markStructureContent("P"); - document.markStructureContent("P"); + document.markContent('Span'); + document.markStructureContent('P'); + document.markContent('Span'); + document.markStructureContent('P'); + document.markContent('Artifact'); + document.markContent('Artifact'); + document.markStructureContent('P'); + document.markStructureContent('P'); document.end(); expect(docData).toContainChunk([ @@ -232,10 +232,10 @@ EMC 'binary' ); - const structureContent = document.markStructureContent("P"); - document.markContent("Span"); - document.text("on the first page"); - document.continueOnNewPage(); + const structureContent = document.markStructureContent('P'); + document.markContent('Span'); + document.text('on the first page'); + document.continueOnNextPage(); document.end(); expect(structureContent.refs.length).toEqual(2); @@ -260,11 +260,11 @@ EMC test('atomically constructed', () => { const docData = logData(document); - const pContent1 = document.markStructureContent("P"); - const linkContent = document.markStructureContent("Link"); - const pContent2 = document.markStructureContent("P"); - const pContent3 = document.markStructureContent("P"); - document.markContent("Span"); + const pContent1 = document.markStructureContent('P'); + const linkContent = document.markStructureContent('Link'); + const pContent2 = document.markStructureContent('P'); + const pContent3 = document.markStructureContent('P'); + document.markContent('Span'); const section1 = document.struct('Sect', [ document.struct('P', [ @@ -274,9 +274,7 @@ EMC ]) ]); const section2 = document.struct('Sect', [ - document.struct('P', [ - pContent3 - ]) + document.struct('P', [pContent3]) ]); document.addStructure(section1).addStructure(section2); @@ -287,11 +285,7 @@ EMC /\/StructTreeRoot 8 0 R/, `endobj` ]); - expect(docData).toContainChunk([ - `3 0 obj`, - /\/Markings 9 0 R/, - `endobj` - ]); + expect(docData).toContainChunk([`3 0 obj`, /\/Markings 9 0 R/, `endobj`]); expect(docData).toContainChunk([ `8 0 obj`, `<< @@ -331,21 +325,17 @@ EMC `<<\n/S /P\n/P 14 0 R\n/K [3]\n/Pg 7 0 R\n>>`, `endobj` ]); - expect(docData).toContainChunk([ - `9 0 obj`, - `<<\n>>`, - `endobj` - ]); + expect(docData).toContainChunk([`9 0 obj`, `<<\n>>`, `endobj`]); }); test('incrementally constructed', () => { const docData = logData(document); - const pContent1 = document.markStructureContent("P"); - const linkContent = document.markStructureContent("Link"); - const pContent2 = document.markStructureContent("P"); - const pContent3 = document.markStructureContent("P"); - document.markContent("Span"); + const pContent1 = document.markStructureContent('P'); + const linkContent = document.markStructureContent('Link'); + const pContent2 = document.markStructureContent('P'); + const pContent3 = document.markStructureContent('P'); + document.markContent('Span'); const section1 = document.struct('Sect'); document.addStructure(section1); @@ -355,7 +345,10 @@ EMC link.add(linkContent); const p1 = document.struct('P'); section1.add(p1); - p1.add(pContent1).add(link).add(pContent2).end(); + p1.add(pContent1) + .add(link) + .add(pContent2) + .end(); const p2 = document.struct('P'); p2.add(pContent3); section2.add(p2); @@ -367,11 +360,7 @@ EMC /\/StructTreeRoot 8 0 R/, `endobj` ]); - expect(docData).toContainChunk([ - `3 0 obj`, - /\/Markings 9 0 R/, - `endobj` - ]); + expect(docData).toContainChunk([`3 0 obj`, /\/Markings 9 0 R/, `endobj`]); expect(docData).toContainChunk([ `8 0 obj`, `<< @@ -411,11 +400,7 @@ EMC `<<\n/S /P\n/P 11 0 R\n/K [3]\n/Pg 7 0 R\n>>`, `endobj` ]); - expect(docData).toContainChunk([ - `9 0 obj`, - `<<\n>>`, - `endobj` - ]); + expect(docData).toContainChunk([`9 0 obj`, `<<\n>>`, `endobj`]); }); test('constructed with closures', () => { @@ -427,7 +412,10 @@ EMC const link = document.struct('Link', () => {}); const p1 = document.struct('P'); section1.add(p1); - p1.add(() => {}).add(link).add(() => {}).end(); + p1.add(() => {}) + .add(link) + .add(() => {}) + .end(); const p2 = document.struct('P', [() => {}]); section2.add(p2); document.addStructure(section2); @@ -483,23 +471,21 @@ EMC `<<\n/S /P\n/P 10 0 R\n/K [3]\n/Pg 7 0 R\n>>`, `endobj` ]); - expect(docData).toContainChunk([ - `13 0 obj`, - `<<\n>>`, - `endobj` - ]); + expect(docData).toContainChunk([`13 0 obj`, `<<\n>>`, `endobj`]); }); test('with options', () => { const docData = logData(document); - document.addStructure(document.struct('P', { - title: "My Title", - lang: "en-AU", - alt: "My Alternative", - expanded: "My Expansion", - actual: "My Actual Text" - })); + document.addStructure( + document.struct('P', { + title: 'My Title', + lang: 'en-AU', + alt: 'My Alternative', + expanded: 'My Expansion', + actual: 'My Actual Text' + }) + ); document.end(); @@ -549,7 +535,7 @@ EMC document = new PDFDocument({ info: { CreationDate: new Date(Date.UTC(2018, 1, 1)), - Title: "My Title" + Title: 'My Title' }, displayTitle: true, compress: false, @@ -562,16 +548,8 @@ EMC document.end(); - expect(docData).toContainChunk([ - `3 0 obj`, - /\/Lang \(en-AU\)/, - `endobj` - ]); - expect(docData).toContainChunk([ - `3 0 obj`, - /\/Markings 5 0 R/, - `endobj` - ]); + expect(docData).toContainChunk([`3 0 obj`, /\/Lang \(en-AU\)/, `endobj`]); + expect(docData).toContainChunk([`3 0 obj`, /\/Markings 5 0 R/, `endobj`]); expect(docData).toContainChunk([ `5 0 obj`, `<<\n/Marked true\n>>`, @@ -587,21 +565,9 @@ EMC /\/DisplayDocTitle true/, `endobj` ]); - expect(docData).toContainChunk([ - `trailer`, - /\/Info 10 0 R/, - `startxref` - ]); - expect(docData).toContainChunk([ - `10 0 obj`, - /\/Title 14 0 R/, - `endobj` - ]); - expect(docData).toContainChunk([ - `14 0 obj`, - `(My Title)`, - `endobj` - ]); + expect(docData).toContainChunk([`trailer`, /\/Info 10 0 R/, `startxref`]); + expect(docData).toContainChunk([`10 0 obj`, /\/Title 14 0 R/, `endobj`]); + expect(docData).toContainChunk([`14 0 obj`, `(My Title)`, `endobj`]); }); }); @@ -641,7 +607,7 @@ EMC const section = document.struct('Sect'); document.addStructure(section); - document.text("Paragraph 1\nParagraph 2", { structParent: section }); + document.text('Paragraph 1\nParagraph 2', { structParent: section }); document.end(); expect(docData).toContainChunk([ @@ -657,17 +623,17 @@ EMC expect(docData).toContainChunk([ '11 0 obj', '<<\n/S /P\n/P 8 0 R\n/K [0]\n/Pg 7 0 R\n>>', - 'endobj', + 'endobj' ]); expect(docData).toContainChunk([ '13 0 obj', '<<\n/S /P\n/P 8 0 R\n/K [1]\n/Pg 7 0 R\n>>', - 'endobj', + 'endobj' ]); expect(docData).toContainChunk([ '8 0 obj', '<<\n/S /Sect\n/P 9 0 R\n/K [11 0 R 13 0 R]\n>>', - 'endobj', + 'endobj' ]); }); @@ -728,7 +694,7 @@ EMC const list = document.struct('List'); document.addStructure(list); - document.list(["Item 1","Item 2"], { structParent: list }); + document.list(['Item 1', 'Item 2'], { structParent: list }); document.end(); expect(docData).toContainChunk([ diff --git a/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-add-new-page-1-ac8ef.snap.png b/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-add-new-page-1-ac8ef.snap.png new file mode 100644 index 00000000..ec3eda95 Binary files /dev/null and b/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-add-new-page-1-ac8ef.snap.png differ diff --git a/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-add-new-page-2-a8a6a.snap.png b/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-add-new-page-2-a8a6a.snap.png new file mode 100644 index 00000000..d50600a4 Binary files /dev/null and b/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-add-new-page-2-a8a6a.snap.png differ diff --git a/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-on-next-page-1-960b5.snap.png b/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-on-next-page-1-960b5.snap.png new file mode 100644 index 00000000..e47f16eb Binary files /dev/null and b/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-on-next-page-1-960b5.snap.png differ diff --git a/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-on-next-page-2-a3c7b.snap.png b/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-on-next-page-2-a3c7b.snap.png new file mode 100644 index 00000000..b707659b Binary files /dev/null and b/tests/visual/__snapshots__/text-spec-js-text-implicit-column-column-on-next-page-2-a3c7b.snap.png differ diff --git a/tests/visual/text.spec.js b/tests/visual/text.spec.js index ec6de8e6..46cad772 100644 --- a/tests/visual/text.spec.js +++ b/tests/visual/text.spec.js @@ -31,7 +31,7 @@ describe('text', function() { strike: true }); doc.text('Strike', 100, 160, { - underline:true, + underline: true, strike: true }); }); @@ -43,4 +43,35 @@ describe('text', function() { doc.fillColor('#000').list(['One', 'Two', 'Three'], 100, 150); }); }); + + describe('implicit column', function() { + test('column add new page', function() { + return runDocTest({ bufferPages: true }, function(doc) { + const loermIpsum = + 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.'; + const longLoremIpsum = `${loermIpsum} ${loermIpsum} ${loermIpsum} ${loermIpsum}`; + doc.font('tests/fonts/Roboto-Regular.ttf'); + doc.x = 300; + doc.fillColor('#000').text(longLoremIpsum, { width: 250 }); + }); + }); + test('column on next page', function() { + return runDocTest({ bufferPages: true }, function(doc) { + const loermIpsum = + 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.'; + const longLoremIpsum = `${loermIpsum} ${loermIpsum} ${loermIpsum} ${loermIpsum}`; + doc.font('tests/fonts/Roboto-Regular.ttf'); + + doc.fillColor('#000').text(loermIpsum, { width: 200 }); + doc.addPage(); + doc.fillColor('#000').text(loermIpsum, { width: 200 }); + doc.switchToPage(0); + + doc.y = doc.page.margins.top; + + doc.x = 300; + doc.fillColor('#000').text(longLoremIpsum, { width: 250 }); + }); + }); + }); }); diff --git a/yarn.lock b/yarn.lock index 878d3853..a5968088 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2047,14 +2047,15 @@ browserify@^16.5.0: xtend "^4.0.0" browserslist@^4.12.0, browserslist@^4.8.5: - version "4.14.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.1.tgz#cb2b490ba881d45dc3039078c7ed04411eaf3fa3" - integrity sha512-zyBTIHydW37pnb63c7fHFXUG6EcqWOqoMdDx6cdyaDFriZ20EoVxcE95S54N+heRqY8m8IUgB5zYta/gCwSaaA== + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001124" - electron-to-chromium "^1.3.562" - escalade "^3.0.2" - node-releases "^1.1.60" + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" bser@^2.0.0: version "2.0.0" @@ -2136,10 +2137,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== -caniuse-lite@^1.0.30001124: - version "1.0.30001124" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001124.tgz#5d9998190258e11630d674fc50ea8e579ae0ced2" - integrity sha512-zQW8V3CdND7GHRH6rxm6s59Ww4g/qGWTheoboW9nfeMg7sUoopIfKCcNZUjwYRCOrvereh3kwDpZj4VLQ7zGtA== +caniuse-lite@^1.0.30001219: + version "1.0.30001228" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" + integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== canvas@^2.6.1: version "2.6.1" @@ -2317,6 +2318,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + combine-source-map@^0.8.0, combine-source-map@~0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" @@ -2784,10 +2790,10 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-to-chromium@^1.3.562: - version "1.3.562" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.562.tgz#79c20277ee1c8d0173a22af00e38433b752bc70f" - integrity sha512-WhRe6liQ2q/w1MZc8mD8INkenHivuHdrr4r5EQHNomy3NJux+incP6M6lDMd0paShP3MD0WGe5R1TWmEClf+Bg== +electron-to-chromium@^1.3.723: + version "1.3.737" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.737.tgz#196f2e9656f4f3c31930750e1899c091b72d36b5" + integrity sha512-P/B84AgUSQXaum7a8m11HUsYL8tj9h/Pt5f7Hg7Ty6bm5DxlFq+e5+ouHUoNQMsKDJ7u4yGfI8mOErCmSH9wyg== elliptic@^6.0.0: version "6.4.1" @@ -2892,10 +2898,10 @@ es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: d "1" es5-ext "~0.10.14" -escalade@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" - integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" @@ -5153,10 +5159,10 @@ node-pre-gyp@^0.11.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.60: - version "1.1.60" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" - integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA== +node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== nopt@^4.0.1: version "4.0.3" @@ -7369,9 +7375,9 @@ write@1.0.3: mkdirp "^0.5.1" ws@^7.2.3: - version "7.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" - integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== xml-name-validator@^3.0.0: version "3.0.0"