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
JavaScript
/*!
* 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