diff --git a/Form Designer/Access Form Fields Collections/index.html b/Form Designer/Access Form Fields Collections/index.html
new file mode 100644
index 0000000..2af9f6e
--- /dev/null
+++ b/Form Designer/Access Form Fields Collections/index.html
@@ -0,0 +1,38 @@
+
+ EJ2 PDF Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Form Designer/Access Form Fields Collections/index.js b/Form Designer/Access Form Fields Collections/index.js
new file mode 100644
index 0000000..eb0820e
--- /dev/null
+++ b/Form Designer/Access Form Fields Collections/index.js
@@ -0,0 +1,14 @@
+var pdfviewer = new ej.pdfviewer.PdfViewer({
+ documentPath: 'https://cdn.syncfusion.com/content/pdf/form-filling-document.pdf',
+ resourceUrl: "https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib",
+ enableFormDesigner: true, //Set 'false' to disable form designer
+});
+ej.pdfviewer.PdfViewer.Inject(ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.Print, ej.pdfviewer.Navigation, ej.pdfviewer.Toolbar,
+ ej.pdfviewer.Magnification, ej.pdfviewer.Annotation, ej.pdfviewer.FormDesigner, ej.pdfviewer.FormFields, ej.pdfviewer.PageOrganizer);
+ pdfviewer.appendTo('#PdfViewer');
+
+ //Click event to get formfields collection
+document.getElementById('formFieldCollection').addEventListener('click', function() {
+ var fields = pdfviewer.formFieldCollection; // Gets all form fields
+ console.log(fields); // Log the formField Collection
+});
\ No newline at end of file
diff --git a/Form Designer/Create form fields/index.html b/Form Designer/Create form fields/index.html
new file mode 100644
index 0000000..abf1fd6
--- /dev/null
+++ b/Form Designer/Create form fields/index.html
@@ -0,0 +1,49 @@
+
+ EJ2 PDF Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Form Designer/Create form fields/index.js b/Form Designer/Create form fields/index.js
new file mode 100644
index 0000000..e790585
--- /dev/null
+++ b/Form Designer/Create form fields/index.js
@@ -0,0 +1,119 @@
+(function () {
+ // Initialize the PDF Viewer
+ var pdfviewer = new ej.pdfviewer.PdfViewer({
+ documentPath: 'https://cdn.syncfusion.com/content/pdf/form-filling-document.pdf',
+ resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'
+ });
+
+ ej.pdfviewer.PdfViewer.Inject(
+ ej.pdfviewer.Toolbar, ej.pdfviewer.Magnification, ej.pdfviewer.Navigation, ej.pdfviewer.Annotation,
+ ej.pdfviewer.LinkAnnotation, ej.pdfviewer.ThumbnailView, ej.pdfviewer.BookmarkView,
+ ej.pdfviewer.TextSelection, ej.pdfviewer.TextSearch, ej.pdfviewer.FormFields, ej.pdfviewer.FormDesigner
+ );
+
+ pdfviewer.appendTo('#PdfViewer');
+
+ // Optional: add an initial example after document load (can be removed)
+ pdfviewer.documentLoad = function () {
+ // Example: place a default textbox when loaded
+ try {
+ pdfviewer.formDesignerModule.addFormField('Textbox', {
+ name: 'First Name',
+ bounds: { X: 146, Y: 229, Width: 150, Height: 24 }
+ });
+ } catch (e) { console.warn(e); }
+ };
+
+ // Button handlers
+ function addTextbox() {
+ pdfviewer.formDesignerModule.addFormField('Textbox', {
+ name: 'First Name',
+ bounds: { X: 146, Y: 229, Width: 150, Height: 24 }
+ });
+ }
+
+ function addPassword() {
+ pdfviewer.formDesignerModule.addFormField('Password', {
+ name: 'Account Password',
+ bounds: { X: 148, Y: 270, Width: 180, Height: 24 }
+ });
+ }
+
+ function addCheckbox() {
+ pdfviewer.formDesignerModule.addFormField('CheckBox', {
+ name: 'Subscribe',
+ isChecked: false,
+ bounds: { X: 56, Y: 664, Width: 20, Height: 20 }
+ });
+ }
+
+ function addRadioGroup() {
+ // Group by same name: 'Gender'
+ pdfviewer.formDesignerModule.addFormField('RadioButton', {
+ name: 'Gender',
+ isSelected: false,
+ bounds: { X: 148, Y: 289, Width: 18, Height: 18 }
+ });
+ pdfviewer.formDesignerModule.addFormField('RadioButton', {
+ name: 'Gender',
+ isSelected: false,
+ bounds: { X: 292, Y: 289, Width: 18, Height: 18 }
+ });
+ }
+
+ function addListBox() {
+ var options = [
+ { itemName: 'Item 1', itemValue: 'item1' },
+ { itemName: 'Item 2', itemValue: 'item2' },
+ { itemName: 'Item 3', itemValue: 'item3' }
+ ];
+ pdfviewer.formDesignerModule.addFormField('ListBox', {
+ name: 'States',
+ options: options,
+ bounds: { X: 380, Y: 320, Width: 150, Height: 60 }
+ });
+ }
+
+ function addDropDown() {
+ var options = [
+ { itemName: 'Item 1', itemValue: 'item1' },
+ { itemName: 'Item 2', itemValue: 'item2' },
+ { itemName: 'Item 3', itemValue: 'item3' }
+ ];
+ pdfviewer.formDesignerModule.addFormField('DropDown', {
+ name: 'Country',
+ options: options,
+ bounds: { X: 560, Y: 320, Width: 150, Height: 24 }
+ });
+ }
+
+ function addSignature() {
+ pdfviewer.formDesignerModule.addFormField('SignatureField', {
+ name: 'Sign',
+ bounds: { X: 57, Y: 923, Width: 200, Height: 43 }
+ });
+ }
+
+ function addInitial() {
+ pdfviewer.formDesignerModule.addFormField('InitialField', {
+ name: 'Initial',
+ bounds: { X: 148, Y: 466, Width: 200, Height: 43 }
+ });
+ }
+
+ function drawNextAsPassword() {
+ // Switch to interactive draw mode; click on the PDF to place the field
+ pdfviewer.formDesignerModule.setFormFieldMode('Password');
+ }
+
+ // Wire up buttons
+ document.getElementById('btnAddTextbox').addEventListener('click', addTextbox);
+ document.getElementById('btnAddPassword').addEventListener('click', addPassword);
+ document.getElementById('btnAddCheckbox').addEventListener('click', addCheckbox);
+ document.getElementById('btnAddRadioGroup').addEventListener('click', addRadioGroup);
+ document.getElementById('btnAddListBox').addEventListener('click', addListBox);
+ document.getElementById('btnAddDropDown').addEventListener('click', addDropDown);
+ document.getElementById('btnAddSignature').addEventListener('click', addSignature);
+ document.getElementById('btnAddInitial').addEventListener('click', addInitial);
+ document.getElementById('btnDrawPassword').addEventListener('click', drawNextAsPassword);
+})();
\ No newline at end of file
diff --git a/Form Designer/Custom Data in form fields/index.html b/Form Designer/Custom Data in form fields/index.html
new file mode 100644
index 0000000..caba8c2
--- /dev/null
+++ b/Form Designer/Custom Data in form fields/index.html
@@ -0,0 +1,38 @@
+
+ EJ2 PDF Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Form Designer/Custom Data in form fields/index.js b/Form Designer/Custom Data in form fields/index.js
new file mode 100644
index 0000000..cdba5c2
--- /dev/null
+++ b/Form Designer/Custom Data in form fields/index.js
@@ -0,0 +1,69 @@
+// Inject required modules (ES5)
+ej.pdfviewer.PdfViewer.Inject(
+ ej.pdfviewer.Toolbar,
+ ej.pdfviewer.Magnification,
+ ej.pdfviewer.Navigation,
+ ej.pdfviewer.LinkAnnotation,
+ ej.pdfviewer.ThumbnailView,
+ ej.pdfviewer.BookmarkView,
+ ej.pdfviewer.TextSelection,
+ ej.pdfviewer.Annotation,
+ ej.pdfviewer.FormDesigner,
+ ej.pdfviewer.FormFields
+);
+
+var viewer = new ej.pdfviewer.PdfViewer({
+ documentPath: 'https://cdn.syncfusion.com/content/pdf/form-designer.pdf',
+ resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib'
+ // For server-backed:
+ // serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'
+});
+viewer.appendTo('#pdfViewer');
+
+// Default customData for fields added via Form Designer toolbar
+viewer.textFieldSettings = {
+ name: 'Textbox',
+ customData: { group: 'contact', createdBy: 'designer', requiredRole: 'user' }
+};
+
+// Add a field programmatically with customData after document loads
+viewer.documentLoad = function () {
+ var meta = { businessId: 'C-1024', tags: ['profile', 'kiosk'], requiredRole: 'admin' };
+ viewer.formDesignerModule.addFormField('Textbox', {
+ name: 'Email',
+ bounds: { X: 146, Y: 229, Width: 200, Height: 24 },
+ customData: meta
+ });
+};
+
+// Helper to get first field
+function getFirstField() {
+ var fields = (viewer.retrieveFormFields && viewer.retrieveFormFields()) || viewer.formFieldCollections || [];
+ return fields && fields.length ? fields[0] : null;
+}
+
+// Update/replace customData on an existing field
+var btnUpdate = document.getElementById('updateCustomData');
+if (btnUpdate) {
+ btnUpdate.addEventListener('click', function () {
+ var target = getFirstField();
+ if (!target) { alert('No form fields found'); return; }
+ viewer.formDesignerModule.updateFormField(target, {
+ customData: { group: 'profile', flags: ['pii', 'masked'], updatedAt: Date.now() }
+ });
+ alert('customData updated on first field');
+ });
+}
+
+// Read customData from all fields
+var btnLog = document.getElementById('logCustomData');
+if (btnLog) {
+ btnLog.addEventListener('click', function () {
+ var fields = (viewer.retrieveFormFields && viewer.retrieveFormFields()) || viewer.formFieldCollections || [];
+ if (!fields.length) { console.log('No fields'); return; }
+ fields.forEach(function (f, i) {
+ console.log('#' + i + ' ' + f.name, f.customData);
+ });
+ alert('Check console for customData logs');
+ });
+}
\ No newline at end of file
diff --git a/Form Designer/Edit form fields/index.html b/Form Designer/Edit form fields/index.html
new file mode 100644
index 0000000..6ec9b72
--- /dev/null
+++ b/Form Designer/Edit form fields/index.html
@@ -0,0 +1,47 @@
+
+ EJ2 PDF Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Form Designer/Edit form fields/index.js b/Form Designer/Edit form fields/index.js
new file mode 100644
index 0000000..f5e32b7
--- /dev/null
+++ b/Form Designer/Edit form fields/index.js
@@ -0,0 +1,177 @@
+// Inject required modules once
+ej.pdfviewer.PdfViewer.Inject(
+ ej.pdfviewer.Toolbar,
+ ej.pdfviewer.Magnification,
+ ej.pdfviewer.Navigation,
+ ej.pdfviewer.Annotation,
+ ej.pdfviewer.LinkAnnotation,
+ ej.pdfviewer.ThumbnailView,
+ ej.pdfviewer.BookmarkView,
+ ej.pdfviewer.TextSelection,
+ ej.pdfviewer.TextSearch,
+ ej.pdfviewer.FormFields,
+ ej.pdfviewer.FormDesigner
+);
+
+// Create and mount viewer
+var pdfviewer = new ej.pdfviewer.PdfViewer({
+ documentPath: 'https://cdn.syncfusion.com/content/pdf/form-filling-document.pdf',
+ resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib'
+});
+pdfviewer.appendTo('#PdfViewer');
+
+// Utility helpers (safe for ES5 environments)
+function getFields() {
+ try { return pdfviewer.retrieveFormFields() || []; } catch (e) { return []; }
+}
+function first(arr, predicate) {
+ for (var i = 0; i < arr.length; i++) { if (predicate(arr[i])) return arr[i]; }
+ return null;
+}
+function all(arr, predicate) {
+ var out = [];
+ for (var i = 0; i < arr.length; i++) { if (predicate(arr[i])) out.push(arr[i]); }
+ return out;
+}
+
+// Edit Textbox
+document.getElementById('editTextbox') && document.getElementById('editTextbox').addEventListener('click', function () {
+ var fields = getFields();
+ var field = first(fields, function (f) { return f.name === 'First Name'; }) || fields[0];
+ if (field) {
+ pdfviewer.formDesignerModule.updateFormField(field, {
+ value: 'John',
+ fontFamily: 'Courier',
+ fontSize: 12,
+ fontStyle: ej.pdfviewer.FontStyle.None,
+ color: 'black',
+ backgroundColor: 'white',
+ borderColor: 'black',
+ thickness: 2,
+ alignment: 'Left',
+ maxLength: 50
+ });
+ }
+});
+
+// Edit Password
+document.getElementById('editPasswordBox') && document.getElementById('editPasswordBox').addEventListener('click', function () {
+ var fields = getFields();
+ var field = first(fields, function (f) { return f.name === 'Password'; });
+ if (field) {
+ pdfviewer.formDesignerModule.updateFormField(field, {
+ tooltip: 'Enter your password',
+ isReadOnly: false,
+ isRequired: true,
+ isPrint: true,
+ fontFamily: 'Courier',
+ fontSize: 10,
+ color: 'black',
+ borderColor: 'black',
+ backgroundColor: 'white',
+ alignment: 'Left',
+ maxLength: 20,
+ thickness: 1
+ });
+ }
+});
+
+// Edit CheckBox
+document.getElementById('editCheckbox') && document.getElementById('editCheckbox').addEventListener('click', function () {
+ var fields = getFields();
+ var cb = first(fields, function (f) { return f.name === 'Subscribe'; });
+ if (cb) {
+ pdfviewer.formDesignerModule.updateFormField(cb, {
+ isChecked: true,
+ backgroundColor: 'white',
+ borderColor: 'black',
+ thickness: 2,
+ tooltip: 'Subscribe to newsletter'
+ });
+ }
+});
+
+// Edit RadioButton group (example: "Gender")
+document.getElementById('editRadio') && document.getElementById('editRadio').addEventListener('click', function () {
+ var fields = getFields();
+ var group = all(fields, function (f) { return f.name === 'Gender'; });
+ if (group.length > 1) {
+ // Deselect first, select second
+ pdfviewer.formDesignerModule.updateFormField(group[0], { isSelected: false });
+ pdfviewer.formDesignerModule.updateFormField(group[1], { isSelected: true, thickness: 2, borderColor: 'black' });
+ }
+});
+
+// Edit ListBox
+document.getElementById('editListBox') && document.getElementById('editListBox').addEventListener('click', function () {
+ var fields = getFields();
+ var lb = first(fields, function (f) { return f.name === 'States'; });
+ if (lb) {
+ pdfviewer.formDesignerModule.updateFormField(lb, {
+ options: [
+ { itemName: 'Alabama', itemValue: 'AL' },
+ { itemName: 'Alaska', itemValue: 'AK' },
+ { itemName: 'Arizona', itemValue: 'AZ' }
+ ],
+ value: 'AZ',
+ fontFamily: 'Courier',
+ fontSize: 10,
+ color: 'black',
+ borderColor: 'black',
+ backgroundColor: 'white'
+ });
+ }
+});
+
+// Edit DropDown
+document.getElementById('editDropDown') && document.getElementById('editDropDown').addEventListener('click', function () {
+ var fields = getFields();
+ var dd = first(fields, function (f) { return f.name === 'Country'; });
+ if (dd) {
+ pdfviewer.formDesignerModule.updateFormField(dd, {
+ options: [
+ { itemName: 'USA', itemValue: 'US' },
+ { itemName: 'Canada', itemValue: 'CA' },
+ { itemName: 'Mexico', itemValue: 'MX' }
+ ],
+ value: 'US',
+ fontFamily: 'Courier',
+ fontSize: 10,
+ color: 'black',
+ borderColor: 'black',
+ backgroundColor: 'white'
+ });
+ }
+});
+
+// Edit Signature field
+document.getElementById('editSignature') && document.getElementById('editSignature').addEventListener('click', function () {
+ var fields = getFields();
+ var sig = first(fields, function (f) { return f.name === 'Sign'; });
+ if (sig) {
+ pdfviewer.formDesignerModule.updateFormField(sig, {
+ tooltip: 'Please sign here',
+ thickness: 3,
+ isRequired: true,
+ isPrint: true,
+ backgroundColor: 'white',
+ borderColor: 'black'
+ });
+ }
+});
+
+// Edit Initial field
+document.getElementById('editInitial') && document.getElementById('editInitial').addEventListener('click', function () {
+ var fields = getFields();
+ var init = first(fields, function (f) { return f.name === 'Initial'; });
+ if (init) {
+ pdfviewer.formDesignerModule.updateFormField(init, {
+ tooltip: 'Add your initials',
+ thickness: 2,
+ isRequired: true,
+ isPrint: true,
+ backgroundColor: 'white',
+ borderColor: 'black'
+ });
+ }
+});
\ No newline at end of file
diff --git a/Form Designer/Export or Import Form Fields/index.html b/Form Designer/Export or Import Form Fields/index.html
new file mode 100644
index 0000000..5da902d
--- /dev/null
+++ b/Form Designer/Export or Import Form Fields/index.html
@@ -0,0 +1,44 @@
+
+ EJ2 PDF Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Form Designer/Export or Import Form Fields/index.js b/Form Designer/Export or Import Form Fields/index.js
new file mode 100644
index 0000000..e0fa895
--- /dev/null
+++ b/Form Designer/Export or Import Form Fields/index.js
@@ -0,0 +1,63 @@
+// Inject required modules
+ej.pdfviewer.PdfViewer.Inject(
+ ej.pdfviewer.Toolbar,
+ ej.pdfviewer.Magnification,
+ ej.pdfviewer.Navigation,
+ ej.pdfviewer.Annotation,
+ ej.pdfviewer.LinkAnnotation,
+ ej.pdfviewer.ThumbnailView,
+ ej.pdfviewer.BookmarkView,
+ ej.pdfviewer.TextSelection,
+ ej.pdfviewer.FormFields,
+ ej.pdfviewer.FormDesigner
+);
+
+// Initialize viewer
+var viewer = new ej.pdfviewer.PdfViewer({
+ documentPath: 'https://cdn.syncfusion.com/content/pdf/form-designer.pdf',
+ // For server-backed viewer, set:
+ // serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/',
+ resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib'
+});
+viewer.appendTo('#pdfViewer');
+
+// Export to files
+document.getElementById('exportFdf').addEventListener('click', function () {
+ viewer.exportFormFields('FormData', ej.pdfviewer.FormFieldDataFormat.Fdf);
+});
+document.getElementById('exportXfdf').addEventListener('click', function () {
+ viewer.exportFormFields('FormData', ej.pdfviewer.FormFieldDataFormat.Xfdf);
+});
+document.getElementById('exportJson').addEventListener('click', function () {
+ viewer.exportFormFields('FormData', ej.pdfviewer.FormFieldDataFormat.Json);
+});
+
+// Export as object (for custom persistence)
+var exportedData;
+document.getElementById('exportObj').addEventListener('click', function () {
+ viewer
+ .exportFormFieldsAsObject(ej.pdfviewer.FormFieldDataFormat.Fdf)
+ .then(function (value) {
+ exportedData = value;
+ console.log('Exported object:', exportedData);
+ });
+ // Alternatives:
+ // viewer.exportFormFieldsAsObject(ej.pdfviewer.FormFieldDataFormat.Xfdf).then(...)
+ // viewer.exportFormFieldsAsObject(ej.pdfviewer.FormFieldDataFormat.Json).then(...)
+});
+
+// Import from files (replace 'File' with your file path/stream integration)
+document.getElementById('importFdf').addEventListener('click', function () {
+ viewer.importFormFields('File', ej.pdfviewer.FormFieldDataFormat.Fdf);
+});
+document.getElementById('importXfdf').addEventListener('click', function () {
+ viewer.importFormFields('File', ej.pdfviewer.FormFieldDataFormat.Xfdf);
+});
+document.getElementById('importJson').addEventListener('click', function () {
+ viewer.importFormFields('form-designer.json', ej.pdfviewer.FormFieldDataFormat.Json);
+});
+
+// Import from previously exported object
+document.getElementById('importObj').addEventListener('click', function () {
+ viewer.importFormFields(exportedData, ej.pdfviewer.FormFieldDataFormat.Fdf);
+});
\ No newline at end of file
diff --git a/Form Designer/Form Field Constrain/index.html b/Form Designer/Form Field Constrain/index.html
new file mode 100644
index 0000000..358ea32
--- /dev/null
+++ b/Form Designer/Form Field Constrain/index.html
@@ -0,0 +1,35 @@
+
+ EJ2 PDF Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Form Designer/Form Field Constrain/index.js b/Form Designer/Form Field Constrain/index.js
new file mode 100644
index 0000000..81682f3
--- /dev/null
+++ b/Form Designer/Form Field Constrain/index.js
@@ -0,0 +1,105 @@
+
+// Inject required modules
+ej.pdfviewer.PdfViewer.Inject(
+ ej.pdfviewer.Toolbar,
+ ej.pdfviewer.Magnification,
+ ej.pdfviewer.Navigation,
+ ej.pdfviewer.Annotation,
+ ej.pdfviewer.LinkAnnotation,
+ ej.pdfviewer.ThumbnailView,
+ ej.pdfviewer.BookmarkView,
+ ej.pdfviewer.TextSelection,
+ ej.pdfviewer.TextSearch,
+ ej.pdfviewer.FormDesigner,
+ ej.pdfviewer.FormFields
+);
+
+// Initialize the viewer
+var pdfviewer = new ej.pdfviewer.PdfViewer({
+ documentPath: 'https://cdn.syncfusion.com/content/pdf/form-designer.pdf',
+ resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib'
+ // For server-backed:
+ // serviceUrl: 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/'
+});
+pdfviewer.appendTo('#pdfViewer');
+
+// Default constraints for newly added fields (from toolbar)
+pdfviewer.textFieldSettings = {
+ isReadOnly: false,
+ isRequired: true, // New textboxes will be required by default
+ isPrint: true,
+ tooltip: 'Required field'
+};
+pdfviewer.signatureFieldSettings = {
+ isReadOnly: false,
+ isRequired: false,
+ isPrint: false, // New signatures won’t appear in print by default
+ tooltip: 'Sign if applicable'
+};
+
+// Create fields with constraints on document load
+pdfviewer.documentLoad = function () {
+ // isReadOnly example (printed, not required)
+ pdfviewer.formDesignerModule.addFormField('Textbox', {
+ name: 'EmployeeId',
+ bounds: { X: 146, Y: 229, Width: 150, Height: 24 },
+ isReadOnly: true,
+ isRequired: false,
+ isPrint: true,
+ value: 'EMP-0001'
+ });
+
+ // isRequired example (required email)
+ pdfviewer.formDesignerModule.addFormField('Textbox', {
+ name: 'Email',
+ bounds: { X: 146, Y: 260, Width: 220, Height: 24 },
+ isReadOnly: false,
+ isRequired: true,
+ isPrint: true,
+ tooltip: 'Email is required'
+ });
+
+ // isPrint example (do not print signature)
+ pdfviewer.formDesignerModule.addFormField('SignatureField', {
+ name: 'ApplicantSign',
+ bounds: { X: 57, Y: 923, Width: 200, Height: 43 },
+ isReadOnly: false,
+ isRequired: true,
+ isPrint: false,
+ tooltip: 'Sign to accept the terms'
+ });
+};
+
+// Validation wiring (show message if required fields are empty)
+pdfviewer.enableFormFieldsValidation = true;
+pdfviewer.validateFormFields = function (args) {
+ // If needed, you can inspect args to control behavior.
+ alert('Please fill all required fields');
+};
+
+// Update constraints programmatically (button)
+document.getElementById('updateConstraints') && document.getElementById('updateConstraints').addEventListener('click', function () {
+ // Toggle EmployeeId to editable
+ var emp = (pdfviewer.formFieldCollections || []).find(function (f) { return f.name === 'EmployeeId'; });
+ if (emp) {
+ pdfviewer.formDesignerModule.updateFormField(emp, { isReadOnly: false });
+ }
+
+ // Ensure Email stays required and printable
+ var email = (pdfviewer.formFieldCollections || []).find(function (f) { return f.name === 'Email'; });
+ if (email) {
+ pdfviewer.formDesignerModule.updateFormField(email, {
+ isRequired: true,
+ isPrint: true,
+ tooltip: 'Enter a valid email'
+ });
+ }
+
+ // Make signature printable (flip from default isPrint: false)
+ var sign = (pdfviewer.formFieldCollections || []).find(function (f) { return f.name === 'ApplicantSign'; });
+ if (sign) {
+ pdfviewer.formDesignerModule.updateFormField(sign, { isPrint: true });
+ }
+
+ alert('Constraints updated.');
+});
\ No newline at end of file
diff --git a/Form Designer/Group Form Fields/index.html b/Form Designer/Group Form Fields/index.html
new file mode 100644
index 0000000..3a9e9ca
--- /dev/null
+++ b/Form Designer/Group Form Fields/index.html
@@ -0,0 +1,34 @@
+
+ EJ2 PDF Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Form Designer/Group Form Fields/index.js b/Form Designer/Group Form Fields/index.js
new file mode 100644
index 0000000..d4ae1b1
--- /dev/null
+++ b/Form Designer/Group Form Fields/index.js
@@ -0,0 +1,58 @@
+// Inject required modules using fully-qualified UMD globals
+ej.pdfviewer.PdfViewer.Inject(
+ ej.pdfviewer.Toolbar,
+ ej.pdfviewer.Magnification,
+ ej.pdfviewer.Navigation,
+ ej.pdfviewer.LinkAnnotation,
+ ej.pdfviewer.ThumbnailView,
+ ej.pdfviewer.BookmarkView,
+ ej.pdfviewer.TextSelection,
+ ej.pdfviewer.Annotation,
+ ej.pdfviewer.FormDesigner,
+ ej.pdfviewer.FormFields
+);
+
+// Initialize viewer
+var pdfviewer = new ej.pdfviewer.PdfViewer({
+ documentPath: 'https://cdn.syncfusion.com/content/pdf/form-designer.pdf',
+ resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib'
+});
+
+pdfviewer.appendTo('#pdfViewer');
+
+// Add grouped form fields on document load
+pdfviewer.documentLoad = function () {
+ // Textbox group: same name => mirrored value
+ pdfviewer.formDesignerModule.addFormField('Textbox', {
+ name: 'EmployeeId',
+ bounds: { X: 146, Y: 229, Width: 150, Height: 24 }
+ });
+ pdfviewer.formDesignerModule.addFormField('Textbox', {
+ name: 'EmployeeId',
+ bounds: { X: 338, Y: 229, Width: 150, Height: 24 }
+ });
+
+ // Radio button group: same name => exclusive selection
+ pdfviewer.formDesignerModule.addFormField('RadioButton', {
+ name: 'Gender',
+ bounds: { X: 148, Y: 289, Width: 18, Height: 18 },
+ isSelected: false
+ });
+ pdfviewer.formDesignerModule.addFormField('RadioButton', {
+ name: 'Gender',
+ bounds: { X: 292, Y: 289, Width: 18, Height: 18 },
+ isSelected: false
+ });
+
+ // CheckBox group: same name => mirrored checked state
+ pdfviewer.formDesignerModule.addFormField('CheckBox', {
+ name: 'Subscribe',
+ bounds: { X: 56, Y: 664, Width: 20, Height: 20 },
+ isChecked: false
+ });
+ pdfviewer.formDesignerModule.addFormField('CheckBox', {
+ name: 'Subscribe',
+ bounds: { X: 242, Y: 664, Width: 20, Height: 20 },
+ isChecked: false
+ });
+};
\ No newline at end of file
diff --git a/Form Designer/Remove form fields/index.html b/Form Designer/Remove form fields/index.html
new file mode 100644
index 0000000..8f4c651
--- /dev/null
+++ b/Form Designer/Remove form fields/index.html
@@ -0,0 +1,40 @@
+
+ EJ2 PDF Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Form Designer/Remove form fields/index.js b/Form Designer/Remove form fields/index.js
new file mode 100644
index 0000000..43cd679
--- /dev/null
+++ b/Form Designer/Remove form fields/index.js
@@ -0,0 +1,58 @@
+// Inject required modules
+ej.pdfviewer.PdfViewer.Inject(
+ ej.pdfviewer.Toolbar,
+ ej.pdfviewer.Magnification,
+ ej.pdfviewer.Navigation,
+ ej.pdfviewer.LinkAnnotation,
+ ej.pdfviewer.ThumbnailView,
+ ej.pdfviewer.BookmarkView,
+ ej.pdfviewer.TextSelection,
+ ej.pdfviewer.Annotation,
+ ej.pdfviewer.FormDesigner,
+ ej.pdfviewer.FormFields
+);
+
+var pdfviewer = new ej.pdfviewer.PdfViewer({
+ documentPath: 'https://cdn.syncfusion.com/content/pdf/form-designer.pdf',
+ resourceUrl: 'https://cdn.syncfusion.com/ej2/31.2.2/dist/ej2-pdfviewer-lib'
+});
+
+// Optional server-backed
+// pdfviewer.serviceUrl = 'https://document.syncfusion.com/web-services/pdf-viewer/api/pdfviewer/';
+
+pdfviewer.appendTo('#PdfViewer');
+
+// Add form fields on document load
+pdfviewer.documentLoad = function () {
+ pdfviewer.formDesignerModule.addFormField('Textbox', {
+ name: 'First Name',
+ bounds: { X: 146, Y: 229, Width: 150, Height: 24 }
+ });
+
+ pdfviewer.formDesignerModule.addFormField('Password', {
+ name: 'Password',
+ bounds: { X: 338, Y: 229, Width: 150, Height: 24 }
+ });
+
+ pdfviewer.formDesignerModule.addFormField('SignatureField', {
+ name: 'Sign Here',
+ bounds: { X: 146, Y: 280, Width: 200, Height: 43 }
+ });
+};
+
+// Delete all added form fields on button click (passing field objects)
+document.getElementById('deleteAllFields') && document.getElementById('deleteAllFields').addEventListener('click', function () {
+ // Clone to avoid mutation while deleting
+ var fields = pdfviewer.retrieveFormFields().slice();
+ fields.forEach(function (field) {
+ pdfviewer.formDesignerModule.deleteFormField(field);
+ });
+});
+
+// Delete by ID on button click (example uses the first field's ID)
+document.getElementById('deleteById') && document.getElementById('deleteById').addEventListener('click', function () {
+ var list = pdfviewer.retrieveFormFields();
+ if (list.length > 0 && list[0].id) {
+ pdfviewer.formDesignerModule.deleteFormField(list[0].id);
+ }
+});
\ No newline at end of file
diff --git a/Form Designer/Style form fields/index.html b/Form Designer/Style form fields/index.html
new file mode 100644
index 0000000..1c3b6a9
--- /dev/null
+++ b/Form Designer/Style form fields/index.html
@@ -0,0 +1,46 @@
+
+ EJ2 PDF Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Form Designer/Style form fields/index.js b/Form Designer/Style form fields/index.js
new file mode 100644
index 0000000..bd43e98
--- /dev/null
+++ b/Form Designer/Style form fields/index.js
@@ -0,0 +1,321 @@
+// Inject required modules
+ej.pdfviewer.PdfViewer.Inject(
+ ej.pdfviewer.Toolbar,
+ ej.pdfviewer.Magnification,
+ ej.pdfviewer.Navigation,
+ ej.pdfviewer.Annotation,
+ ej.pdfviewer.LinkAnnotation,
+ ej.pdfviewer.ThumbnailView,
+ ej.pdfviewer.BookmarkView,
+ ej.pdfviewer.TextSelection,
+ ej.pdfviewer.TextSearch,
+ ej.pdfviewer.FormFields,
+ ej.pdfviewer.FormDesigner
+);
+
+// Create and configure the viewer
+var pdfviewer = new ej.pdfviewer.PdfViewer({
+ documentPath: 'https://cdn.syncfusion.com/content/pdf/form-designer.pdf',
+ resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib'
+});
+
+// Apply default settings for all fields (used when adding from Form Designer toolbar)
+pdfviewer.textFieldSettings = {
+ name: 'Textbox',
+ isReadOnly: false,
+ visibility: 'visible',
+ isRequired: false,
+ isPrint: true,
+ tooltip: 'Textbox',
+ thickness: 4,
+ value: 'Textbox',
+ fontFamily: 'Courier',
+ fontSize: 10,
+ fontStyle: 'None',
+ color: 'black',
+ borderColor: 'black',
+ backgroundColor: 'White',
+ alignment: 'Left',
+ maxLength: 0,
+ isMultiline: false
+};
+
+pdfviewer.passwordFieldSettings = {
+ name: 'Password',
+ isReadOnly: false,
+ visibility: 'visible',
+ isRequired: false,
+ isPrint: true,
+ tooltip: 'Password',
+ thickness: 4,
+ value: 'Password',
+ fontFamily: 'Courier',
+ fontSize: 10,
+ fontStyle: 'None',
+ color: 'black',
+ borderColor: 'black',
+ backgroundColor: 'white',
+ alignment: 'Left',
+ maxLength: 0
+};
+
+pdfviewer.checkBoxFieldSettings = {
+ name: 'CheckBox',
+ isReadOnly: false,
+ visibility: 'visible',
+ isRequired: false,
+ isPrint: true,
+ tooltip: 'CheckBox',
+ thickness: 4,
+ isChecked: true,
+ backgroundColor: 'white',
+ borderColor: 'black'
+};
+
+pdfviewer.radioButtonFieldSettings = {
+ name: 'RadioButton',
+ isReadOnly: false,
+ visibility: 'visible',
+ isRequired: false,
+ isPrint: true,
+ tooltip: 'RadioButton',
+ thickness: 4,
+ isSelected: true,
+ backgroundColor: 'white',
+ borderColor: 'black',
+ value: 'RadioButton'
+};
+
+var customListOptions = [
+ { itemName: 'item1', itemValue: 'item1' },
+ { itemName: 'item2', itemValue: 'item2' },
+ { itemName: 'item3', itemValue: 'item3' }
+];
+
+pdfviewer.listBoxFieldSettings = {
+ name: 'ListBox',
+ isReadOnly: false,
+ visibility: 'visible',
+ isRequired: false,
+ isPrint: true,
+ tooltip: 'ListBox',
+ thickness: 4,
+ value: 'ListBox',
+ fontFamily: 'Courier',
+ fontSize: 10,
+ fontStyle: 'None',
+ color: 'black',
+ borderColor: 'black',
+ backgroundColor: 'White',
+ alignment: 'Left',
+ options: customListOptions
+};
+
+var dropDownOptions = [
+ { itemName: 'item1', itemValue: 'item1' },
+ { itemName: 'item2', itemValue: 'item2' },
+ { itemName: 'item3', itemValue: 'item3' }
+];
+
+pdfviewer.dropDownFieldSettings = {
+ name: 'DropDown',
+ isReadOnly: false,
+ visibility: 'visible',
+ isRequired: false,
+ isPrint: true,
+ tooltip: 'DropDown',
+ thickness: 4,
+ value: 'DropDown',
+ fontFamily: 'Courier',
+ fontSize: 10,
+ fontStyle: 'None',
+ color: 'black',
+ borderColor: 'black',
+ backgroundColor: 'White',
+ alignment: 'Left',
+ options: dropDownOptions
+};
+
+pdfviewer.signatureFieldSettings = {
+ name: 'Signature',
+ isReadOnly: false,
+ visibility: 'visible',
+ isRequired: false,
+ isPrint: true,
+ tooltip: 'Signature',
+ thickness: 4,
+ signatureIndicatorSettings: {
+ opacity: 1,
+ backgroundColor: '#237ba2',
+ height: 50,
+ fontSize: 15,
+ text: 'Signature Field',
+ color: 'white'
+ }
+};
+
+pdfviewer.initialFieldSettings = {
+ name: 'Initial',
+ isReadOnly: false,
+ visibility: 'visible',
+ isRequired: false,
+ isPrint: true,
+ tooltip: 'Initial',
+ thickness: 4,
+ initialIndicatorSettings: {
+ opacity: 1,
+ backgroundColor: '#237ba2',
+ height: 50,
+ fontSize: 15,
+ text: 'Initial Field',
+ color: 'white'
+ }
+};
+
+// Mount viewer
+pdfviewer.appendTo('#PdfViewer');
+
+// Utility to safely get fields (waits until document is loaded if needed)
+function getFields() {
+ // prefer live collection when available
+ if (pdfviewer.formFieldCollections && pdfviewer.formFieldCollections.length) {
+ return pdfviewer.formFieldCollections;
+ }
+ // fallback to retrieve API
+ try {
+ return pdfviewer.retrieveFormFields ? pdfviewer.retrieveFormFields() : [];
+ } catch {
+ return [];
+ }
+}
+
+// Wire up buttons
+
+document.getElementById('updateTextboxStyle')?.addEventListener('click', function () {
+ var fields = getFields();
+ var tb = fields.find(function (f) { return f.name === 'First Name'; }) || fields[0];
+ if (tb) {
+ pdfviewer.formDesignerModule.updateFormField(tb, {
+ value: 'John',
+ fontFamily: 'Courier',
+ fontSize: 12,
+ fontStyle: ej.pdfviewer.FontStyle.None,
+ color: 'black',
+ borderColor: 'black',
+ backgroundColor: 'white',
+ alignment: 'Left',
+ thickness: 2
+ });
+ }
+});
+
+document.getElementById('updatePasswordStyle')?.addEventListener('click', function () {
+ var fields = getFields();
+ var pw = fields.find(function (f) { return f.name === 'Password'; });
+ if (pw) {
+ pdfviewer.formDesignerModule.updateFormField(pw, {
+ tooltip: 'Enter password',
+ fontFamily: 'Courier',
+ fontSize: 10,
+ color: 'black',
+ borderColor: 'black',
+ backgroundColor: 'white',
+ alignment: 'Left',
+ maxLength: 20,
+ thickness: 1
+ });
+ }
+});
+
+document.getElementById('updateCheckBoxStyle')?.addEventListener('click', function () {
+ var fields = getFields();
+ var cb = fields.find(function (f) { return f.name === 'Subscribe'; });
+ if (cb) {
+ pdfviewer.formDesignerModule.updateFormField(cb, {
+ isChecked: true,
+ backgroundColor: 'white',
+ borderColor: 'black',
+ thickness: 2,
+ tooltip: 'Subscribe'
+ });
+ }
+});
+
+document.getElementById('updateRadioButtonStyle')?.addEventListener('click', function () {
+ var fields = getFields();
+ var radios = fields.filter(function (f) { return f.name === 'Gender'; });
+ if (radios.length > 1) {
+ pdfviewer.formDesignerModule.updateFormField(radios[0], { isSelected: false });
+ pdfviewer.formDesignerModule.updateFormField(radios[1], { isSelected: true, thickness: 2, borderColor: 'black' });
+ }
+});
+
+document.getElementById('updateListBoxStyle')?.addEventListener('click', function () {
+ var fields = getFields();
+ var lb = fields.find(function (f) { return f.name === 'States'; });
+ if (lb) {
+ pdfviewer.formDesignerModule.updateFormField(lb, {
+ options: [
+ { itemName: 'Item 1', itemValue: 'item1' },
+ { itemName: 'Item 2', itemValue: 'item2' },
+ { itemName: 'Item 3', itemValue: 'item3' }
+ ],
+ value: 'item2',
+ fontFamily: 'Courier',
+ fontSize: 10,
+ color: 'black',
+ borderColor: 'black',
+ backgroundColor: 'white'
+ });
+ }
+});
+
+document.getElementById('updateDropDownStyle')?.addEventListener('click', function () {
+ var fields = getFields();
+ var dd = fields.find(function (f) { return f.name === 'Country'; });
+ if (dd) {
+ pdfviewer.formDesignerModule.updateFormField(dd, {
+ options: [
+ { itemName: 'USA', itemValue: 'US' },
+ { itemName: 'Canada', itemValue: 'CA' },
+ { itemName: 'Mexico', itemValue: 'MX' }
+ ],
+ value: 'US',
+ fontFamily: 'Courier',
+ fontSize: 10,
+ color: 'black',
+ borderColor: 'black',
+ backgroundColor: 'white'
+ });
+ }
+});
+
+document.getElementById('updateSignatureStyle')?.addEventListener('click', function () {
+ var fields = getFields();
+ var sig = fields.find(function (f) { return f.name === 'Sign'; });
+ if (sig) {
+ pdfviewer.formDesignerModule.updateFormField(sig, {
+ tooltip: 'Please sign here',
+ thickness: 3,
+ isRequired: true,
+ isPrint: true,
+ backgroundColor: 'white',
+ borderColor: 'black'
+ });
+ }
+});
+
+document.getElementById('updateInitialStyle')?.addEventListener('click', function () {
+ var fields = getFields();
+ var init = fields.find(function (f) { return f.name === 'Initial'; });
+ if (init) {
+ pdfviewer.formDesignerModule.updateFormField(init, {
+ tooltip: 'Add your initials',
+ thickness: 2,
+ isRequired: true,
+ isPrint: true,
+ backgroundColor: 'white',
+ borderColor: 'black'
+ });
+ }
+});
\ No newline at end of file
diff --git a/Form Designer/Validate form fields/index.html b/Form Designer/Validate form fields/index.html
new file mode 100644
index 0000000..3a9e9ca
--- /dev/null
+++ b/Form Designer/Validate form fields/index.html
@@ -0,0 +1,34 @@
+
+ EJ2 PDF Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Form Designer/Validate form fields/index.js b/Form Designer/Validate form fields/index.js
new file mode 100644
index 0000000..4ffe7bc
--- /dev/null
+++ b/Form Designer/Validate form fields/index.js
@@ -0,0 +1,51 @@
+// Inject required modules
+ej.pdfviewer.PdfViewer.Inject(
+ ej.pdfviewer.Toolbar,
+ ej.pdfviewer.Magnification,
+ ej.pdfviewer.Navigation,
+ ej.pdfviewer.Annotation,
+ ej.pdfviewer.LinkAnnotation,
+ ej.pdfviewer.ThumbnailView,
+ ej.pdfviewer.BookmarkView,
+ ej.pdfviewer.TextSelection,
+ ej.pdfviewer.FormDesigner,
+ ej.pdfviewer.FormFields,
+ ej.pdfviewer.Print
+);
+
+window.addEventListener('DOMContentLoaded', function () {
+ var pdfviewer = new ej.pdfviewer.PdfViewer({
+ documentPath: 'https://cdn.syncfusion.com/content/pdf/form-designer.pdf',
+ resourceUrl: 'https://cdn.syncfusion.com/ej2/31.1.23/dist/ej2-pdfviewer-lib'
+ // If your setup requires a backend service, uncomment and set the service URL:
+ // serviceUrl: 'https://services.syncfusion.com/js/production/api/pdfviewer'
+ });
+
+ // Enable built-in validation BEFORE user actions
+ pdfviewer.enableFormFieldsValidation = true;
+
+ // Mount viewer
+ pdfviewer.appendTo('#pdfViewer');
+
+ // Add a required textbox so validation has something to catch
+ pdfviewer.documentLoad = function () {
+ try {
+ pdfviewer.formDesignerModule.addFormField('Textbox', {
+ name: 'Email',
+ bounds: { X: 146, Y: 260, Width: 220, Height: 24 },
+ isRequired: true,
+ tooltip: 'Email is required'
+ });
+ } catch (e) {
+ // Ignore if designer not available
+ }
+ };
+
+ // Fires on Print/Download; alert if required fields are empty
+ pdfviewer.validateFormFields = function (args) {
+ // args.formField contains the collection of improperly filled fields
+ if (args && args.formField && args.formField.length) {
+ alert('Please fill all required fields. Missing: ' + args.formField[0].name);
+ }
+ };
+});
\ No newline at end of file