diff --git a/public/pdfjs-viewer/form-viewer.html b/public/pdfjs-viewer/form-viewer.html
index fbe650d..3584d22 100644
--- a/public/pdfjs-viewer/form-viewer.html
+++ b/public/pdfjs-viewer/form-viewer.html
@@ -183,7 +183,10 @@
async function loadPDF(data) {
try {
- const loadingTask = pdfjsLib.getDocument({ data });
+ const loadingTask = pdfjsLib.getDocument({
+ data,
+ enableXfa: true,
+ });
pdfDocument = await loadingTask.promise;
pdfViewer.setDocument(pdfDocument);
linkService.setDocument(pdfDocument);
diff --git a/src/js/logic/form-filler.ts b/src/js/logic/form-filler.ts
index 7b8131a..c03db87 100644
--- a/src/js/logic/form-filler.ts
+++ b/src/js/logic/form-filler.ts
@@ -1,5 +1,5 @@
import { showLoader, hideLoader, showAlert } from '../ui.js';
-import { downloadFile } from '../utils/helpers.js';
+import { downloadFile, readFileAsArrayBuffer } from '../utils/helpers.js';
import { state } from '../state.js';
let viewerIframe: HTMLIFrameElement | null = null;
@@ -7,7 +7,7 @@ let viewerReady = false;
export async function setupFormFiller() {
- if (!state.pdfDoc) return;
+ if (!state.files || !state.files[0]) return;
showLoader('Loading PDF form...');
const pdfViewerContainer = document.getElementById('pdf-viewer-container');
@@ -30,7 +30,10 @@ export async function setupFormFiller() {
window.addEventListener('message', async (event) => {
if (event.data.type === 'viewerReady') {
viewerReady = true;
- const pdfBytes = await state.pdfDoc.save();
+ // Use the original uploaded bytes so that XFA streams remain intact
+ // and PDF.js can fully render XFA-based forms.
+ const file = state.files[0];
+ const pdfBytes = await readFileAsArrayBuffer(file);
viewerIframe?.contentWindow?.postMessage(
{ type: 'loadPDF', data: pdfBytes },
'*'