|
|
@@ -0,0 +1,121 @@ |
|
|
|
// src/App.js (Your 'pdfForm' page equivalent) |
|
|
|
import React, { useEffect, useRef, useState } from 'react'; |
|
|
|
import './App.css'; // For basic styling |
|
|
|
import axios from 'axios'; |
|
|
|
|
|
|
|
// Import your chosen commercial PDF SDK (e.g., PSPDFKit) |
|
|
|
import PSPDFKit from 'pspdfkit'; |
|
|
|
|
|
|
|
function App() { |
|
|
|
const viewerRef = useRef(null); // Ref for the DOM element where PDF will render |
|
|
|
const instanceRef = useRef(null); // Ref for the PSPDFKit instance |
|
|
|
const [pdfLoaded, setPdfLoaded] = useState(false); |
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
const loadPdfViewer = async () => { |
|
|
|
if (viewerRef.current) { |
|
|
|
try { |
|
|
|
// 1. Fetch the blank PDF template from your Spring Boot backend |
|
|
|
const response = await axios.get('http://localhost:8080/api/pdf/template', { |
|
|
|
responseType: 'arraybuffer' // Essential for binary data |
|
|
|
}); |
|
|
|
const pdfBlob = new Blob([response.data], { type: 'application/pdf' }); |
|
|
|
const pdfUrl = URL.createObjectURL(pdfBlob); |
|
|
|
|
|
|
|
// 2. Initialize the PDF SDK (e.g., PSPDFKit) |
|
|
|
const instance = await PSPDFKit.load({ |
|
|
|
container: viewerRef.current, |
|
|
|
document: pdfUrl, |
|
|
|
// Remember to add your SDK license key if applicable |
|
|
|
// licenseKey: "YOUR_PSPDFKIT_LICENSE_KEY", |
|
|
|
baseUrl: process.env.PUBLIC_URL + '/pspdfkit-lib/', // Path to SDK assets |
|
|
|
// Enable form filling UI |
|
|
|
formDesignerViewMode: PSPDFKit.FormDesignerViewMode.Enabled |
|
|
|
}); |
|
|
|
|
|
|
|
instanceRef.current = instance; |
|
|
|
setPdfLoaded(true); |
|
|
|
|
|
|
|
// 3. Clean up on component unmount |
|
|
|
return () => { |
|
|
|
if (instance) { |
|
|
|
instance.unload(); // Unload SDK instance |
|
|
|
} |
|
|
|
URL.revokeObjectURL(pdfUrl); // Revoke the Blob URL |
|
|
|
}; |
|
|
|
|
|
|
|
} catch (error) { |
|
|
|
console.error('Error loading PDF:', error); |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
loadPdfViewer(); |
|
|
|
}, []); // Empty dependency array means this runs once on mount |
|
|
|
|
|
|
|
const handleSavePdf = async () => { |
|
|
|
if (instanceRef.current) { |
|
|
|
try { |
|
|
|
// Export the filled PDF from the SDK as an ArrayBuffer |
|
|
|
const arrayBuffer = await instanceRef.current.exportPDF(); |
|
|
|
const filledPdfBlob = new Blob([arrayBuffer], { type: 'application/pdf' }); |
|
|
|
|
|
|
|
// Create FormData to send the file to Spring Boot |
|
|
|
const formData = new FormData(); |
|
|
|
formData.append('file', filledPdfBlob, 'filled_form.pdf'); |
|
|
|
|
|
|
|
// Send the filled PDF to your Spring Boot backend's save endpoint |
|
|
|
const response = await axios.post('http://localhost:8080/api/pdf/saveFilled', formData, { |
|
|
|
headers: { |
|
|
|
'Content-Type': 'multipart/form-data' // Important for file uploads |
|
|
|
} |
|
|
|
}); |
|
|
|
console.log('PDF saved on server:', response.data); |
|
|
|
alert('PDF saved successfully on server!'); |
|
|
|
} catch (error) { |
|
|
|
console.error('Error saving PDF:', error); |
|
|
|
alert('Failed to save PDF.'); |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
const handlePrintPdf = () => { |
|
|
|
if (instanceRef.current) { |
|
|
|
// Trigger the SDK's built-in print functionality |
|
|
|
instanceRef.current.print(); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
return ( |
|
|
|
<div className="pdf-form-page"> {/* This is your 'pdfForm' page */} |
|
|
|
<header className="page-header"> |
|
|
|
<h1>Fill and Manage Your PDF Form</h1> |
|
|
|
{pdfLoaded ? ( |
|
|
|
<div className="action-buttons"> |
|
|
|
<button onClick={handleSavePdf} className="action-button save-button"> |
|
|
|
Save Filled PDF |
|
|
|
</button> |
|
|
|
<button onClick={handlePrintPdf} className="action-button print-button"> |
|
|
|
Print PDF |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
) : ( |
|
|
|
<p>Loading PDF viewer...</p> |
|
|
|
)} |
|
|
|
</header> |
|
|
|
<div |
|
|
|
ref={viewerRef} |
|
|
|
className="pdf-viewer-container" |
|
|
|
style={{ |
|
|
|
width: '100%', |
|
|
|
height: 'calc(100vh - 180px)', // Adjust height based on header/footer |
|
|
|
border: '1px solid #ccc' |
|
|
|
}} |
|
|
|
> |
|
|
|
{/* The PDF SDK will render the PDF viewer here */} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
export default App; |