summaryrefslogtreecommitdiff
path: root/lib/pdftron/serverSDK/createBasicContractPdf.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-08-07 05:04:39 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-08-07 05:04:39 +0000
commite270e477f362dd68249bb4a013c66eab293bba82 (patch)
treeef29ec732fc62c220ca2f6ab12aa282b0db7c9ab /lib/pdftron/serverSDK/createBasicContractPdf.ts
parenta5cecbef039e29beaa616e3a36e7f15b8b35623c (diff)
(최겸) PQ요청+기본계약 로직 수정(한글화 미적용)
Diffstat (limited to 'lib/pdftron/serverSDK/createBasicContractPdf.ts')
-rw-r--r--lib/pdftron/serverSDK/createBasicContractPdf.ts137
1 files changed, 137 insertions, 0 deletions
diff --git a/lib/pdftron/serverSDK/createBasicContractPdf.ts b/lib/pdftron/serverSDK/createBasicContractPdf.ts
new file mode 100644
index 00000000..a2e0b350
--- /dev/null
+++ b/lib/pdftron/serverSDK/createBasicContractPdf.ts
@@ -0,0 +1,137 @@
+const { PDFNet } = require("@pdftron/pdfnet-node");
+
+type CreateBasicContractPdf = (
+ templateBuffer: Buffer,
+ templateData: {
+ [key: string]: any;
+ }
+) => Promise<{
+ result: boolean;
+ buffer?: ArrayBuffer;
+ error?: any;
+}>;
+
+export const createBasicContractPdf: CreateBasicContractPdf = async (
+ templateBuffer,
+ templateData
+) => {
+ const main = async () => {
+ await PDFNet.initialize(process.env.NEXT_PUBLIC_PDFTRON_SERVER_KEY);
+
+ console.log("🔄 PDFTron 기본계약서 PDF 변환 시작");
+ console.log("📝 템플릿 데이터:", JSON.stringify(templateData, null, 2));
+
+ // 템플릿 데이터가 있는 경우 변수 치환 후 PDF 변환
+ if (Object.keys(templateData).length > 0) {
+ console.log("🔄 템플릿 변수 치환 시작");
+
+ try {
+ // createReport.ts 방식처럼 템플릿 변수 치환 (UTF-8 인코딩 지원)
+ const options = new PDFNet.Convert.OfficeToPDFOptions();
+
+ // UTF-8 인코딩 명시 설정 시도
+ try {
+ options.setCharset("UTF-8");
+ console.log("✅ UTF-8 인코딩 설정 완료");
+ } catch (charsetError) {
+ console.warn("⚠️ UTF-8 인코딩 설정 실패, 기본 설정 사용:", charsetError);
+ }
+
+ // 템플릿 데이터를 UTF-8로 명시적으로 인코딩
+ const templateDataJson = JSON.stringify(templateData, null, 2);
+ const utf8TemplateData = Buffer.from(templateDataJson, 'utf8').toString('utf8');
+ console.log("📝 UTF-8 인코딩된 템플릿 데이터:", utf8TemplateData);
+
+ const tempPath = `/tmp/temp_template_${Date.now()}.docx`;
+
+ // 파일도 UTF-8로 저장 (바이너리 데이터는 그대로 유지)
+ require('fs').writeFileSync(tempPath, templateBuffer, { encoding: null }); // 바이너리로 저장
+
+ // Office 템플릿 생성 및 변수 치환
+ const templateDoc = await PDFNet.Convert.createOfficeTemplateWithPath(
+ tempPath,
+ options
+ );
+
+ const filledDoc = await templateDoc.fillTemplateJson(utf8TemplateData);
+
+ // 임시 파일 삭제
+ require('fs').unlinkSync(tempPath);
+
+ console.log("✅ 템플릿 변수 치환 및 PDF 변환 완료");
+
+ const buffer = await filledDoc.saveMemoryBuffer(
+ PDFNet.SDFDoc.SaveOptions.e_linearized
+ );
+
+ return {
+ result: true,
+ buffer,
+ };
+
+ } catch (templateError) {
+ console.warn("⚠️ 템플릿 변수 치환 실패, 기본 변환 수행:", templateError);
+
+ // 템플릿 처리 실패 시 기본 PDF 변환만 수행 (UTF-8 인코딩 적용)
+ const fallbackOptions = new PDFNet.Convert.OfficeToPDFOptions();
+ try {
+ fallbackOptions.setCharset("UTF-8");
+ } catch (charsetError) {
+ console.warn("⚠️ 폴백 UTF-8 인코딩 설정 실패:", charsetError);
+ }
+
+ const buf = await PDFNet.Convert.office2PDFBuffer(templateBuffer, fallbackOptions);
+ const templateDoc = await PDFNet.PDFDoc.createFromBuffer(buf);
+
+ const buffer = await templateDoc.saveMemoryBuffer(
+ PDFNet.SDFDoc.SaveOptions.e_linearized
+ );
+
+ return {
+ result: true,
+ buffer,
+ };
+ }
+ } else {
+ // 템플릿 데이터가 없는 경우 단순 변환 (UTF-8 인코딩 적용)
+ console.log("📄 단순 PDF 변환 수행 (UTF-8 인코딩)");
+
+ const simpleOptions = new PDFNet.Convert.OfficeToPDFOptions();
+ try {
+ simpleOptions.setCharset("UTF-8");
+ console.log("✅ 단순 변환 UTF-8 인코딩 설정 완료");
+ } catch (charsetError) {
+ console.warn("⚠️ 단순 변환 UTF-8 인코딩 설정 실패:", charsetError);
+ }
+
+ const buf = await PDFNet.Convert.office2PDFBuffer(templateBuffer, simpleOptions);
+ const templateDoc = await PDFNet.PDFDoc.createFromBuffer(buf);
+
+ const buffer = await templateDoc.saveMemoryBuffer(
+ PDFNet.SDFDoc.SaveOptions.e_linearized
+ );
+
+ return {
+ result: true,
+ buffer,
+ };
+ }
+ };
+
+ const result = await PDFNet.runWithCleanup(
+ main,
+ process.env.NEXT_PUBLIC_PDFTRON_SERVER_KEY
+ )
+ .catch((err: any) => {
+ console.error("❌ PDFTron 기본계약서 PDF 변환 오류:", err);
+ return {
+ result: false,
+ error: err,
+ };
+ })
+ .then(async (data: any) => {
+ return data;
+ });
+
+ return result;
+};