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