summaryrefslogtreecommitdiff
path: root/pages/api/pdftron
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-06-02 02:27:28 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-06-02 02:27:28 +0000
commit37611339fea096e47aaa42311a13a6313b4200db (patch)
treedd9c7dba27a3db2aebd18bf2087c6a30987aa957 /pages/api/pdftron
parentbac0228d21b7195065e9cddcc327ae33659c7bcc (diff)
(대표님) 20250602 오전 작업사항 (코드프리징)
Diffstat (limited to 'pages/api/pdftron')
-rw-r--r--pages/api/pdftron/createVendorDataReports.ts73
1 files changed, 70 insertions, 3 deletions
diff --git a/pages/api/pdftron/createVendorDataReports.ts b/pages/api/pdftron/createVendorDataReports.ts
index f461a7fb..f0c42926 100644
--- a/pages/api/pdftron/createVendorDataReports.ts
+++ b/pages/api/pdftron/createVendorDataReports.ts
@@ -10,6 +10,64 @@ export const config = {
},
};
+// 서버 사이드용 DRM 복호화 함수 (API 라우트 내부에 정의)
+async function decryptBufferWithDRM(buffer: Buffer, originalFileName: string): Promise<Buffer> {
+ try {
+ // Buffer를 Blob으로 변환하여 FormData에 추가
+ const blob = new Blob([buffer]);
+ const file = new File([blob], originalFileName);
+
+ const formData = new FormData();
+ formData.append('file', file);
+
+ // 로컬 6543 포트에 drm-proxy 서버가 실행되고 있어야 함
+ const backendUrl = "http://localhost:6543/api/drm-proxy/decrypt";
+
+ console.log(`[DRM] 서버에서 파일 복호화 시도: ${originalFileName} (크기: ${buffer.length} bytes)`);
+
+ const response = await fetch(backendUrl, {
+ method: "POST",
+ body: formData,
+ });
+
+ if (!response.ok) {
+ const errorText = await response.text().catch(() => '응답 텍스트를 가져올 수 없음');
+ throw new Error(`DRM 서버 응답 오류 [${response.status}]: ${errorText}`);
+ }
+
+ // 응답을 ArrayBuffer로 받아서 Buffer로 변환
+ const arrayBuffer = await response.arrayBuffer();
+ const decryptedBuffer = Buffer.from(arrayBuffer);
+
+ console.log(`[DRM] 서버에서 파일 복호화 성공: ${originalFileName} (결과 크기: ${decryptedBuffer.length} bytes)`);
+
+ return decryptedBuffer;
+
+ } catch (error) {
+ // 오류 발생시 로깅하며, 폴백으로 복호화되지 않은 원본 버퍼를 리턴
+ const errorMessage = error instanceof Error
+ ? `${error.name}: ${error.message}`
+ : String(error);
+
+ console.error(`[DRM] 서버 복호화 오류: ${errorMessage}`, {
+ fileName: originalFileName,
+ fileSize: buffer.length,
+ remark: `
+ [정상 동작 안내]
+ DTS 개발 서버나 로컬 환경에서는 에러가 발생하는 것이 정상적인 동작입니다.
+ 이 경우 원본 파일 버퍼가 그대로 반환됩니다.
+
+ [발생 가능한 에러 케이스]
+ 1. DRM 백엔드 서버가 없는 경우 - CONNECTION_REJECTED 발생
+ 2. DRM 중앙 서버와 통신 불가한 경우 - PARENT CERT 속성 추가 불가로 인한 백엔드측 500 에러
+ `,
+ error
+ });
+
+ return buffer; // 원본 버퍼 반환 (폴백)
+ }
+}
+
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
@@ -44,13 +102,22 @@ export default async function handler(
return res.status(400).json({ error: "Invalid Report Data" });
}
- const buffer = await fs.readFile(reportCoverPage.filepath);
+ // 원본 파일 읽기
+ const originalBuffer = await fs.readFile(reportCoverPage.filepath);
+
+ // DRM 복호화 처리
+ console.log(`[DRM] 파일 복호화 시작: ${reportCoverPage.originalFilename || 'unknown'}`);
+ const decryptedBuffer = await decryptBufferWithDRM(
+ originalBuffer,
+ reportCoverPage.originalFilename || 'document.docx'
+ );
+ // 복호화된 버퍼로 리포트 생성
const {
result,
buffer: pdfBuffer,
error,
- } = await createReport(buffer, reportTempPath, reportDatas);
+ } = await createReport(decryptedBuffer, reportTempPath, reportDatas);
if (result && pdfBuffer) {
res.setHeader("Content-Type", "application/pdf");
@@ -75,4 +142,4 @@ export default async function handler(
} catch (err) {
return res.status(401).end();
}
-}
+} \ No newline at end of file