pdf_creator.js 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /**
  2. * DevExtreme (exporter/pdf_creator.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var VERSION = require("../core/version");
  11. var window = require("../core/utils/window").getWindow();
  12. var imageCreator = require("./image_creator").imageCreator;
  13. var isFunction = require("../core/utils/type").isFunction;
  14. var extend = require("../core/utils/extend").extend;
  15. var deferredUtils = require("../core/utils/deferred");
  16. var when = deferredUtils.when;
  17. var Deferred = deferredUtils.Deferred;
  18. var mainPageTemplate = "%PDF-1.3\r\n2 0 obj\r\n<</ProcSet[/PDF/ImageB/ImageC/ImageI]/XObject<</I0 5 0 R>>>>\r\nendobj\r\n4 0 obj\r\n<</Type/Pages/Kids[1 0 R]/Count 1>>\r\nendobj\r\n7 0 obj\r\n<</OpenAction[1 0 R /FitH null]/Type/Catalog/Pages 4 0 R/PageLayout/OneColumn>>\r\nendobj\r\n1 0 obj\r\n<</Type/Page/Resources 2 0 R/MediaBox[0 0 _width_ _height_]/Contents 3 0 R/Parent 4 0 R>>\r\nendobj\r\n";
  19. var contentTemplate = "3 0 obj\r\n<</Length 52>>stream\r\n0.20 w\n0 G\nq _width_ 0 0 _height_ 0.00 0.00 cm /I0 Do Q\r\nendstream\r\nendobj\r\n";
  20. var infoTemplate = "6 0 obj\r\n<</CreationDate _date_/Producer(DevExtreme _version_)>>\r\nendobj\r\n";
  21. var imageStartTemplate = "5 0 obj\r\n<</Type/XObject/Subtype/Image/Width _width_/Height _height_/ColorSpace/DeviceRGB/BitsPerComponent 8/Filter/DCTDecode/Length _length_>>stream\r\n";
  22. var imageEndTemplate = "\r\nendstream\r\nendobj\r\n";
  23. var trailerTemplate = "trailer\r\n<<\r\n/Size 8\r\n/Root 7 0 R\r\n/Info 6 0 R\r\n>>\r\nstartxref\r\n_length_\r\n%%EOF";
  24. var xrefTemplate = "xref\r\n0 8\r\n0000000000 65535 f\r\n0000000241 00000 n\r\n0000000010 00000 n\r\n_main_ 00000 n\r\n0000000089 00000 n\r\n_image_ 00000 n\r\n_info_ 00000 n\r\n0000000143 00000 n\r\n";
  25. var pad = function pad(str, len) {
  26. return str.length < len ? pad("0" + str, len) : str
  27. };
  28. var composePdfString = function(imageString, options, curDate) {
  29. var margin = 2 * (options.margin || 0);
  30. var width = options.width + margin;
  31. var height = options.height + margin;
  32. var widthPt = (.75 * width).toFixed(2);
  33. var heightPt = (.75 * height).toFixed(2);
  34. var mainPage = mainPageTemplate.replace("_width_", widthPt).replace("_height_", heightPt);
  35. var content = contentTemplate.replace("_width_", widthPt).replace("_height_", heightPt);
  36. var info = infoTemplate.replace("_date_", curDate).replace("_version_", VERSION);
  37. var image = imageStartTemplate.replace("_width_", width).replace("_height_", height).replace("_length_", imageString.length) + imageString + imageEndTemplate;
  38. var xref = getXref(mainPage.length, content.length, info.length);
  39. var mainContent = mainPage + content + info + image;
  40. var trailer = trailerTemplate.replace("_length_", mainContent.length);
  41. return mainContent + xref + trailer
  42. };
  43. var getXref = function(mainPageLength, contentLength, infoLength) {
  44. return xrefTemplate.replace("_main_", pad(mainPageLength + "", 10)).replace("_info_", pad(mainPageLength + contentLength + "", 10)).replace("_image_", pad(mainPageLength + contentLength + infoLength + "", 10))
  45. };
  46. var getCurDate = function() {
  47. return new Date
  48. };
  49. var getBlob = function(binaryData) {
  50. var i = 0;
  51. var dataArray = new Uint8Array(binaryData.length);
  52. for (; i < binaryData.length; i++) {
  53. dataArray[i] = binaryData.charCodeAt(i)
  54. }
  55. return new window.Blob([dataArray.buffer], {
  56. type: "application/pdf"
  57. })
  58. };
  59. var getBase64 = function(binaryData) {
  60. return window.btoa(binaryData)
  61. };
  62. exports.getData = function(data, options, callback) {
  63. var imageData = imageCreator.getImageData(data, extend({}, options, {
  64. format: "JPEG"
  65. }));
  66. var blob = new Deferred;
  67. blob.done(callback);
  68. return when(imageData).done(function(imageString) {
  69. var binaryData = composePdfString(imageString, options, getCurDate());
  70. var pdfData = isFunction(window.Blob) ? getBlob(binaryData) : getBase64(binaryData);
  71. blob.resolve(pdfData)
  72. })
  73. };