From 2607c5591d780ad927a396907bd571f310dc4195 Mon Sep 17 00:00:00 2001 From: "vluk@2fi-solutions.com.hk" Date: Fri, 12 Dec 2025 19:41:22 +0800 Subject: [PATCH] no message --- .../lioner/pdf/service/PdfMergeService.java | 17 ++++++++ .../lioner/pdf/service/PdfService.java | 21 +++++++++- .../modules/lioner/pdf/web/PdfController.java | 40 ++++++++++++++++++- 3 files changed, 75 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ffii/lioner/modules/lioner/pdf/service/PdfMergeService.java b/src/main/java/com/ffii/lioner/modules/lioner/pdf/service/PdfMergeService.java index 75d4011..a04be68 100644 --- a/src/main/java/com/ffii/lioner/modules/lioner/pdf/service/PdfMergeService.java +++ b/src/main/java/com/ffii/lioner/modules/lioner/pdf/service/PdfMergeService.java @@ -91,6 +91,23 @@ public class PdfMergeService { } } + public byte[] flatPdfsItext7(byte[] pdfABytes) throws IOException { + + // --- STEP 1: Flatten PDF A and get the modified bytes --- + byte[] pdfAFlattenedBytes; + try (PdfReader readerA = new PdfReader(new ByteArrayInputStream(pdfABytes)); + ByteArrayOutputStream tempBaosA = new ByteArrayOutputStream(); + PdfWriter tempWriterA = new PdfWriter(tempBaosA); + PdfDocument docA_mod = new PdfDocument(readerA, tempWriterA)) { + + flattenPdf(docA_mod); + docA_mod.close(); // IMPORTANT: Close to finalize writing to tempBaosA + pdfAFlattenedBytes = tempBaosA.toByteArray(); + return tempBaosA.toByteArray(); + } + + } + public byte[] mergePdfsItext7(String formCode, byte[] pdfABytes, byte[] pdfBBytes) throws IOException { // Defined constants for clarity diff --git a/src/main/java/com/ffii/lioner/modules/lioner/pdf/service/PdfService.java b/src/main/java/com/ffii/lioner/modules/lioner/pdf/service/PdfService.java index 659414b..29bf2fb 100644 --- a/src/main/java/com/ffii/lioner/modules/lioner/pdf/service/PdfService.java +++ b/src/main/java/com/ffii/lioner/modules/lioner/pdf/service/PdfService.java @@ -487,14 +487,17 @@ public class PdfService extends AbstractBaseEntityService commonField.setTaxPin1(fieldValue); case "fill_2_6" -> commonField.setTaxReason1(fieldValue); case "fill_3_6" -> commonField.setTaxReasonB1(fieldValue); + case "fill_3_6a" -> commonField.getOthers().put("TaxReasonB1a", fieldValue); case "fill_8_country_2" -> commonField.setTaxResidency2(fieldValue); case "fill_4_5" -> commonField.setTaxPin2(fieldValue); case "fill_5_6" -> commonField.setTaxReason2(fieldValue); case "fill_6_6" -> commonField.setTaxReasonB2(fieldValue); + case "fill_6_6a" -> commonField.getOthers().put("TaxReasonB2a", fieldValue); case "fill_8_country_3" -> commonField.setTaxResidency3(fieldValue); case "fill_7_6" -> commonField.setTaxPin3(fieldValue); case "fill_8_6" -> commonField.setTaxReason3(fieldValue); case "fill_9_6" -> commonField.setTaxReasonB3(fieldValue); + case "fill_9_6a" -> commonField.getOthers().put("TaxReasonB3a", fieldValue); case "ch_high_yes" -> commonField.getOthers().put("workHighYes", fieldValue); case "ch_high_no" -> commonField.getOthers().put("workHighNo", fieldValue); @@ -3389,6 +3404,7 @@ public class PdfService extends AbstractBaseEntityService commonField.setTaxResidency1(fieldValue); case "Residency2" -> commonField.setTaxResidency2(fieldValue); case "Residency3" -> commonField.setTaxResidency3(fieldValue); @@ -3401,6 +3417,7 @@ public class PdfService extends AbstractBaseEntityService commonField.setTaxReasonB1(fieldValue); case "Reason2" -> commonField.setTaxReasonB2(fieldValue); case "Reason3" -> commonField.setTaxReasonB3(fieldValue); + */ /* Page7 End */ /* Page8 Start */ @@ -3662,7 +3679,7 @@ public class PdfService extends AbstractBaseEntityService commonField.getOthers().put("corAddressNt", fieldValue); case "1_13_tel_mobile" -> commonField.setContactNo(fieldValue); - */ + case "1_14d_tax1" -> commonField.setTaxResidency1(fieldValue); case "1_14d_tax_num1" -> commonField.setTaxPin1(fieldValue); //case "ch1_14d_reason1_a" -> commonField.setTaxReason1("A"); @@ -3684,6 +3701,8 @@ public class PdfService extends AbstractBaseEntityService commonField.setTaxReason3("C"); case "1_14d_explain3" -> commonField.setTaxReasonB3(fieldValue); + */ + case "ch2_5_1p" -> commonField.setEduPri(fieldValue); case "ch2_5_1s" -> commonField.setEduSec(fieldValue); case "ch2_5_1m" -> commonField.setEduPostSec(fieldValue); diff --git a/src/main/java/com/ffii/lioner/modules/lioner/pdf/web/PdfController.java b/src/main/java/com/ffii/lioner/modules/lioner/pdf/web/PdfController.java index 0c34e27..f9c3041 100644 --- a/src/main/java/com/ffii/lioner/modules/lioner/pdf/web/PdfController.java +++ b/src/main/java/com/ffii/lioner/modules/lioner/pdf/web/PdfController.java @@ -29,12 +29,10 @@ import org.springframework.web.multipart.MultipartFile; import com.ffii.core.response.RecordsRes; import com.ffii.core.utils.CriteriaArgsBuilder; import com.ffii.core.utils.Params; -import com.ffii.lioner.modules.common.SecurityUtils; import com.ffii.lioner.modules.lioner.entity.FileBlob; import com.ffii.lioner.modules.lioner.pdf.service.PdfMergeService; import com.ffii.lioner.modules.lioner.pdf.service.PdfService; import com.ffii.lioner.modules.lioner.service.FileService; -import com.ffii.lioner.modules.lioner.userActionLog.entity.UserActionLog; import com.ffii.lioner.modules.lioner.userActionLog.service.UserActionLogService; import com.itextpdf.io.source.ByteArrayOutputStream; @@ -153,6 +151,44 @@ public class PdfController { } } + @GetMapping(value = "/download-flat/{id}", produces = MediaType.APPLICATION_PDF_VALUE) + public ResponseEntity getFlatPdfByFilledFormId(@PathVariable Long id) throws IOException { + logger.info("XXXXXXXXXXXXXXX getFlatPdfByFilledFormId START XXXXXXXXXXXXXX"); + // --- 1. Fetch Data & Set up Variables --- + Map d = pdfService.getFilledFormPdf(id); + String formCode = (String) d.get("formCode"); + String filename = formCode + "-" + id + ".pdf"; + + Long fileId = Optional.ofNullable(d.get("fileId")) + .map(val -> ((Integer) val).longValue()) + .orElse(null); + + // Safely retrieve byte arrays using Optional chaining (prevents NullPointerExceptions) + byte[] pdfBytes = Optional.ofNullable(fileId) + .flatMap(fileService::findFileBlobByFileId) + .map(FileBlob::getBytes) + .orElse(null); + + // --- 2. PDF Merging and Processing --- + byte[] finalPdfBytes = new byte[0]; + + logger.info("pdfBytes:" + pdfBytes.length); + + finalPdfBytes = pdfMergeService.flatPdfsItext7(pdfBytes); + + // --- 4. Build ResponseEntity --- + HttpHeaders headers = new HttpHeaders(); + // Use attachment for download, or inline for display in browser + headers.setContentDispositionFormData("attachment", filename); + headers.setContentType(MediaType.APPLICATION_PDF); + headers.setContentLength(finalPdfBytes.length); + + //action log + userActionLogService.createLog("Download flatted Form of Client Code:" + d.get("clientCode") + " Form:" + d.get("templateName") , id, "FlatPDF"); + + return new ResponseEntity<>(finalPdfBytes, headers, HttpStatus.OK); + } + @GetMapping("/remove-pdf-password") public String removePdfPassword() { try {