mirror of
https://github.com/alam00000/bentopdf.git
synced 2026-11-09 17:14:16 +01:00
feat(stamps): implement new add stamps tool with image stamp support fix(form-filler): improve form filler UI and XFA form support refactor(sign-pdf): improve signature tool initialization and error handling style(ui): update text color for better visibility in dark mode chore: update navigation links to use root-relative paths
91 lines
2.9 KiB
TypeScript
91 lines
2.9 KiB
TypeScript
import { showLoader, hideLoader, showAlert } from '../ui.js';
|
|
import { downloadFile, readFileAsArrayBuffer } from '../utils/helpers.js';
|
|
import { state } from '../state.js';
|
|
|
|
let viewerIframe: HTMLIFrameElement | null = null;
|
|
let viewerReady = false;
|
|
|
|
|
|
export async function setupFormFiller() {
|
|
if (!state.files || !state.files[0]) return;
|
|
|
|
showLoader('Loading PDF form...');
|
|
const pdfViewerContainer = document.getElementById('pdf-viewer-container');
|
|
|
|
if (!pdfViewerContainer) {
|
|
console.error('PDF viewer container not found');
|
|
hideLoader();
|
|
return;
|
|
}
|
|
|
|
try {
|
|
pdfViewerContainer.innerHTML = '';
|
|
viewerIframe = document.createElement('iframe');
|
|
viewerIframe.src = '/pdfjs-viewer/form-viewer.html';
|
|
viewerIframe.style.width = '100%';
|
|
viewerIframe.style.height = '100%';
|
|
viewerIframe.style.border = 'none';
|
|
pdfViewerContainer.appendChild(viewerIframe);
|
|
|
|
window.addEventListener('message', async (event) => {
|
|
if (event.data.type === 'viewerReady') {
|
|
viewerReady = true;
|
|
// 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 },
|
|
'*'
|
|
);
|
|
} else if (event.data.type === 'pdfLoaded') {
|
|
hideLoader();
|
|
} else if (event.data.type === 'downloadPDF') {
|
|
const pdfData = new Uint8Array(event.data.data);
|
|
downloadFile(
|
|
new Blob([pdfData], { type: 'application/pdf' }),
|
|
'filled-form.pdf'
|
|
);
|
|
showAlert('Success', 'Form has been filled and downloaded.');
|
|
} else if (event.data.type === 'error') {
|
|
showAlert('Error', event.data.message);
|
|
}
|
|
});
|
|
|
|
const formFillerOptions = document.getElementById('form-filler-options');
|
|
if (formFillerOptions) formFillerOptions.classList.remove('hidden');
|
|
} catch (e) {
|
|
console.error('Critical error setting up form filler:', e);
|
|
showAlert(
|
|
'Error',
|
|
'Failed to load PDF form viewer.'
|
|
);
|
|
hideLoader();
|
|
}
|
|
}
|
|
|
|
export async function processAndDownloadForm() {
|
|
if (!viewerIframe || !viewerReady) {
|
|
showAlert('Viewer not ready', 'Please wait for the form to finish loading.');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const win: any = viewerIframe.contentWindow;
|
|
const doc: Document | null = win?.document ?? null;
|
|
|
|
// Prefer to trigger the same behavior as the toolbar's Download button
|
|
const downloadBtn = doc?.getElementById('download') as HTMLButtonElement | null;
|
|
if (downloadBtn) {
|
|
downloadBtn.click();
|
|
return;
|
|
}
|
|
|
|
// Fallback: use the postMessage-based getData flow
|
|
win?.postMessage({ type: 'getData' }, '*');
|
|
} catch (e) {
|
|
console.error('Failed to trigger form download:', e);
|
|
showAlert('Export failed', 'Could not export the filled form. Please try again.');
|
|
}
|
|
}
|