Skip to content

Commit e563510

Browse files
JaneSjsRoman Tsukanov
and
Roman Tsukanov
authored
Node.js Demo - Add Logo, HTML, and Signature Pad (#16)
* Node.js Demo - Add Logo, HTML, and Signature Pad * Update surey and documentation * Fix formatting in index.js * Add links to HTML/SignaturePad * Remove spaces * Fix the image note * Update readme --------- Co-authored-by: Roman Tsukanov <[email protected]>
1 parent 083f2e6 commit e563510

File tree

4 files changed

+564
-39
lines changed

4 files changed

+564
-39
lines changed

surveyjs-pdf-nodejs/README.MD

+10-8
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,23 @@ To generate a PDF form in a Node.js environment, follow these steps:
2222
2323
1. Install the [`survey-pdf`](https://www.npmjs.com/package/survey-pdf) npm package.
2424
25-
2. Create a [`SurveyPDF`](https://surveyjs.io/pdf-generator/documentation/api-reference/surveypdf) instance. Its constructor accepts two parameters: a survey JSON schema and a [PDF document configuration](https://surveyjs.io/pdf-generator/documentation/api-reference/idocoptions).
25+
2. *(Optional)* If your survey contains [HTML](https://surveyjs.io/form-library/documentation/api-reference/add-custom-html-to-survey) or [Signature](https://surveyjs.io/form-library/documentation/api-reference/signature-pad-model) questions, install the [`jsdom`](https://www.npmjs.com/package/jsdom) package to create a simulated web environment in a Node.js application. Create a JSDOM instance and reference the `window` and `document` objects from the JSDOM instance in a global scope.
2626
27-
3. Specify the `data` property of a `SurveyPDF` instance to define question answers. If a survey contains default values and you wish to preserve them, call the `mergeData(newObj)` method instead. For more information on how to programmatically define question answers, refer to the following help topic: [Populate Form Fields](https://surveyjs.io/form-library/documentation/design-survey/pre-populate-form-fields).
27+
3. Create a [`SurveyPDF`](https://surveyjs.io/pdf-generator/documentation/api-reference/surveypdf) instance. Its constructor accepts two parameters: a survey JSON schema and a [PDF document configuration](https://surveyjs.io/pdf-generator/documentation/api-reference/idocoptions).
2828
29+
4. Specify the `data` property of a `SurveyPDF` instance to define question answers. If a survey contains default values and you wish to preserve them, call the `mergeData(newObj)` method instead. For more information on how to programmatically define question answers, refer to the following help topic: [Populate Form Fields](https://surveyjs.io/form-library/documentation/design-survey/pre-populate-form-fields).
2930
30-
4. Call the [save(fileName)](https://surveyjs.io/pdf-generator/documentation/api-reference/surveypdf#save) method on the `SurveyPDF` instance to save a PDF form.
31+
5. Call the [save(fileName)](https://surveyjs.io/pdf-generator/documentation/api-reference/surveypdf#save) method on the `SurveyPDF` instance to save a PDF form.
3132
3233
## Limitations
3334
34-
The following question types are not supported when you generate PDF forms in Node.js:
35+
Please take into account the following restrictions when you generate PDF forms in Node.js:
3536
36-
* [HTML](https://surveyjs.io/form-library/documentation/api-reference/add-custom-html-to-survey)
37-
* [Image](https://surveyjs.io/form-library/documentation/api-reference/add-image-to-survey)
38-
* [Image Picker](https://surveyjs.io/form-library/documentation/api-reference/add-image-to-survey)
39-
* [Signature Pad](https://surveyjs.io/form-library/documentation/api-reference/signature-pad-model)
37+
- **HTML support is limited**
38+
In Node.js, [HTML](https://surveyjs.io/form-library/documentation/api-reference/add-custom-html-to-survey) questions do not support the `"image"` [render mode](https://surveyjs.io/pdf-generator/documentation/api-reference/idocoptions#htmlRenderAs) and complex markup.
39+
40+
- **Only base64-encoded images are supported**
41+
Images embedded in a survey, such as a [survey logo](https://surveyjs.io/form-library/documentation/api-reference/survey-data-model#logo) or images from the [Image](https://surveyjs.io/form-library/documentation/api-reference/add-image-to-survey) and [Image Picker](https://surveyjs.io/form-library/documentation/api-reference/add-image-to-survey) questions, can be specified as base64-encoded strings or as URLs. However, Node.js supports only base64-encoded strings.
4042
4143
## SurveyJS PDF Generator Resources
4244

surveyjs-pdf-nodejs/index.js

+53-31
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
1+
const jsdom = require("jsdom");
2+
const { JSDOM } = jsdom;
13
const SurveyPDF = require("survey-pdf");
24

3-
const surveyPDF = new SurveyPDF.SurveyPDF({
5+
const { window } = new JSDOM(`...`);
6+
global.window = window;
7+
global.document = window.document;
8+
9+
const json = {
410
"title": "COVID-19 Screening Form",
5-
"description": "All fields with an asterisk (*) are required fields and must be filled out in order to process information in strict confidentiality.",
6-
"questionErrorLocation": "bottom",
11+
"focusFirstQuestionAutomatic": false,
712
"pages": [
813
{
914
"name": "patient-info",
10-
"title": "Patient Information",
1115
"elements": [
16+
{
17+
"type": "html",
18+
"name": "introMsg",
19+
"html": "<i>All fields with an asterisk (*) are required fields and must be filled out in order to process information in strict confidentiality.</i>"
20+
},
1221
{
1322
"type": "panel",
1423
"name": "full-name",
15-
"title": "Full name",
1624
"elements": [
1725
{
1826
"type": "text",
@@ -29,7 +37,8 @@ const surveyPDF = new SurveyPDF.SurveyPDF({
2937
"isRequired": true,
3038
"maxLength": 25
3139
}
32-
]
40+
],
41+
"title": "Full name"
3342
},
3443
{
3544
"type": "panel",
@@ -40,14 +49,14 @@ const surveyPDF = new SurveyPDF.SurveyPDF({
4049
"name": "ssn",
4150
"title": "Social Security number",
4251
"isRequired": true,
43-
"maxLength": 9,
4452
"validators": [
4553
{
4654
"type": "regex",
4755
"text": "Your SSN must be a 9-digit number.",
4856
"regex": "^\\d{9}$"
4957
}
50-
]
58+
],
59+
"maxLength": 9
5160
},
5261
{
5362
"type": "text",
@@ -59,11 +68,11 @@ const surveyPDF = new SurveyPDF.SurveyPDF({
5968
}
6069
]
6170
}
62-
]
71+
],
72+
"title": "Patient Information"
6373
},
6474
{
65-
"name": "symptoms",
66-
"title": "Current Symptoms",
75+
"name": "symptoms-page",
6776
"elements": [
6877
{
6978
"type": "checkbox",
@@ -82,11 +91,11 @@ const surveyPDF = new SurveyPDF.SurveyPDF({
8291
"showNoneItem": true,
8392
"noneText": "No symptoms"
8493
}
85-
]
94+
],
95+
"title": "Current Symptoms"
8696
},
8797
{
8898
"name": "contacts",
89-
"title": "Contacts",
9099
"elements": [
91100
{
92101
"type": "boolean",
@@ -97,13 +106,17 @@ const surveyPDF = new SurveyPDF.SurveyPDF({
97106
"type": "radiogroup",
98107
"name": "contacted-covid-positive",
99108
"title": "Have you been in contact with anyone who has since tested positive for COVID-19?",
100-
"choices": [ "Yes", "No", "Not sure" ]
109+
"choices": [
110+
"Yes",
111+
"No",
112+
"Not sure"
113+
]
101114
}
102-
]
115+
],
116+
"title": "Contacts"
103117
},
104118
{
105119
"name": "travels",
106-
"title": "Travels",
107120
"elements": [
108121
{
109122
"type": "boolean",
@@ -116,11 +129,11 @@ const surveyPDF = new SurveyPDF.SurveyPDF({
116129
"visibleIf": "{travelled} = true",
117130
"title": "Where did you go?"
118131
}
119-
]
132+
],
133+
"title": "Travels"
120134
},
121135
{
122136
"name": "tests",
123-
"title": "Tests",
124137
"elements": [
125138
{
126139
"type": "boolean",
@@ -135,12 +148,9 @@ const surveyPDF = new SurveyPDF.SurveyPDF({
135148
{
136149
"type": "paneldynamic",
137150
"name": "emergency-contacts",
151+
"visibleIf": "(({tested-covid-positive} = true or {contacted-covid-positive} = 'Yes') or ({symptoms} notempty and {symptoms} notcontains 'none'))",
138152
"title": "Emergency Contacts",
139153
"description": "If possible, it's best to specify at least TWO emergency contacts.",
140-
"panelsState": "firstExpanded",
141-
"confirmDelete": true,
142-
"panelAddText": "Add a new contact person",
143-
"visibleIf": "(({tested-covid-positive} = true or {contacted-covid-positive} = 'Yes') or ({symptoms} notempty and {symptoms} notcontains 'none'))",
144154
"isRequired": true,
145155
"templateElements": [
146156
{
@@ -166,13 +176,16 @@ const surveyPDF = new SurveyPDF.SurveyPDF({
166176
"title": "Phone number",
167177
"inputType": "tel"
168178
}
169-
]
179+
],
180+
"panelsState": "firstExpanded",
181+
"confirmDelete": true,
182+
"panelAddText": "Add a new contact person"
170183
}
171-
]
184+
],
185+
"title": "Tests"
172186
},
173187
{
174188
"name": "finalization",
175-
"title": "Miscellaneous",
176189
"elements": [
177190
{
178191
"type": "comment",
@@ -185,16 +198,24 @@ const surveyPDF = new SurveyPDF.SurveyPDF({
185198
"title": "Date",
186199
"inputType": "date"
187200
},
188-
]
201+
{
202+
"type": "signaturepad",
203+
"name": "signature",
204+
"startWithNewLine": false,
205+
"title": "Signature"
206+
}
207+
],
208+
"title": "Miscellaneous"
189209
}
190210
],
191-
"completeText": "Submit",
211+
"showQuestionNumbers": "off",
212+
"questionErrorLocation": "bottom",
213+
"completeText": "Submit",
192214
"showPreviewBeforeComplete": "showAnsweredQuestions",
193-
"showQuestionNumbers": false,
194-
"focusFirstQuestionAutomatic": false,
195215
"widthMode": "static",
196216
"width": "1000px"
197-
});
217+
}
218+
const surveyPDF = new SurveyPDF.SurveyPDF(json, { htmlRenderAs: "standard" });
198219

199220
surveyPDF.data = {
200221
"first-name": "Jane",
@@ -209,6 +230,7 @@ surveyPDF.data = {
209230
"travelled": false,
210231
"tested-covid-positive": false,
211232
"awaiting-covid-test": false,
212-
"date": "2023-08-29"
233+
"date": "2023-08-29",
234+
"signature": "data:image/png;base64,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"
213235
}
214236
surveyPDF.save("survey-result.pdf");

0 commit comments

Comments
 (0)