| @@ -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; | |||||