summaryrefslogtreecommitdiff
path: root/lib/pdftron/serverSDK/createBasicContractPdf.ts
blob: a2e0b35056a39535d228cd25969e8f0e2a919cd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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;
};