From c31704eb0ec4e434cb450343a2976d1f788a5f03 Mon Sep 17 00:00:00 2001 From: abdullahalam123 Date: Fri, 14 Nov 2025 13:24:50 +0530 Subject: [PATCH] feat(form-filler): enable XFA support and use original file bytes Use original file bytes instead of saved PDF doc to preserve XFA streams. This ensures PDF.js can fully render XFA-based forms by also enabling the XFA flag in the viewer. --- public/pdfjs-viewer/form-viewer.html | 5 ++++- src/js/logic/form-filler.ts | 9 ++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) 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 }, '*'