modules/fileloading.js

  1. /**
  2. * @license
  3. * jsPDF fileloading PlugIn
  4. * Copyright (c) 2018 Aras Abbasi (aras.abbasi@gmail.com)
  5. *
  6. * Licensed under the MIT License.
  7. * http://opensource.org/licenses/mit-license
  8. */
  9. import { jsPDF } from "../jspdf.js";
  10. /**
  11. * @name fileloading
  12. * @module
  13. */
  14. (function(jsPDFAPI) {
  15. "use strict";
  16. /**
  17. * @name loadFile
  18. * @function
  19. * @param {string} url
  20. * @param {boolean} sync
  21. * @param {function} callback
  22. * @returns {string|undefined} result
  23. */
  24. jsPDFAPI.loadFile = function(url, sync, callback) {
  25. // @if MODULE_FORMAT!='cjs'
  26. return browserRequest(url, sync, callback);
  27. // @endif
  28. // @if MODULE_FORMAT='cjs'
  29. // eslint-disable-next-line no-unreachable
  30. return nodeReadFile(url, sync, callback);
  31. // @endif
  32. };
  33. /**
  34. * @name loadImageFile
  35. * @function
  36. * @param {string} path
  37. * @param {boolean} sync
  38. * @param {function} callback
  39. */
  40. jsPDFAPI.loadImageFile = jsPDFAPI.loadFile;
  41. function browserRequest(url, sync, callback) {
  42. sync = sync === false ? false : true;
  43. callback = typeof callback === "function" ? callback : function() {};
  44. var result = undefined;
  45. var xhr = function(url, sync, callback) {
  46. var request = new XMLHttpRequest();
  47. var i = 0;
  48. var sanitizeUnicode = function(data) {
  49. var dataLength = data.length;
  50. var charArray = [];
  51. var StringFromCharCode = String.fromCharCode;
  52. //Transform Unicode to ASCII
  53. for (i = 0; i < dataLength; i += 1) {
  54. charArray.push(StringFromCharCode(data.charCodeAt(i) & 0xff));
  55. }
  56. return charArray.join("");
  57. };
  58. request.open("GET", url, !sync);
  59. // XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com]
  60. request.overrideMimeType("text/plain; charset=x-user-defined");
  61. if (sync === false) {
  62. request.onload = function() {
  63. if (request.status === 200) {
  64. callback(sanitizeUnicode(this.responseText));
  65. } else {
  66. callback(undefined);
  67. }
  68. };
  69. }
  70. request.send(null);
  71. if (sync && request.status === 200) {
  72. return sanitizeUnicode(request.responseText);
  73. }
  74. };
  75. try {
  76. result = xhr(url, sync, callback);
  77. // eslint-disable-next-line no-empty
  78. } catch (e) {}
  79. return result;
  80. }
  81. function nodeReadFile(url, sync, callback) {
  82. sync = sync === false ? false : true;
  83. var result = undefined;
  84. var fs = require("fs");
  85. var path = require("path");
  86. url = path.resolve(url);
  87. if (sync) {
  88. try {
  89. result = fs.readFileSync(url, { encoding: "latin1" });
  90. } catch (e) {
  91. return undefined;
  92. }
  93. } else {
  94. fs.readFile(url, { encoding: "latin1" }, function(err, data) {
  95. if (!callback) {
  96. return;
  97. }
  98. if (err) {
  99. callback(undefined);
  100. }
  101. callback(data);
  102. });
  103. }
  104. return result;
  105. }
  106. })(jsPDF.API);