diff --git a/src/main/java/com/ffii/lioner/modules/lioner/pdf/web/Pdf2Controller.java b/src/main/java/com/ffii/lioner/modules/lioner/pdf/web/Pdf2Controller.java new file mode 100644 index 0000000..afb1948 --- /dev/null +++ b/src/main/java/com/ffii/lioner/modules/lioner/pdf/web/Pdf2Controller.java @@ -0,0 +1,103 @@ +package com.ffii.lioner.modules.lioner.pdf.web; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.Map; +import java.util.UUID; + +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDField; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + + +@RestController +@RequestMapping("/pdf2") +@CrossOrigin(origins = "", allowedHeaders = "") + +public class Pdf2Controller { + + private final String UPLOAD_DIR = "uploads/"; // Configure this path + + // Endpoint to download the blank AcroForm + @GetMapping("/download/template") + public ResponseEntity downloadPdfTemplate() throws IOException { + Path filePath = Paths.get("src/main/resources/template/pdf/template_form.pdf").normalize(); // Path to your blank AcroForm + Resource resource = new UrlResource(filePath.toUri()); + + if (resource.exists()) { + return ResponseEntity.ok() + .contentType(MediaType.APPLICATION_PDF) + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") + .body(resource); + } else { + return ResponseEntity.notFound().build(); + } + } + + // Endpoint to upload the edited PDF + @PostMapping("/upload") + public ResponseEntity uploadEditedPdf(@RequestParam("file") MultipartFile file) { + try { + // Ensure upload directory exists + Path uploadPath = Paths.get(UPLOAD_DIR).toAbsolutePath().normalize(); + Files.createDirectories(uploadPath); + + String fileName = UUID.randomUUID().toString() + "-" + StringUtils.cleanPath(file.getOriginalFilename()); + Path targetLocation = uploadPath.resolve(fileName); + Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING); + + // --- Process the uploaded PDF (e.g., extract form data, save to DB) --- + //PDDocument document = PDDocument.load(targetLocation.toFile()); + PDDocument document = Loader.loadPDF(targetLocation.toFile()); // Changed! + PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm(); + + if (acroForm != null) { + // Example: Iterate through fields and print values + for (PDField field : acroForm.getFields()) { + System.out.println("Field: " + field.getPartialName() + ", Value: " + field.getValueAsString()); + // You can save this data to a database, or perform other operations + } + } + + document.close(); + // ------------------------------------------------------------------- + + return ResponseEntity.ok("File uploaded and processed successfully: " + fileName); + } catch (IOException ex) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not upload or process file: " + ex.getMessage()); + } + } + + // Optional: Endpoint to upload only the form data (FDF/XFDF) + @PostMapping("/upload/data") + public ResponseEntity uploadFormData(@RequestBody Map formData) { + // This approach requires the frontend to extract form data and send it as JSON + // On the backend, you'd then use this data to populate the original PDF template + // and save a new PDF or just the data in your database. + // This is often more efficient than re-uploading the entire PDF. + + // Example: Logic to process form data + System.out.println("Received form data: " + formData); + // You would then load your template PDF, fill it with this data, and save. + return ResponseEntity.ok("Form data received and processed."); + } +}