UNPKG

survey-pdf

Version:

survey.pdf.js is a SurveyJS PDF Library. It is a easy way to export SurveyJS surveys to PDF. It uses JSON for survey metadata.

618 lines (574 loc) 26.2 kB
/*! * surveyjs - SurveyJS PDF library v2.3.11 * Copyright (c) 2015-2025 Devsoft Baltic OÜ - http://surveyjs.io/ * License: MIT (http://www.opensource.org/licenses/mit-license.php) */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("fs")); else if(typeof define === 'function' && define.amd) define("PDFFormFiller", ["fs"], factory); else if(typeof exports === 'object') exports["PDFFormFiller"] = factory(require("fs")); else root["PDFFormFiller"] = factory(root["fs"]); })(this, (__WEBPACK_EXTERNAL_MODULE_fs__) => { return /******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "./src/entries/helpers.ts": /*!********************************!*\ !*** ./src/entries/helpers.ts ***! \********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ __assign: () => (/* binding */ __assign), /* harmony export */ __awaiter: () => (/* binding */ __awaiter), /* harmony export */ __decorate: () => (/* binding */ __decorate), /* harmony export */ __extends: () => (/* binding */ __extends), /* harmony export */ __generator: () => (/* binding */ __generator), /* harmony export */ __rest: () => (/* binding */ __rest), /* harmony export */ __spreadArray: () => (/* binding */ __spreadArray) /* harmony export */ }); var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; function __extends(d, b) { if (typeof b !== 'function' && b !== null) throw new TypeError('Class extends value ' + String(b) + ' is not a constructor or null'); extendStatics(d, b); function __() { this.constructor = d; } // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); } var __assign = function () { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __rest(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === 'function') for (var i = 0, q = Object.getOwnPropertySymbols(s); i < q.length; i++) { if (e.indexOf(q[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, q[i])) t[q[i]] = s[q[i]]; } return t; } function __decorate(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function') r = Reflect.decorate(decorators, target, key, desc); // eslint-disable-next-line no-cond-assign else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; } function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator['throw'](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } function __generator(thisArg, body) { var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), 'throw': verb(1), 'return': verb(2) }, typeof Symbol === 'function' && (g[Symbol.iterator] = function () { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError('Generator is already executing.'); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y['return'] : op[0] ? y['throw'] || ((t = y['return']) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } function __spreadArray(to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); } /***/ }), /***/ "./src/pdf_forms/adapters/pdf-lib.ts": /*!*******************************************!*\ !*** ./src/pdf_forms/adapters/pdf-lib.ts ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PDFLibAdapter: () => (/* binding */ PDFLibAdapter) /* harmony export */ }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./src/entries/helpers.ts"); var PDFLibAdapter = /** @class */ (function () { function PDFLibAdapter(pdfLibrary) { this.pdfLibrary = pdfLibrary; } PDFLibAdapter.prototype.fillForm = function (template, data) { return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__awaiter)(this, void 0, void 0, function () { var _a, PDFDocument, PDFTextField, PDFCheckBox, PDFRadioGroup, PDFDropdown, pdfDoc, form, fields; return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__generator)(this, function (_b) { switch (_b.label) { case 0: _a = this.pdfLibrary, PDFDocument = _a.PDFDocument, PDFTextField = _a.PDFTextField, PDFCheckBox = _a.PDFCheckBox, PDFRadioGroup = _a.PDFRadioGroup, PDFDropdown = _a.PDFDropdown; return [4 /*yield*/, PDFDocument.load(template)]; case 1: pdfDoc = _b.sent(); form = pdfDoc.getForm(); fields = form.getFields(); fields.forEach(function (field) { var fieldName = field.getName(); var value = data[fieldName]; if (value === null || value === undefined) return; if (field instanceof PDFTextField) { field.setText(value); } else if (field instanceof PDFCheckBox) { if (value) field.check(); else field.uncheck(); } else if (field instanceof PDFRadioGroup || field instanceof PDFDropdown) { field.select(value.toString()); } }); return [4 /*yield*/, pdfDoc.save()]; case 2: return [2 /*return*/, _b.sent()]; } }); }); }; return PDFLibAdapter; }()); /***/ }), /***/ "./src/pdf_forms/adapters/pdfjs.ts": /*!*****************************************!*\ !*** ./src/pdf_forms/adapters/pdfjs.ts ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PDFJSAdapter: () => (/* binding */ PDFJSAdapter) /* harmony export */ }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./src/entries/helpers.ts"); var PDFJSAdapter = /** @class */ (function () { function PDFJSAdapter(pdfLibrary) { this.pdfLibrary = pdfLibrary; } PDFJSAdapter.prototype.fillForm = function (template, data) { return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__awaiter)(this, void 0, void 0, function () { var pdfjsLib, doc, numPages, pageNum, page, annotations; return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__generator)(this, function (_a) { switch (_a.label) { case 0: pdfjsLib = this.pdfLibrary; return [4 /*yield*/, pdfjsLib.getDocument(template).promise]; case 1: doc = _a.sent(); numPages = doc.numPages; pageNum = 1; _a.label = 2; case 2: if (!(pageNum <= numPages)) return [3 /*break*/, 6]; return [4 /*yield*/, doc.getPage(pageNum)]; case 3: page = _a.sent(); return [4 /*yield*/, page.getAnnotations()]; case 4: annotations = _a.sent(); annotations.forEach(function (field) { if (field.fieldType == undefined) return; var value = data[field.fieldName]; if (value) { if (field.radioButton && field.buttonValue != value) { return; } doc.annotationStorage.setValue(field.id, { value: value }); } }); _a.label = 5; case 5: pageNum++; return [3 /*break*/, 2]; case 6: return [4 /*yield*/, doc.saveDocument()]; case 7: return [2 /*return*/, _a.sent()]; } }); }); }; return PDFJSAdapter; }()); /***/ }), /***/ "./src/pdf_forms/forms-base.ts": /*!*************************************!*\ !*** ./src/pdf_forms/forms-base.ts ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PDFFormFillerBase: () => (/* binding */ PDFFormFillerBase) /* harmony export */ }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./src/entries/helpers.ts"); /* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./map */ "./src/pdf_forms/map.ts"); /** * A base class for the `PDFFormFiller` plugin. */ var PDFFormFillerBase = /** @class */ (function () { function PDFFormFillerBase(options) { if (options) { this.data = options.data; this.fieldMap = options.fieldMap; this.pdfTemplate = options.pdfTemplate; this.pdfLibraryAdapter = options.pdfLibraryAdapter; } } PDFFormFillerBase.prototype.getPDFBytes = function () { return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__awaiter)(this, void 0, void 0, function () { var map, plainData; var _a; return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__generator)(this, function (_b) { switch (_b.label) { case 0: map = new _map__WEBPACK_IMPORTED_MODULE_1__["default"](this.fieldMap); plainData = map.mapData(this.data); return [4 /*yield*/, ((_a = this.pdfLibraryAdapter) === null || _a === void 0 ? void 0 : _a.fillForm(this.pdfTemplate, plainData))]; case 1: return [2 /*return*/, _b.sent()]; } }); }); }; /** * An asynchronous method that allows you to get PDF content in different formats. * @param type *(Optional)* One of `"blob"`, `"bloburl"`, `"dataurlstring"`. Do not specify this parameter if you want to get raw PDF content as a string value. */ PDFFormFillerBase.prototype.raw = function (type) { return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__awaiter)(this, void 0, void 0, function () { var pdfBytes, blob; return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__generator)(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getPDFBytes()]; case 1: pdfBytes = _a.sent(); if (!type || !pdfBytes) return [2 /*return*/, pdfBytes]; if (type == 'dataurlstring') return [2 /*return*/, 'data:application/pdf;base64,' + btoa(String.fromCharCode.apply(null, pdfBytes))]; blob = new Blob([pdfBytes], { type: 'application/pdf' }); if (type == 'blob') return [2 /*return*/, blob]; if (type == 'bloburl') return [2 /*return*/, URL.createObjectURL(blob)]; return [2 /*return*/, pdfBytes]; } }); }); }; /** * An asynchronous method that starts to download the filled PDF form in the web browser. * * [View pdf-lib Demo](https://surveyjs.io/pdf-generator/examples/map-survey-responses-to-pdf-fields-using-pdflib/ (linkStyle)) * * [View PDF.js Demo](https://surveyjs.io/pdf-generator/examples/fill-in-pdf-form-fields-with-dynamic-survey-data-using-pdfjs/ (linkStyle)) * @param fileName *(Optional)* A file name with the ".pdf" extension. Default value: `"FilledForm.pdf"`. */ PDFFormFillerBase.prototype.save = function () { return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__awaiter)(this, arguments, void 0, function (fileName) { var pdfBytes; if (fileName === void 0) { fileName = 'FilledForm.pdf'; } return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__generator)(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getPDFBytes()]; case 1: pdfBytes = _a.sent(); if (!pdfBytes) return [2 /*return*/]; return [4 /*yield*/, this.saveToFile(pdfBytes, fileName)]; case 2: _a.sent(); return [2 /*return*/]; } }); }); }; return PDFFormFillerBase; }()); /***/ }), /***/ "./src/pdf_forms/forms-node.ts": /*!*************************************!*\ !*** ./src/pdf_forms/forms-node.ts ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PDFFormFiller: () => (/* binding */ PDFFormFiller) /* harmony export */ }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./src/entries/helpers.ts"); /* harmony import */ var _forms_base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./forms-base */ "./src/pdf_forms/forms-base.ts"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! fs */ "fs"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_2__); var PDFFormFiller = /** @class */ (function (_super) { (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__extends)(PDFFormFiller, _super); function PDFFormFiller() { return _super !== null && _super.apply(this, arguments) || this; } PDFFormFiller.prototype.saveToFile = function (pdfBytes, fileName) { return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__awaiter)(this, void 0, void 0, function () { return (0,tslib__WEBPACK_IMPORTED_MODULE_0__.__generator)(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { (0,fs__WEBPACK_IMPORTED_MODULE_2__.writeFile)(fileName, pdfBytes, function (err) { if (err) reject(err); else resolve(); }); })]; }); }); }; return PDFFormFiller; }(_forms_base__WEBPACK_IMPORTED_MODULE_1__.PDFFormFillerBase)); /***/ }), /***/ "./src/pdf_forms/map.ts": /*!******************************!*\ !*** ./src/pdf_forms/map.ts ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); var FormsMap = /** @class */ (function () { function FormsMap(map) { this.map = map; this.res = {}; } FormsMap.prototype.mapDataRecursive = function (data, map) { var _this = this; if (data === undefined || data === null) return; if (typeof (data) !== 'object') { if (Array.isArray(map)) { map.forEach(function (m) { _this.mapDataRecursive(data, m); }); return; } if (typeof (map) !== 'object') { this.res[map] = data; } else { this.res[map[data].field] = map[data].value; } return; } if (Array.isArray(data)) { data.forEach(function (d, i) { _this.mapDataRecursive(d, Array.isArray(map) ? map[i] : map); }); return; } Object.keys(data).forEach(function (key) { _this.mapDataRecursive(data[key], map[key]); }); }; FormsMap.prototype.mapData = function (data) { this.res = {}; this.mapDataRecursive(data, this.map); return this.res; }; return FormsMap; }()); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FormsMap); /***/ }), /***/ "fs": /*!*********************!*\ !*** external "fs" ***! \*********************/ /***/ ((module) => { module.exports = __WEBPACK_EXTERNAL_MODULE_fs__; /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. (() => { /*!***********************************!*\ !*** ./src/entries/forms-node.ts ***! \***********************************/ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PDFFormFiller: () => (/* reexport safe */ _pdf_forms_forms_node__WEBPACK_IMPORTED_MODULE_0__.PDFFormFiller), /* harmony export */ PDFJSAdapter: () => (/* reexport safe */ _pdf_forms_adapters_pdfjs__WEBPACK_IMPORTED_MODULE_2__.PDFJSAdapter), /* harmony export */ PDFLibAdapter: () => (/* reexport safe */ _pdf_forms_adapters_pdf_lib__WEBPACK_IMPORTED_MODULE_1__.PDFLibAdapter) /* harmony export */ }); /* harmony import */ var _pdf_forms_forms_node__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../pdf_forms/forms-node */ "./src/pdf_forms/forms-node.ts"); /* harmony import */ var _pdf_forms_adapters_pdf_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../pdf_forms/adapters/pdf-lib */ "./src/pdf_forms/adapters/pdf-lib.ts"); /* harmony import */ var _pdf_forms_adapters_pdfjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../pdf_forms/adapters/pdfjs */ "./src/pdf_forms/adapters/pdfjs.ts"); })(); /******/ return __webpack_exports__; /******/ })() ; }); //# sourceMappingURL=pdf-form-filler.node.js.map