diff --git a/src/jspdf.js b/src/jspdf.js index dc009f313..04bb7b33e 100644 --- a/src/jspdf.js +++ b/src/jspdf.js @@ -784,15 +784,6 @@ function jsPDF(options) { ); }); - var getArrayBuffer = (API.__private__.getArrayBuffer = function(data) { - var len = data.length, - ab = new ArrayBuffer(len), - u8 = new Uint8Array(ab); - - while (len--) u8[len] = data.charCodeAt(len); - return ab; - }); - var standardFonts = [ ["Helvetica", "helvetica", "normal", "WinAnsiEncoding"], ["Helvetica-Bold", "helvetica", "bold", "WinAnsiEncoding"], @@ -2998,11 +2989,51 @@ function jsPDF(options) { setOutputDestination(pages[currentPage]); + return content; + }); + + var getString = (API.__private__.getString = function(content) { return content.join("\n"); }); - var getBlob = (API.__private__.getBlob = function(data) { - return new Blob([getArrayBuffer(data)], { + var getArrayBuffer = (API.__private__.getArrayBuffer = function(content) { + let length = 0; + for (let i = 0; i < content.length; i++) { + let contentLine = content[i]; + length += contentLine.length + 1; // +1 for newline + } + + let arrayBuffer = new ArrayBuffer(length); + let uint8Array = new Uint8Array(arrayBuffer); + let index = 0; + + for (let i = 0; i < content.length; i++) { + let contentLine = content[i]; + for (let j = 0; j < contentLine.length; j++) { + uint8Array[index++] = contentLine.charCodeAt(j); + } + uint8Array[index++] = 0x0a; // newline + } + + return arrayBuffer; + }); + + var getBlob = (API.__private__.getBlob = function(content) { + const parts = []; + + for (let i = 0; i < content.length; i++) { + let contentLine = content[i]; + let arrayBuffer = new ArrayBuffer(contentLine.length + 1); // +1 for newline + let uint8Array = new Uint8Array(arrayBuffer); + + for (let j = 0; j < contentLine.length; j++) { + uint8Array[j] = contentLine.charCodeAt(j); + } + uint8Array[contentLine.length] = 0x0a; // newline + parts.push(arrayBuffer); + } + + return new Blob(parts, { type: "application/pdf" }); }); @@ -3047,7 +3078,7 @@ function jsPDF(options) { switch (type) { case undefined: - return buildDocument(); + return getString(buildDocument()); case "save": API.save(options.filename); break; @@ -3076,7 +3107,7 @@ function jsPDF(options) { case "datauristring": case "dataurlstring": var dataURI = ""; - var pdfDocument = buildDocument(); + var pdfDocument = getString(buildDocument()); try { dataURI = btoa(pdfDocument); } catch (e) { diff --git a/test/reference/autoPaging10Pages.pdf b/test/reference/autoPaging10Pages.pdf index 432b1f549..44f09f171 100644 Binary files a/test/reference/autoPaging10Pages.pdf and b/test/reference/autoPaging10Pages.pdf differ diff --git a/test/reference/closed.pdf b/test/reference/closed.pdf index 33483607e..4bb4dad89 100644 Binary files a/test/reference/closed.pdf and b/test/reference/closed.pdf differ diff --git a/test/reference/encrypted_printable.pdf b/test/reference/encrypted_printable.pdf index 0e7a97162..654e08a32 100644 Binary files a/test/reference/encrypted_printable.pdf and b/test/reference/encrypted_printable.pdf differ diff --git a/test/reference/encrypted_standard.pdf b/test/reference/encrypted_standard.pdf index cdc5d3188..ddf191b51 100644 Binary files a/test/reference/encrypted_standard.pdf and b/test/reference/encrypted_standard.pdf differ diff --git a/test/reference/encrypted_withAcroForm.pdf b/test/reference/encrypted_withAcroForm.pdf index 536d36f91..27818f2dd 100644 Binary files a/test/reference/encrypted_withAcroForm.pdf and b/test/reference/encrypted_withAcroForm.pdf differ diff --git a/test/reference/encrypted_withImage.pdf b/test/reference/encrypted_withImage.pdf index bd7865e7e..c21d3f46a 100644 Binary files a/test/reference/encrypted_withImage.pdf and b/test/reference/encrypted_withImage.pdf differ diff --git a/test/reference/html-basic.pdf b/test/reference/html-basic.pdf index ba7f2e2cc..4ebdf58ec 100644 Binary files a/test/reference/html-basic.pdf and b/test/reference/html-basic.pdf differ diff --git a/test/reference/html-font-faces.pdf b/test/reference/html-font-faces.pdf index 8734ae10a..b8a71c130 100644 Binary files a/test/reference/html-font-faces.pdf and b/test/reference/html-font-faces.pdf differ diff --git a/test/reference/html-margin-page-break-slice.pdf b/test/reference/html-margin-page-break-slice.pdf index bddee5693..c1b3e67bd 100644 Binary files a/test/reference/html-margin-page-break-slice.pdf and b/test/reference/html-margin-page-break-slice.pdf differ diff --git a/test/reference/html-margin-page-break-text.pdf b/test/reference/html-margin-page-break-text.pdf index 0ed26c68a..16603398f 100644 Binary files a/test/reference/html-margin-page-break-text.pdf and b/test/reference/html-margin-page-break-text.pdf differ diff --git a/test/reference/html-margin-page-break.pdf b/test/reference/html-margin-page-break.pdf index 21cd55b98..ab986c7c2 100644 Binary files a/test/reference/html-margin-page-break.pdf and b/test/reference/html-margin-page-break.pdf differ diff --git a/test/reference/html-margin-x-y-text.pdf b/test/reference/html-margin-x-y-text.pdf index 6d041a183..11c488b04 100644 Binary files a/test/reference/html-margin-x-y-text.pdf and b/test/reference/html-margin-x-y-text.pdf differ diff --git a/test/reference/html-width-100-windowWidth-500.pdf b/test/reference/html-width-100-windowWidth-500.pdf index 6dceac04f..1a940a5d6 100644 Binary files a/test/reference/html-width-100-windowWidth-500.pdf and b/test/reference/html-width-100-windowWidth-500.pdf differ diff --git a/test/reference/html-width-210-windowWidth-1000.pdf b/test/reference/html-width-210-windowWidth-1000.pdf index 5ae9c69c5..c9b29ab54 100644 Binary files a/test/reference/html-width-210-windowWidth-1000.pdf and b/test/reference/html-width-210-windowWidth-1000.pdf differ diff --git a/test/reference/html-width-210-windowWidth-250.pdf b/test/reference/html-width-210-windowWidth-250.pdf index bbe80422c..9f8f6b2cf 100644 Binary files a/test/reference/html-width-210-windowWidth-250.pdf and b/test/reference/html-width-210-windowWidth-250.pdf differ diff --git a/test/reference/html-width-210-windowWidth-500.pdf b/test/reference/html-width-210-windowWidth-500.pdf index 9afd79b56..c8ab6926f 100644 Binary files a/test/reference/html-width-210-windowWidth-500.pdf and b/test/reference/html-width-210-windowWidth-500.pdf differ diff --git a/test/reference/html-width-300-windowWidth-500-scale-2.pdf b/test/reference/html-width-300-windowWidth-500-scale-2.pdf index 877559bf0..fe12528ce 100644 Binary files a/test/reference/html-width-300-windowWidth-500-scale-2.pdf and b/test/reference/html-width-300-windowWidth-500-scale-2.pdf differ diff --git a/test/reference/html-width-300-windowWidth-500.pdf b/test/reference/html-width-300-windowWidth-500.pdf index cc2d5eb84..4b2c56435 100644 Binary files a/test/reference/html-width-300-windowWidth-500.pdf and b/test/reference/html-width-300-windowWidth-500.pdf differ diff --git a/test/reference/html-width-default-windowWidth-default.pdf b/test/reference/html-width-default-windowWidth-default.pdf index 8f1fc94d7..461cf0d20 100644 Binary files a/test/reference/html-width-default-windowWidth-default.pdf and b/test/reference/html-width-default-windowWidth-default.pdf differ diff --git a/test/reference/multiLineLinkWithText.pdf b/test/reference/multiLineLinkWithText.pdf index 2eb80ab20..46eac8d64 100644 Binary files a/test/reference/multiLineLinkWithText.pdf and b/test/reference/multiLineLinkWithText.pdf differ diff --git a/test/reference/open.pdf b/test/reference/open.pdf index f5348a299..e7e7d2ad1 100644 Binary files a/test/reference/open.pdf and b/test/reference/open.pdf differ diff --git a/test/reference/table-autoSize-headerNames.pdf b/test/reference/table-autoSize-headerNames.pdf index ac9fc892b..cd2a525b0 100644 Binary files a/test/reference/table-autoSize-headerNames.pdf and b/test/reference/table-autoSize-headerNames.pdf differ diff --git a/test/reference/table-autoSize.pdf b/test/reference/table-autoSize.pdf index 988386b1c..618010c68 100644 Binary files a/test/reference/table-autoSize.pdf and b/test/reference/table-autoSize.pdf differ diff --git a/test/reference/table-formatted.pdf b/test/reference/table-formatted.pdf index 81e098aa3..50b4d640a 100644 Binary files a/test/reference/table-formatted.pdf and b/test/reference/table-formatted.pdf differ diff --git a/test/reference/table.pdf b/test/reference/table.pdf index d0b19ec8a..ba5f6c5e7 100644 Binary files a/test/reference/table.pdf and b/test/reference/table.pdf differ diff --git a/test/reference/textfieldMultiline.pdf b/test/reference/textfieldMultiline.pdf index a78ceb310..efaa3a537 100644 Binary files a/test/reference/textfieldMultiline.pdf and b/test/reference/textfieldMultiline.pdf differ diff --git a/test/reference/textfieldMultilineSmallForm.pdf b/test/reference/textfieldMultilineSmallForm.pdf index e589d6990..fd2901d48 100644 Binary files a/test/reference/textfieldMultilineSmallForm.pdf and b/test/reference/textfieldMultilineSmallForm.pdf differ diff --git a/test/reference/webp-multiple.pdf b/test/reference/webp-multiple.pdf index 1c81d2f3b..f12994851 100644 Binary files a/test/reference/webp-multiple.pdf and b/test/reference/webp-multiple.pdf differ diff --git a/test/specs/jspdf.unit.spec.js b/test/specs/jspdf.unit.spec.js index 651cf8eff..7faa14164 100644 --- a/test/specs/jspdf.unit.spec.js +++ b/test/specs/jspdf.unit.spec.js @@ -546,10 +546,18 @@ describe("Core: Unit Tests", () => { }); }); + it("jsPDF private function getString", () => { + const doc = jsPDF({ floatPrecision: 2 }); + expect(doc.__private__.getString(["A"]).length).toEqual(1); + expect(typeof doc.__private__.getString(["A"]) === "string").toEqual( + true + ); + }); + it("jsPDF private function getArrayBuffer", () => { const doc = jsPDF({ floatPrecision: 2 }); - expect(doc.__private__.getArrayBuffer("A").byteLength).toEqual(1); - expect(doc.__private__.getArrayBuffer("A") instanceof ArrayBuffer).toEqual( + expect(doc.__private__.getArrayBuffer(["A"]).byteLength).toEqual(2); // +1 for newline + expect(doc.__private__.getArrayBuffer(["A"]) instanceof ArrayBuffer).toEqual( true ); }); @@ -557,9 +565,9 @@ describe("Core: Unit Tests", () => { if (global.isNode !== true) { it("jsPDF private function getBlob", () => { const doc = new jsPDF({ floatPrecision: 2 }); - expect(typeof doc.__private__.getBlob("A")).toEqual("object"); - expect(doc.__private__.getBlob("A") instanceof Blob).toEqual(true); - expect(doc.__private__.getBlob("A").type).toEqual("application/pdf"); + expect(typeof doc.__private__.getBlob(["A"])).toEqual("object"); + expect(doc.__private__.getBlob(["A"]) instanceof Blob).toEqual(true); + expect(doc.__private__.getBlob(["A"]).type).toEqual("application/pdf"); }); }