V20260210 #185

Merged
hjjeong merged 11 commits from V20260210 into main 2026-03-26 06:32:04 +00:00
3 changed files with 69 additions and 12 deletions
Showing only changes of commit 9c30adb0f7 - Show all commits

View File

@@ -1662,14 +1662,14 @@ function fn_generatePdf() {
pdf.addImage(imgData, 'JPEG', 0, position, imgWidth, imgHeight, undefined, 'FAST');
heightLeft -= pageHeight;
// 페이지가 넘어가면 추가 페이지 생성
while (heightLeft >= 0) {
// 페이지가 넘어가면 추가 페이지 생성 (1mm 이상 넘칠 때만)
while (heightLeft > 1) {
position = heightLeft - imgHeight;
pdf.addPage();
pdf.addImage(imgData, 'JPEG', 0, position, imgWidth, imgHeight, undefined, 'FAST');
heightLeft -= pageHeight;
}
// 파일명 생성
var estimateNo = $("#estimate_no").val() || "견적서";
var fileName = estimateNo + '.pdf';
@@ -1782,13 +1782,13 @@ function fn_generateAndUploadPdf(callback) {
pdf.addImage(imgData, 'JPEG', 0, position, imgWidth, imgHeight, undefined, 'FAST');
heightLeft -= pageHeight;
while (heightLeft >= 0) {
while (heightLeft > 1) {
position = heightLeft - imgHeight;
pdf.addPage();
pdf.addImage(imgData, 'JPEG', 0, position, imgWidth, imgHeight, undefined, 'FAST');
heightLeft -= pageHeight;
}
console.log('PDF 생성 완료');
// PDF를 Base64로 변환

View File

@@ -1158,7 +1158,7 @@ function fn_generateAndUploadPdf(callback) {
pdf.addImage(imgData, 'JPEG', 0, position, imgWidth, imgHeight, undefined, 'FAST');
heightLeft -= pageHeight;
while (heightLeft >= 0) {
while (heightLeft > 1) {
position = heightLeft - imgHeight;
pdf.addPage();
pdf.addImage(imgData, 'JPEG', 0, position, imgWidth, imgHeight, undefined, 'FAST');

View File

@@ -25,6 +25,8 @@ import org.apache.ibatis.session.SqlSession;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.apache.pdfbox.multipdf.PDFMergerUtility;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -3406,6 +3408,42 @@ private String encodeImageToBase64(String imagePath) {
* @param estimateTemplate
* @return
*/
/**
* 견적서 PDF + 추가견적(estimate02) PDF 파일들을 하나로 병합
*/
private File mergePdfWithAddEstimate(File estimatePdf, List<Map> addEstFiles) throws Exception {
String tempDir = System.getProperty("java.io.tmpdir");
String mergedFileName = estimatePdf.getName().replace(".pdf", "_merged.pdf");
File mergedFile = new File(tempDir + File.separator + mergedFileName);
PDFMergerUtility merger = new PDFMergerUtility();
merger.setDestinationFileName(mergedFile.getAbsolutePath());
// 1. 견적서 PDF 추가
merger.addSource(estimatePdf);
// 2. 추가견적 PDF 파일들 추가
for(Map fileInfo : addEstFiles) {
String filePath = CommonUtils.checkNull(fileInfo.get("FILE_PATH"));
if("".equals(filePath)) filePath = CommonUtils.checkNull(fileInfo.get("file_path"));
String savedName = CommonUtils.checkNull(fileInfo.get("SAVED_FILE_NAME"));
if("".equals(savedName)) savedName = CommonUtils.checkNull(fileInfo.get("saved_file_name"));
if("".equals(savedName)) savedName = CommonUtils.checkNull(fileInfo.get("FILE_SAVED_NAME"));
if("".equals(filePath)) filePath = Constants.FILE_STORAGE;
File addFile = new File(filePath + File.separator + savedName);
if(addFile.exists() && addFile.getName().toLowerCase().endsWith(".pdf")) {
merger.addSource(addFile);
System.out.println("추가견적 PDF 병합 추가: " + addFile.getName());
}
}
merger.mergeDocuments(null);
mergedFile.deleteOnExit();
return mergedFile;
}
private File getPdfFromSession(String sessionId, Map estimateTemplate) {
try {
String tempDir = System.getProperty("java.io.tmpdir");
@@ -3539,18 +3577,37 @@ private String encodeImageToBase64(String imagePath) {
}
}
// 5. PDF 파일 처리
// 5. PDF 파일 처리 (견적서 + 추가견적 PDF 병합)
ArrayList<HashMap> attachFileList = new ArrayList<HashMap>();
if(!"".equals(pdfSessionId)) {
File pdfFile = getPdfFromSession(pdfSessionId, estimateTemplate);
if(pdfFile != null && pdfFile.exists()) {
// 추가견적(estimate02) PDF 파일 조회
Map<String, Object> fileParam = new HashMap<String, Object>();
fileParam.put("targetObjId", objId);
fileParam.put("docType", "estimate02");
List<Map> addEstFiles = sqlSession.selectList("common.getFileList", fileParam);
File finalPdf = pdfFile;
// 추가견적 PDF가 있으면 병합
if(addEstFiles != null && !addEstFiles.isEmpty()) {
try {
finalPdf = mergePdfWithAddEstimate(pdfFile, addEstFiles);
System.out.println("PDF 병합 완료: 견적서 + 추가견적 " + addEstFiles.size() + "");
} catch(Exception mergeEx) {
System.out.println("PDF 병합 실패, 견적서만 첨부: " + mergeEx.getMessage());
finalPdf = pdfFile;
}
}
HashMap<String, String> fileMap = new HashMap<String, String>();
fileMap.put(Constants.Db.COL_FILE_REAL_NAME, pdfFile.getName());
fileMap.put(Constants.Db.COL_FILE_SAVED_NAME, pdfFile.getName());
fileMap.put(Constants.Db.COL_FILE_PATH, pdfFile.getParent());
fileMap.put(Constants.Db.COL_FILE_REAL_NAME, finalPdf.getName());
fileMap.put(Constants.Db.COL_FILE_SAVED_NAME, finalPdf.getName());
fileMap.put(Constants.Db.COL_FILE_PATH, finalPdf.getParent());
attachFileList.add(fileMap);
System.out.println("PDF 파일 첨부 완료: " + pdfFile.getAbsolutePath());
System.out.println("PDF 파일 첨부 완료: " + finalPdf.getAbsolutePath());
} else {
System.out.println("PDF 파일을 찾을 수 없습니다: " + pdfSessionId);
}