@panguard-ai/panguard-report 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Panguard AI Team
3
+ Copyright (c) 2025-2026 Panguard AI Team
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -20,6 +20,8 @@ export interface ReportCliOptions {
20
20
  verbose?: boolean;
21
21
  /** Run live system assessment / 執行即時系統評估 */
22
22
  assess?: boolean;
23
+ /** Path to panguard-scan JSON results file / panguard-scan JSON 結果檔案路徑 */
24
+ scanResultsFile?: string;
23
25
  }
24
26
  /**
25
27
  * Parse CLI arguments
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAEnB,YAAY,EACZ,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;AASrB,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,iBAAiB,GACjB,UAAU,GACV,SAAS,GACT,QAAQ,GACR,MAAM,CAAC;AAEX,2BAA2B;AAC3B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAgC7D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAoB9E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgBzD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAkCpC;AA6CD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuG9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAEnB,YAAY,EACZ,YAAY,EACZ,cAAc,EACf,MAAM,aAAa,CAAC;AAUrB,0CAA0C;AAC1C,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,iBAAiB,GACjB,UAAU,GACV,SAAS,GACT,QAAQ,GACR,MAAM,CAAC;AAEX,2BAA2B;AAC3B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAmC7D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAoB9E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgBzD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAU5C;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAqCpC;AA6CD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4J9D"}
package/dist/cli/index.js CHANGED
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import { DEFAULT_REPORT_CONFIG } from '../types.js';
9
9
  import { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from '../generator/report-generator.js';
10
+ import { generatePDFReport } from '../generator/pdf-generator.js';
10
11
  /**
11
12
  * Parse CLI arguments
12
13
  * 解析 CLI 參數
@@ -46,6 +47,10 @@ export function parseCliArgs(args) {
46
47
  else if (arg === '--assess') {
47
48
  options.assess = true;
48
49
  }
50
+ else if (arg === '--scan-results' && args[i + 1]) {
51
+ options.scanResultsFile = args[i + 1];
52
+ i++;
53
+ }
49
54
  }
50
55
  return options;
51
56
  }
@@ -128,10 +133,12 @@ Options / 選項:
128
133
  --framework <name> Compliance framework / 合規框架
129
134
  (tw_cyber_security_act, iso27001, soc2)
130
135
  --language <lang> Report language / 報告語言 (zh-TW, en)
131
- --format <fmt> Output format / 輸出格式 (json, pdf)
136
+ --format <fmt> Output format / 輸出格式 (json, html, pdf)
132
137
  --output-dir <path> Output directory / 輸出目錄
133
138
  --org <name> Organization name / 組織名稱
134
139
  --input <file> Findings input file (JSON) / 發現輸入檔案 (JSON)
140
+ --scan-results <file> Panguard scan JSON results file / panguard scan JSON 結果檔案
141
+ (auto-converts scan findings to compliance findings)
135
142
  --assess Run live system assessment / 執行即時系統評估
136
143
  --verbose, -v Verbose output / 詳細輸出
137
144
 
@@ -139,6 +146,7 @@ Examples / 範例:
139
146
  panguard-report generate --framework tw_cyber_security_act --assess
140
147
  panguard-report generate --framework iso27001 --org "ACME Corp" --assess
141
148
  panguard-report generate --framework iso27001 --org "ACME Corp" --input findings.json
149
+ panguard-report generate --framework soc2 --scan-results scan-output.json
142
150
  panguard-report list-frameworks
143
151
  panguard-report summary --input findings.json --framework soc2
144
152
  `.trim();
@@ -209,10 +217,28 @@ export async function executeCli(args) {
209
217
  console.log('Generating compliance report... / 產生合規報告中...');
210
218
  console.log(`Framework / 框架: ${framework}`);
211
219
  console.log(`Language / 語言: ${language}`);
220
+ // Convert scan results to compliance findings if --scan-results provided
221
+ let scanFindings = [];
222
+ if (options.scanResultsFile) {
223
+ const { readFile } = await import('node:fs/promises');
224
+ const raw = await readFile(options.scanResultsFile, 'utf-8');
225
+ const scanOutput = JSON.parse(raw);
226
+ scanFindings = scanOutput.findings.map((f) => ({
227
+ findingId: `SCAN-${String(f.id).padStart(3, '0')}`,
228
+ severity: f.severity,
229
+ title: f.title,
230
+ description: f.description,
231
+ category: f.category,
232
+ timestamp: new Date(),
233
+ source: 'panguard-scan',
234
+ }));
235
+ console.log(`Scan results loaded / 已載入掃描結果: ${scanFindings.length} findings from ${options.scanResultsFile}`);
236
+ }
212
237
  let report;
213
238
  if (options.assess) {
214
239
  console.log('Running live system assessment... / 執行即時系統評估...');
215
- const additionalFindings = options.inputFile ? await loadFindings(options.inputFile) : [];
240
+ const inputFindings = options.inputFile ? await loadFindings(options.inputFile) : [];
241
+ const additionalFindings = [...inputFindings, ...scanFindings];
216
242
  report = await generateComplianceReportWithAssessment(framework, language, {
217
243
  organizationName: options.organizationName,
218
244
  includeRecommendations: true,
@@ -221,14 +247,36 @@ export async function executeCli(args) {
221
247
  console.log(`Assessment findings / 評估發現: ${report.findings.length}`);
222
248
  }
223
249
  else {
224
- const findings = await loadFindings(options.inputFile);
250
+ const inputFindings = await loadFindings(options.inputFile);
251
+ const findings = [...inputFindings, ...scanFindings];
225
252
  console.log(`Findings loaded / 已載入發現: ${findings.length}`);
226
253
  report = generateComplianceReport(findings, framework, language, {
227
254
  organizationName: options.organizationName,
228
255
  includeRecommendations: true,
229
256
  });
230
257
  }
231
- if (format === 'json') {
258
+ if (format === 'pdf') {
259
+ const { mkdir } = await import('node:fs/promises');
260
+ const outputDir = options.outputDir ?? DEFAULT_REPORT_CONFIG.outputDir;
261
+ await mkdir(outputDir, { recursive: true });
262
+ const pdfPath = `${outputDir}/${report.metadata.reportId}.pdf`;
263
+ const isZh = language === 'zh-TW';
264
+ const pdfTitle = isZh
265
+ ? `Panguard AI - ${framework} 合規報告`
266
+ : `Panguard AI - ${framework} Compliance Report`;
267
+ await generatePDFReport({
268
+ title: pdfTitle,
269
+ framework,
270
+ lang: language,
271
+ outputPath: pdfPath,
272
+ findings: report.findings,
273
+ assessmentResult: report,
274
+ organizationName: options.organizationName,
275
+ generatedAt: report.metadata.generatedAt.toISOString().split('T')[0],
276
+ });
277
+ console.log(`PDF report saved to / PDF 報告已儲存至: ${pdfPath}`);
278
+ }
279
+ else if (format === 'json') {
232
280
  const json = reportToJSON(report);
233
281
  if (options.outputDir) {
234
282
  const { writeFile, mkdir } = await import('node:fs/promises');
@@ -243,7 +291,7 @@ export async function executeCli(args) {
243
291
  }
244
292
  }
245
293
  else {
246
- // For non-JSON formats, output the summary text
294
+ // For other formats, output the summary text
247
295
  const summary = generateSummaryText(report);
248
296
  console.log('');
249
297
  console.log(summary);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,6 @@
5
5
  * @module @panguard-ai/panguard-report/generator
6
6
  */
7
7
  export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './report-generator.js';
8
+ export { generatePDFReport } from './pdf-generator.js';
9
+ export type { PDFReportOptions } from './pdf-generator.js';
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -5,4 +5,5 @@
5
5
  * @module @panguard-ai/panguard-report/generator
6
6
  */
7
7
  export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './report-generator.js';
8
+ export { generatePDFReport } from './pdf-generator.js';
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Compliance Report PDF Generator
3
+ * 合規報告 PDF 產生器
4
+ *
5
+ * Generates professional PDF compliance reports with CJK font support,
6
+ * cover page, executive summary, findings table, compliance matrix,
7
+ * and page footers with confidential watermark.
8
+ *
9
+ * 產生具有 CJK 字型支援的專業 PDF 合規報告,包含封面頁、執行摘要、
10
+ * 發現列表、合規矩陣,以及帶有機密浮水印的頁尾。
11
+ *
12
+ * @module @panguard-ai/panguard-report/generator/pdf-generator
13
+ */
14
+ import type { ComplianceFinding, ComplianceReportData } from '../types.js';
15
+ /** Options for PDF report generation / PDF 報告產生選項 */
16
+ export interface PDFReportOptions {
17
+ /** Report title / 報告標題 */
18
+ title: string;
19
+ /** Compliance framework identifier / 合規框架識別碼 */
20
+ framework: string;
21
+ /** Output language / 輸出語言 */
22
+ lang: 'zh-TW' | 'en';
23
+ /** Output file path / 輸出檔案路徑 */
24
+ outputPath: string;
25
+ /** Compliance findings / 合規發現 */
26
+ findings: ComplianceFinding[];
27
+ /** Pre-computed assessment result (optional) / 預先計算的評估結果(選用) */
28
+ assessmentResult?: ComplianceReportData;
29
+ /** Report generation timestamp / 報告產生時間戳 */
30
+ generatedAt?: string;
31
+ /** Organization name / 組織名稱 */
32
+ organizationName?: string;
33
+ /** Disable PDF stream compression (useful for testing) / 停用 PDF 壓縮(測試用) */
34
+ compress?: boolean;
35
+ }
36
+ /**
37
+ * Attempt to detect and register a CJK font for Chinese text rendering
38
+ * 嘗試偵測並註冊 CJK 字型以進行中文文字渲染
39
+ */
40
+ export declare function registerCjkFont(doc: PDFKit.PDFDocument): Promise<boolean>;
41
+ /**
42
+ * Generate a complete PDF compliance report
43
+ * 產生完整的 PDF 合規報告
44
+ *
45
+ * Creates a multi-page PDF document with the following sections:
46
+ * 1. Cover page with report title, framework name, date
47
+ * 2. Executive summary with overall score, pass/fail counts
48
+ * 3. Findings table with severity badges, descriptions
49
+ * 4. Compliance matrix showing framework requirements vs results
50
+ * 5. Page footers with page numbers and "Confidential" watermark
51
+ *
52
+ * 建立多頁 PDF 文件,包含以下區段:
53
+ * 1. 封面頁(含報告標題、框架名稱、日期)
54
+ * 2. 執行摘要(含整體分數、通過/未通過計數)
55
+ * 3. 發現列表(含嚴重度標記、描述)
56
+ * 4. 合規矩陣(顯示框架要求與評估結果對照)
57
+ * 5. 頁尾(含頁碼和「機密」浮水印)
58
+ *
59
+ * @param options - PDF report generation options / PDF 報告產生選項
60
+ * @returns Path to the generated PDF file / 產生的 PDF 檔案路徑
61
+ */
62
+ export declare function generatePDFReport(options: PDFReportOptions): Promise<string>;
63
+ //# sourceMappingURL=pdf-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-generator.d.ts","sourceRoot":"","sources":["../../src/generator/pdf-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EAGrB,MAAM,aAAa,CAAC;AA4DrB,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAyCD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAuC/E;AAslBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiGlF"}
@@ -0,0 +1,788 @@
1
+ /**
2
+ * Compliance Report PDF Generator
3
+ * 合規報告 PDF 產生器
4
+ *
5
+ * Generates professional PDF compliance reports with CJK font support,
6
+ * cover page, executive summary, findings table, compliance matrix,
7
+ * and page footers with confidential watermark.
8
+ *
9
+ * 產生具有 CJK 字型支援的專業 PDF 合規報告,包含封面頁、執行摘要、
10
+ * 發現列表、合規矩陣,以及帶有機密浮水印的頁尾。
11
+ *
12
+ * @module @panguard-ai/panguard-report/generator/pdf-generator
13
+ */
14
+ import PDFDocument from 'pdfkit';
15
+ import { createWriteStream } from 'node:fs';
16
+ import { access, constants, mkdir } from 'node:fs/promises';
17
+ import { dirname } from 'node:path';
18
+ import { createLogger } from '@panguard-ai/core';
19
+ import { getFrameworkName, getFrameworkControls } from '../frameworks/index.js';
20
+ import { evaluateControls, generateExecutiveSummary, generateStatistics, generateRecommendations, } from '../mapper/index.js';
21
+ import { getSectionLabels, getSeverityLabel, getStatusLabel } from '../templates/index.js';
22
+ const logger = createLogger('panguard-report:pdf');
23
+ // ---------------------------------------------------------------------------
24
+ // Layout & Style Constants
25
+ // 版面配置與樣式常數
26
+ // ---------------------------------------------------------------------------
27
+ /** Color palette for severity badges and layout / 嚴重度標記與版面配置的色彩配置 */
28
+ const COLORS = {
29
+ primary: '#1a365d',
30
+ secondary: '#2d3748',
31
+ accent: '#3182ce',
32
+ critical: '#c53030',
33
+ high: '#c05621',
34
+ medium: '#b7791f',
35
+ low: '#2b6cb0',
36
+ info: '#718096',
37
+ pass: '#276749',
38
+ fail: '#c53030',
39
+ partial: '#b7791f',
40
+ background: '#f7fafc',
41
+ white: '#ffffff',
42
+ text: '#2d3748',
43
+ lightText: '#718096',
44
+ border: '#e2e8f0',
45
+ watermark: '#e2e8f0',
46
+ };
47
+ /** Font families / 字型家族 */
48
+ const FONTS = {
49
+ heading: 'Helvetica-Bold',
50
+ body: 'Helvetica',
51
+ mono: 'Courier',
52
+ };
53
+ /** A4 page layout dimensions in points / A4 頁面版面尺寸(點) */
54
+ const LAYOUT = {
55
+ pageWidth: 595.28,
56
+ pageHeight: 841.89,
57
+ margin: 50,
58
+ contentWidth: 495.28,
59
+ headerHeight: 30,
60
+ footerHeight: 20,
61
+ };
62
+ // ---------------------------------------------------------------------------
63
+ // CJK Font Detection
64
+ // CJK 字型偵測
65
+ // ---------------------------------------------------------------------------
66
+ /**
67
+ * CJK font search paths per platform
68
+ * 各平台的 CJK 字型搜尋路徑
69
+ */
70
+ const CJK_FONT_PATHS = {
71
+ darwin: [
72
+ { path: '/System/Library/Fonts/STHeiti Light.ttc', family: 'STHeitiTC-Light' },
73
+ { path: '/System/Library/Fonts/PingFang.ttc', family: 'PingFangTC-Regular' },
74
+ ],
75
+ linux: [
76
+ {
77
+ path: '/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc',
78
+ family: 'Noto Sans CJK TC',
79
+ },
80
+ {
81
+ path: '/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc',
82
+ family: 'Noto Sans CJK TC',
83
+ },
84
+ ],
85
+ };
86
+ /**
87
+ * Check if a file exists at the given path
88
+ * 檢查指定路徑是否存在檔案
89
+ */
90
+ async function fileExists(filePath) {
91
+ try {
92
+ await access(filePath, constants.R_OK);
93
+ return true;
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ }
99
+ /**
100
+ * Attempt to detect and register a CJK font for Chinese text rendering
101
+ * 嘗試偵測並註冊 CJK 字型以進行中文文字渲染
102
+ */
103
+ export async function registerCjkFont(doc) {
104
+ const platform = process.platform;
105
+ const candidates = CJK_FONT_PATHS[platform];
106
+ if (!candidates || candidates.length === 0) {
107
+ logger.warn('No CJK font candidates for this platform', { platform });
108
+ return false;
109
+ }
110
+ for (const candidate of candidates) {
111
+ const exists = await fileExists(candidate.path);
112
+ if (exists) {
113
+ try {
114
+ if (candidate.family) {
115
+ doc.registerFont('CJK', candidate.path, candidate.family);
116
+ }
117
+ else {
118
+ doc.registerFont('CJK', candidate.path);
119
+ }
120
+ // Verify the font can actually be used by switching to it
121
+ // Some TTC files may register but fail on use
122
+ doc.font('CJK');
123
+ // Reset to default font
124
+ doc.font(FONTS.body);
125
+ logger.info('CJK font registered and verified successfully', { path: candidate.path });
126
+ return true;
127
+ }
128
+ catch (err) {
129
+ const message = err instanceof Error ? err.message : String(err);
130
+ logger.warn('Failed to register or verify CJK font', {
131
+ path: candidate.path,
132
+ error: message,
133
+ });
134
+ }
135
+ }
136
+ }
137
+ logger.warn('No CJK font found on this system. Chinese characters may not render correctly.', {
138
+ platform,
139
+ });
140
+ return false;
141
+ }
142
+ // ---------------------------------------------------------------------------
143
+ // Helper: Severity Color
144
+ // 輔助: 嚴重度顏色
145
+ // ---------------------------------------------------------------------------
146
+ /**
147
+ * Return the color associated with a given severity level
148
+ * 根據給定的嚴重等級回傳對應的顏色
149
+ */
150
+ function severityColor(severity) {
151
+ switch (severity) {
152
+ case 'critical':
153
+ return COLORS.critical;
154
+ case 'high':
155
+ return COLORS.high;
156
+ case 'medium':
157
+ return COLORS.medium;
158
+ case 'low':
159
+ return COLORS.low;
160
+ case 'info':
161
+ return COLORS.info;
162
+ default:
163
+ return COLORS.lightText;
164
+ }
165
+ }
166
+ /**
167
+ * Return the color associated with a control status
168
+ * 根據控制項狀態回傳對應的顏色
169
+ */
170
+ function statusColor(status) {
171
+ switch (status) {
172
+ case 'pass':
173
+ return COLORS.pass;
174
+ case 'fail':
175
+ return COLORS.fail;
176
+ case 'partial':
177
+ return COLORS.partial;
178
+ default:
179
+ return COLORS.lightText;
180
+ }
181
+ }
182
+ // ---------------------------------------------------------------------------
183
+ // Helper: Font selection for CJK
184
+ // 輔助: CJK 字型選擇
185
+ // ---------------------------------------------------------------------------
186
+ /**
187
+ * Select the appropriate font based on CJK availability and style
188
+ * 根據 CJK 可用性與樣式選擇適當字型
189
+ */
190
+ function selectFont(hasCjk, style) {
191
+ if (hasCjk && style !== 'mono') {
192
+ return 'CJK';
193
+ }
194
+ return FONTS[style];
195
+ }
196
+ // ---------------------------------------------------------------------------
197
+ // Helper: Check remaining page space
198
+ // 輔助: 檢查頁面剩餘空間
199
+ // ---------------------------------------------------------------------------
200
+ /**
201
+ * Check if there is enough vertical space remaining on the current page.
202
+ * If not, add a new page and return the new Y position.
203
+ * 檢查目前頁面是否有足夠的垂直空間,如果不夠則新增頁面並回傳新的 Y 位置。
204
+ */
205
+ function ensureSpace(doc, currentY, requiredHeight) {
206
+ const maxY = LAYOUT.pageHeight - LAYOUT.margin - LAYOUT.footerHeight - 10;
207
+ if (currentY + requiredHeight > maxY) {
208
+ doc.addPage();
209
+ return LAYOUT.margin;
210
+ }
211
+ return currentY;
212
+ }
213
+ // ---------------------------------------------------------------------------
214
+ // Section 1: Cover Page
215
+ // 區段 1: 封面頁
216
+ // ---------------------------------------------------------------------------
217
+ /**
218
+ * Render the cover page
219
+ * 渲染封面頁
220
+ */
221
+ function renderCoverPage(doc, options, hasCjk) {
222
+ const isZh = options.lang === 'zh-TW';
223
+ const font = selectFont(hasCjk, 'body');
224
+ const headingFont = selectFont(hasCjk, 'heading');
225
+ // Background accent bar at top
226
+ doc.rect(0, 0, LAYOUT.pageWidth, 6).fill(COLORS.primary);
227
+ // Title
228
+ const titleY = 200;
229
+ doc
230
+ .font(headingFont)
231
+ .fontSize(28)
232
+ .fillColor(COLORS.primary)
233
+ .text(options.title, LAYOUT.margin, titleY, {
234
+ width: LAYOUT.contentWidth,
235
+ align: 'center',
236
+ });
237
+ // Framework name
238
+ const frameworkName = getFrameworkName(options.framework, options.lang);
239
+ doc
240
+ .font(font)
241
+ .fontSize(16)
242
+ .fillColor(COLORS.secondary)
243
+ .text(frameworkName, LAYOUT.margin, titleY + 50, {
244
+ width: LAYOUT.contentWidth,
245
+ align: 'center',
246
+ });
247
+ // Separator line
248
+ const sepY = titleY + 90;
249
+ doc
250
+ .strokeColor(COLORS.accent)
251
+ .lineWidth(2)
252
+ .moveTo(LAYOUT.pageWidth / 2 - 80, sepY)
253
+ .lineTo(LAYOUT.pageWidth / 2 + 80, sepY)
254
+ .stroke();
255
+ // Date
256
+ const dateStr = options.generatedAt ?? new Date().toISOString().split('T')[0];
257
+ const dateLabel = isZh ? `產生日期: ${dateStr}` : `Generated: ${dateStr}`;
258
+ doc
259
+ .font(font)
260
+ .fontSize(12)
261
+ .fillColor(COLORS.lightText)
262
+ .text(dateLabel, LAYOUT.margin, sepY + 20, {
263
+ width: LAYOUT.contentWidth,
264
+ align: 'center',
265
+ });
266
+ // Organization name
267
+ if (options.organizationName) {
268
+ const orgLabel = isZh
269
+ ? `組織: ${options.organizationName}`
270
+ : `Organization: ${options.organizationName}`;
271
+ doc
272
+ .font(font)
273
+ .fontSize(12)
274
+ .fillColor(COLORS.lightText)
275
+ .text(orgLabel, LAYOUT.margin, sepY + 40, {
276
+ width: LAYOUT.contentWidth,
277
+ align: 'center',
278
+ });
279
+ }
280
+ // Brand footer
281
+ const brandY = LAYOUT.pageHeight - LAYOUT.margin - 40;
282
+ doc
283
+ .font(font)
284
+ .fontSize(10)
285
+ .fillColor(COLORS.lightText)
286
+ .text('Generated by Panguard AI', LAYOUT.margin, brandY, {
287
+ width: LAYOUT.contentWidth,
288
+ align: 'center',
289
+ });
290
+ doc
291
+ .font(font)
292
+ .fontSize(8)
293
+ .fillColor(COLORS.lightText)
294
+ .text('https://panguard.ai', LAYOUT.margin, brandY + 16, {
295
+ width: LAYOUT.contentWidth,
296
+ align: 'center',
297
+ });
298
+ }
299
+ // ---------------------------------------------------------------------------
300
+ // Section 2: Executive Summary
301
+ // 區段 2: 執行摘要
302
+ // ---------------------------------------------------------------------------
303
+ /**
304
+ * Render the executive summary section
305
+ * 渲染執行摘要區段
306
+ */
307
+ function renderExecutiveSummary(doc, reportData, lang, hasCjk) {
308
+ const isZh = lang === 'zh-TW';
309
+ const labels = getSectionLabels(lang);
310
+ const font = selectFont(hasCjk, 'body');
311
+ const headingFont = selectFont(hasCjk, 'heading');
312
+ const es = reportData.executiveSummary;
313
+ let y = LAYOUT.margin;
314
+ // Section title
315
+ doc
316
+ .font(headingFont)
317
+ .fontSize(20)
318
+ .fillColor(COLORS.primary)
319
+ .text(labels.executiveSummary, LAYOUT.margin, y);
320
+ y += 35;
321
+ // Separator
322
+ doc
323
+ .strokeColor(COLORS.border)
324
+ .lineWidth(1)
325
+ .moveTo(LAYOUT.margin, y)
326
+ .lineTo(LAYOUT.pageWidth - LAYOUT.margin, y)
327
+ .stroke();
328
+ y += 15;
329
+ // Overall score
330
+ const scoreLabel = isZh
331
+ ? `整體合規分數: ${es.overallScore}%`
332
+ : `Overall Compliance Score: ${es.overallScore}%`;
333
+ const scoreColor = es.overallScore >= 80 ? COLORS.pass : es.overallScore >= 50 ? COLORS.medium : COLORS.fail;
334
+ doc.font(headingFont).fontSize(16).fillColor(scoreColor).text(scoreLabel, LAYOUT.margin, y);
335
+ y += 30;
336
+ // Controls summary
337
+ const controlLines = isZh
338
+ ? [
339
+ `控制項總數: ${es.totalControls}`,
340
+ `通過: ${es.controlsPassed} | 未通過: ${es.controlsFailed} | 部分符合: ${es.controlsPartial} | 不適用: ${es.controlsNA}`,
341
+ ]
342
+ : [
343
+ `Total Controls: ${es.totalControls}`,
344
+ `Passed: ${es.controlsPassed} | Failed: ${es.controlsFailed} | Partial: ${es.controlsPartial} | N/A: ${es.controlsNA}`,
345
+ ];
346
+ for (const line of controlLines) {
347
+ doc.font(font).fontSize(11).fillColor(COLORS.text).text(line, LAYOUT.margin, y);
348
+ y += 18;
349
+ }
350
+ y += 5;
351
+ // Findings summary
352
+ const findingLines = isZh
353
+ ? [
354
+ `發現總數: ${es.totalFindings}`,
355
+ `嚴重: ${es.criticalFindings} | 高風險: ${es.highFindings}`,
356
+ ]
357
+ : [
358
+ `Total Findings: ${es.totalFindings}`,
359
+ `Critical: ${es.criticalFindings} | High: ${es.highFindings}`,
360
+ ];
361
+ for (const line of findingLines) {
362
+ doc.font(font).fontSize(11).fillColor(COLORS.text).text(line, LAYOUT.margin, y);
363
+ y += 18;
364
+ }
365
+ y += 10;
366
+ // Key risks
367
+ if (es.keyRisks.length > 0) {
368
+ const risksTitle = isZh ? '主要風險:' : 'Key Risks:';
369
+ doc.font(headingFont).fontSize(12).fillColor(COLORS.fail).text(risksTitle, LAYOUT.margin, y);
370
+ y += 18;
371
+ for (const risk of es.keyRisks) {
372
+ y = ensureSpace(doc, y, 16);
373
+ doc
374
+ .font(font)
375
+ .fontSize(10)
376
+ .fillColor(COLORS.text)
377
+ .text(` - ${risk}`, LAYOUT.margin + 10, y, { width: LAYOUT.contentWidth - 10 });
378
+ y += 16;
379
+ }
380
+ y += 5;
381
+ }
382
+ // Key achievements
383
+ if (es.keyAchievements.length > 0) {
384
+ const achieveTitle = isZh ? '主要成果:' : 'Key Achievements:';
385
+ doc.font(headingFont).fontSize(12).fillColor(COLORS.pass).text(achieveTitle, LAYOUT.margin, y);
386
+ y += 18;
387
+ for (const achievement of es.keyAchievements) {
388
+ y = ensureSpace(doc, y, 16);
389
+ doc
390
+ .font(font)
391
+ .fontSize(10)
392
+ .fillColor(COLORS.text)
393
+ .text(` - ${achievement}`, LAYOUT.margin + 10, y, {
394
+ width: LAYOUT.contentWidth - 10,
395
+ });
396
+ y += 16;
397
+ }
398
+ }
399
+ }
400
+ // ---------------------------------------------------------------------------
401
+ // Section 3: Findings Table
402
+ // 區段 3: 發現列表
403
+ // ---------------------------------------------------------------------------
404
+ /**
405
+ * Render the findings table section
406
+ * 渲染發現列表區段
407
+ */
408
+ function renderFindingsTable(doc, findings, lang, hasCjk) {
409
+ const isZh = lang === 'zh-TW';
410
+ const labels = getSectionLabels(lang);
411
+ const font = selectFont(hasCjk, 'body');
412
+ const headingFont = selectFont(hasCjk, 'heading');
413
+ let y = LAYOUT.margin;
414
+ // Section title
415
+ doc
416
+ .font(headingFont)
417
+ .fontSize(20)
418
+ .fillColor(COLORS.primary)
419
+ .text(labels.findings, LAYOUT.margin, y);
420
+ y += 35;
421
+ // Separator
422
+ doc
423
+ .strokeColor(COLORS.border)
424
+ .lineWidth(1)
425
+ .moveTo(LAYOUT.margin, y)
426
+ .lineTo(LAYOUT.pageWidth - LAYOUT.margin, y)
427
+ .stroke();
428
+ y += 15;
429
+ if (findings.length === 0) {
430
+ const noFindings = isZh ? '未發現任何問題。' : 'No findings detected.';
431
+ doc.font(font).fontSize(11).fillColor(COLORS.lightText).text(noFindings, LAYOUT.margin, y);
432
+ return;
433
+ }
434
+ // Sort findings by severity: critical > high > medium > low > info
435
+ const severityOrder = {
436
+ critical: 0,
437
+ high: 1,
438
+ medium: 2,
439
+ low: 3,
440
+ info: 4,
441
+ };
442
+ const sortedFindings = [...findings].sort((a, b) => (severityOrder[a.severity] ?? 5) - (severityOrder[b.severity] ?? 5));
443
+ for (const finding of sortedFindings) {
444
+ // Each finding needs approximately 80pt of vertical space
445
+ y = ensureSpace(doc, y, 80);
446
+ // Severity badge
447
+ const badgeColor = severityColor(finding.severity);
448
+ const badgeWidth = 60;
449
+ const badgeHeight = 16;
450
+ doc.roundedRect(LAYOUT.margin, y, badgeWidth, badgeHeight, 3).fill(badgeColor);
451
+ doc
452
+ .font(FONTS.body)
453
+ .fontSize(8)
454
+ .fillColor(COLORS.white)
455
+ .text(getSeverityLabel(finding.severity, lang).toUpperCase(), LAYOUT.margin + 2, y + 3, {
456
+ width: badgeWidth - 4,
457
+ align: 'center',
458
+ });
459
+ // Finding ID
460
+ doc
461
+ .font(FONTS.mono)
462
+ .fontSize(8)
463
+ .fillColor(COLORS.lightText)
464
+ .text(finding.findingId, LAYOUT.margin + badgeWidth + 10, y + 3);
465
+ y += badgeHeight + 5;
466
+ // Title
467
+ doc
468
+ .font(headingFont)
469
+ .fontSize(11)
470
+ .fillColor(COLORS.text)
471
+ .text(finding.title, LAYOUT.margin + 10, y, { width: LAYOUT.contentWidth - 10 });
472
+ y += 18;
473
+ // Description
474
+ doc
475
+ .font(font)
476
+ .fontSize(9)
477
+ .fillColor(COLORS.secondary)
478
+ .text(finding.description, LAYOUT.margin + 10, y, {
479
+ width: LAYOUT.contentWidth - 20,
480
+ });
481
+ y += doc.heightOfString(finding.description, {
482
+ width: LAYOUT.contentWidth - 20,
483
+ });
484
+ y += 12;
485
+ // Light separator between findings
486
+ doc
487
+ .strokeColor(COLORS.border)
488
+ .lineWidth(0.5)
489
+ .moveTo(LAYOUT.margin + 10, y)
490
+ .lineTo(LAYOUT.pageWidth - LAYOUT.margin - 10, y)
491
+ .stroke();
492
+ y += 10;
493
+ }
494
+ }
495
+ // ---------------------------------------------------------------------------
496
+ // Section 4: Compliance Matrix
497
+ // 區段 4: 合規矩陣
498
+ // ---------------------------------------------------------------------------
499
+ /**
500
+ * Render the compliance matrix section
501
+ * 渲染合規矩陣區段
502
+ */
503
+ function renderComplianceMatrix(doc, controls, lang, hasCjk) {
504
+ const isZh = lang === 'zh-TW';
505
+ const labels = getSectionLabels(lang);
506
+ const font = selectFont(hasCjk, 'body');
507
+ const headingFont = selectFont(hasCjk, 'heading');
508
+ let y = LAYOUT.margin;
509
+ // Section title
510
+ doc
511
+ .font(headingFont)
512
+ .fontSize(20)
513
+ .fillColor(COLORS.primary)
514
+ .text(labels.complianceOverview, LAYOUT.margin, y);
515
+ y += 35;
516
+ // Separator
517
+ doc
518
+ .strokeColor(COLORS.border)
519
+ .lineWidth(1)
520
+ .moveTo(LAYOUT.margin, y)
521
+ .lineTo(LAYOUT.pageWidth - LAYOUT.margin, y)
522
+ .stroke();
523
+ y += 15;
524
+ // Table header
525
+ const colWidths = {
526
+ id: 70,
527
+ title: 220,
528
+ status: 70,
529
+ findings: 135,
530
+ };
531
+ const headerLabels = isZh
532
+ ? { id: '控制項 ID', title: '標題', status: '狀態', findings: '相關發現' }
533
+ : { id: 'Control ID', title: 'Title', status: 'Status', findings: 'Findings' };
534
+ // Header background
535
+ doc.rect(LAYOUT.margin, y, LAYOUT.contentWidth, 20).fill(COLORS.primary);
536
+ let headerX = LAYOUT.margin + 5;
537
+ doc.font(FONTS.body).fontSize(8).fillColor(COLORS.white);
538
+ doc.text(headerLabels.id, headerX, y + 5, { width: colWidths.id });
539
+ headerX += colWidths.id;
540
+ doc.text(headerLabels.title, headerX, y + 5, { width: colWidths.title });
541
+ headerX += colWidths.title;
542
+ doc.text(headerLabels.status, headerX, y + 5, { width: colWidths.status, align: 'center' });
543
+ headerX += colWidths.status;
544
+ doc.text(headerLabels.findings, headerX, y + 5, { width: colWidths.findings });
545
+ y += 22;
546
+ // Table rows
547
+ let rowIndex = 0;
548
+ for (const control of controls) {
549
+ y = ensureSpace(doc, y, 22);
550
+ // Alternating row background
551
+ if (rowIndex % 2 === 0) {
552
+ doc.rect(LAYOUT.margin, y, LAYOUT.contentWidth, 20).fill(COLORS.background);
553
+ }
554
+ let cellX = LAYOUT.margin + 5;
555
+ // Control ID
556
+ doc
557
+ .font(FONTS.mono)
558
+ .fontSize(7)
559
+ .fillColor(COLORS.text)
560
+ .text(control.controlId, cellX, y + 5, { width: colWidths.id });
561
+ cellX += colWidths.id;
562
+ // Title (use localized title)
563
+ const title = isZh ? control.titleZh : control.titleEn;
564
+ const truncatedTitle = title.length > 40 ? `${title.substring(0, 37)}...` : title;
565
+ doc
566
+ .font(font)
567
+ .fontSize(7)
568
+ .fillColor(COLORS.text)
569
+ .text(truncatedTitle, cellX, y + 5, { width: colWidths.title });
570
+ cellX += colWidths.title;
571
+ // Status badge
572
+ const sColor = statusColor(control.status);
573
+ const statusLabel = getStatusLabel(control.status, lang);
574
+ doc.roundedRect(cellX + 10, y + 3, 50, 14, 2).fill(sColor);
575
+ doc
576
+ .font(FONTS.body)
577
+ .fontSize(7)
578
+ .fillColor(COLORS.white)
579
+ .text(statusLabel, cellX + 10, y + 5, { width: 50, align: 'center' });
580
+ cellX += colWidths.status;
581
+ // Related findings count
582
+ const findingCount = control.relatedFindings.length;
583
+ const findingText = findingCount === 0
584
+ ? '-'
585
+ : `${findingCount} ${isZh ? '個' : findingCount === 1 ? 'finding' : 'findings'}`;
586
+ doc
587
+ .font(font)
588
+ .fontSize(7)
589
+ .fillColor(findingCount > 0 ? COLORS.fail : COLORS.lightText)
590
+ .text(findingText, cellX, y + 5, { width: colWidths.findings });
591
+ y += 20;
592
+ rowIndex += 1;
593
+ }
594
+ }
595
+ // ---------------------------------------------------------------------------
596
+ // Page Footer
597
+ // 頁尾
598
+ // ---------------------------------------------------------------------------
599
+ /**
600
+ * Add a page footer with page number, brand name, and confidential watermark
601
+ * 新增包含頁碼、品牌名稱和機密浮水印的頁尾
602
+ */
603
+ function addPageFooter(doc, pageNumber) {
604
+ const footerY = LAYOUT.pageHeight - LAYOUT.margin;
605
+ // Separator line
606
+ doc
607
+ .strokeColor(COLORS.border)
608
+ .lineWidth(0.5)
609
+ .moveTo(LAYOUT.margin, footerY - 10)
610
+ .lineTo(LAYOUT.pageWidth - LAYOUT.margin, footerY - 10)
611
+ .stroke();
612
+ // Brand name on left
613
+ doc
614
+ .font(FONTS.body)
615
+ .fontSize(7)
616
+ .fillColor(COLORS.lightText)
617
+ .text('Panguard AI', LAYOUT.margin, footerY - 4, {
618
+ width: LAYOUT.contentWidth / 3,
619
+ align: 'left',
620
+ });
621
+ // Confidential in center
622
+ doc
623
+ .font(FONTS.body)
624
+ .fontSize(7)
625
+ .fillColor(COLORS.watermark)
626
+ .text('Confidential', LAYOUT.margin + LAYOUT.contentWidth / 3, footerY - 4, {
627
+ width: LAYOUT.contentWidth / 3,
628
+ align: 'center',
629
+ });
630
+ // Page number on right
631
+ doc
632
+ .font(FONTS.body)
633
+ .fontSize(7)
634
+ .fillColor(COLORS.lightText)
635
+ .text(String(pageNumber), LAYOUT.margin + (LAYOUT.contentWidth * 2) / 3, footerY - 4, {
636
+ width: LAYOUT.contentWidth / 3,
637
+ align: 'right',
638
+ });
639
+ }
640
+ // ---------------------------------------------------------------------------
641
+ // Main Generator Function
642
+ // 主要產生器函式
643
+ // ---------------------------------------------------------------------------
644
+ /**
645
+ * Generate a complete PDF compliance report
646
+ * 產生完整的 PDF 合規報告
647
+ *
648
+ * Creates a multi-page PDF document with the following sections:
649
+ * 1. Cover page with report title, framework name, date
650
+ * 2. Executive summary with overall score, pass/fail counts
651
+ * 3. Findings table with severity badges, descriptions
652
+ * 4. Compliance matrix showing framework requirements vs results
653
+ * 5. Page footers with page numbers and "Confidential" watermark
654
+ *
655
+ * 建立多頁 PDF 文件,包含以下區段:
656
+ * 1. 封面頁(含報告標題、框架名稱、日期)
657
+ * 2. 執行摘要(含整體分數、通過/未通過計數)
658
+ * 3. 發現列表(含嚴重度標記、描述)
659
+ * 4. 合規矩陣(顯示框架要求與評估結果對照)
660
+ * 5. 頁尾(含頁碼和「機密」浮水印)
661
+ *
662
+ * @param options - PDF report generation options / PDF 報告產生選項
663
+ * @returns Path to the generated PDF file / 產生的 PDF 檔案路徑
664
+ */
665
+ export async function generatePDFReport(options) {
666
+ logger.info('Starting PDF compliance report generation', {
667
+ outputPath: options.outputPath,
668
+ lang: options.lang,
669
+ framework: options.framework,
670
+ });
671
+ // Ensure output directory exists
672
+ const outputDir = dirname(options.outputPath);
673
+ await mkdir(outputDir, { recursive: true });
674
+ // Build or use provided assessment result
675
+ const reportData = options.assessmentResult ?? buildReportData(options);
676
+ // Create PDF document
677
+ const doc = new PDFDocument({
678
+ size: 'A4',
679
+ margins: {
680
+ top: LAYOUT.margin,
681
+ bottom: LAYOUT.margin,
682
+ left: LAYOUT.margin,
683
+ right: LAYOUT.margin,
684
+ },
685
+ info: {
686
+ Title: options.title,
687
+ Author: 'Panguard AI',
688
+ Creator: 'PanguardReport PDF Generator',
689
+ Producer: 'PDFKit',
690
+ },
691
+ autoFirstPage: true,
692
+ bufferPages: true,
693
+ compress: options.compress ?? true,
694
+ });
695
+ // Register CJK font for zh-TW
696
+ let hasCjkFont = false;
697
+ if (options.lang === 'zh-TW') {
698
+ hasCjkFont = await registerCjkFont(doc);
699
+ if (hasCjkFont) {
700
+ logger.info('CJK font available; Chinese text should render correctly');
701
+ }
702
+ else {
703
+ logger.warn('CJK font not available; falling back to Helvetica. ' +
704
+ 'Chinese characters will not render correctly but the report will not crash.');
705
+ }
706
+ }
707
+ // Pipe to output file
708
+ const writeStream = createWriteStream(options.outputPath);
709
+ doc.pipe(writeStream);
710
+ // -- Section 1: Cover page --
711
+ logger.info('Rendering cover page');
712
+ renderCoverPage(doc, options, hasCjkFont);
713
+ // -- Section 2: Executive summary --
714
+ logger.info('Rendering executive summary');
715
+ doc.addPage();
716
+ renderExecutiveSummary(doc, reportData, options.lang, hasCjkFont);
717
+ // -- Section 3: Findings table --
718
+ logger.info('Rendering findings table');
719
+ doc.addPage();
720
+ renderFindingsTable(doc, reportData.findings, options.lang, hasCjkFont);
721
+ // -- Section 4: Compliance matrix --
722
+ logger.info('Rendering compliance matrix');
723
+ doc.addPage();
724
+ renderComplianceMatrix(doc, reportData.controls, options.lang, hasCjkFont);
725
+ // -- Add page footers to all pages --
726
+ const pageRange = doc.bufferedPageRange();
727
+ for (let i = pageRange.start; i < pageRange.start + pageRange.count; i++) {
728
+ doc.switchToPage(i);
729
+ addPageFooter(doc, i + 1);
730
+ }
731
+ // Finalize the document
732
+ doc.end();
733
+ // Return a promise that resolves when the write stream finishes
734
+ return new Promise((resolve, reject) => {
735
+ writeStream.on('finish', () => {
736
+ logger.info('PDF compliance report generated successfully', {
737
+ outputPath: options.outputPath,
738
+ });
739
+ resolve(options.outputPath);
740
+ });
741
+ writeStream.on('error', (err) => {
742
+ logger.error('Failed to write PDF compliance report', {
743
+ outputPath: options.outputPath,
744
+ error: err.message,
745
+ });
746
+ reject(new Error(`Failed to write PDF report to ${options.outputPath}: ${err.message}`));
747
+ });
748
+ });
749
+ }
750
+ // ---------------------------------------------------------------------------
751
+ // Internal: Build report data from options
752
+ // 內部: 從選項建構報告資料
753
+ // ---------------------------------------------------------------------------
754
+ /**
755
+ * Build a ComplianceReportData from the provided options when no
756
+ * pre-computed assessmentResult is given.
757
+ * 當未提供預先計算的 assessmentResult 時,從選項建構 ComplianceReportData。
758
+ */
759
+ function buildReportData(options) {
760
+ const framework = options.framework;
761
+ const controls = getFrameworkControls(framework);
762
+ const evaluatedControls = evaluateControls(controls, options.findings);
763
+ const executiveSummary = generateExecutiveSummary(evaluatedControls, options.findings, options.lang);
764
+ const statistics = generateStatistics(evaluatedControls, options.findings);
765
+ const recommendations = generateRecommendations(evaluatedControls, options.lang);
766
+ const now = new Date();
767
+ return {
768
+ metadata: {
769
+ reportId: `RPT-PDF-${now.getTime()}`,
770
+ type: 'compliance',
771
+ framework,
772
+ language: options.lang,
773
+ period: {
774
+ start: new Date(now.getFullYear(), now.getMonth(), 1),
775
+ end: now,
776
+ },
777
+ generatedAt: now,
778
+ organizationName: options.organizationName,
779
+ version: '1.0.0',
780
+ },
781
+ executiveSummary,
782
+ controls: evaluatedControls,
783
+ findings: options.findings,
784
+ statistics,
785
+ recommendations,
786
+ };
787
+ }
788
+ //# sourceMappingURL=pdf-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-generator.js","sourceRoot":"","sources":["../../src/generator/pdf-generator.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,13 +9,14 @@
9
9
  *
10
10
  * @module @panguard-ai/panguard-report
11
11
  */
12
- export declare const PANGUARD_REPORT_VERSION = "0.1.0";
12
+ export declare const PANGUARD_REPORT_VERSION: string;
13
13
  export declare const CLAWREPORT_NAME = "PanguardReport";
14
14
  export type { ComplianceFramework, ControlStatus, ComplianceControl, EvaluatedControl, ComplianceFinding, ReportType, ReportFormat, ReportLanguage, ReportMetadata, ComplianceReportData, ExecutiveSummary, ComplianceStatistics, ReportRecommendation, ReportConfig, } from './types.js';
15
15
  export { DEFAULT_REPORT_CONFIG } from './types.js';
16
16
  export { getFrameworkControls, getFrameworkName, getSupportedFrameworks, TW_CYBER_SECURITY_CONTROLS, ISO27001_CONTROLS, SOC2_CONTROLS, } from './frameworks/index.js';
17
17
  export { evaluateControls, generateExecutiveSummary, generateStatistics, generateRecommendations, } from './mapper/index.js';
18
- export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './generator/index.js';
18
+ export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, generatePDFReport, } from './generator/index.js';
19
+ export type { PDFReportOptions } from './generator/index.js';
19
20
  export { assessAccessControl, assessFirewallAndNetwork, assessEncryption, assessMonitoring, assessPatching, assessIncidentResponse, runAssessment, runFullAssessment, } from './assessors/index.js';
20
21
  export { getSectionLabels, getStatusLabel, getSeverityLabel, getPriorityLabel, getFrameworkDescription, } from './templates/index.js';
21
22
  export type { ReportSectionLabels, FrameworkDescription } from './templates/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAC/C,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAGhD,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,eAAO,MAAM,uBAAuB,EAAE,MAAqB,CAAC;AAC5D,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAGhD,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -9,7 +9,10 @@
9
9
  *
10
10
  * @module @panguard-ai/panguard-report
11
11
  */
12
- export const PANGUARD_REPORT_VERSION = '0.1.0';
12
+ import { createRequire } from 'node:module';
13
+ const _require = createRequire(import.meta.url);
14
+ const _pkg = _require('../package.json');
15
+ export const PANGUARD_REPORT_VERSION = _pkg.version;
13
16
  export const CLAWREPORT_NAME = 'PanguardReport';
14
17
  export { DEFAULT_REPORT_CONFIG } from './types.js';
15
18
  // Frameworks
@@ -17,7 +20,7 @@ export { getFrameworkControls, getFrameworkName, getSupportedFrameworks, TW_CYBE
17
20
  // Mapper
18
21
  export { evaluateControls, generateExecutiveSummary, generateStatistics, generateRecommendations, } from './mapper/index.js';
19
22
  // Generator
20
- export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, } from './generator/index.js';
23
+ export { generateComplianceReport, generateComplianceReportWithAssessment, reportToJSON, generateSummaryText, generatePDFReport, } from './generator/index.js';
21
24
  // Assessors
22
25
  export { assessAccessControl, assessFirewallAndNetwork, assessEncryption, assessMonitoring, assessPatching, assessIncidentResponse, runAssessment, runFullAssessment, } from './assessors/index.js';
23
26
  // Templates
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAC;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAmBhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,aAAa;AACb,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,YAAY;AACZ,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,YAAY;AACZ,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,YAAY;AACZ,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAG9B,MAAM;AACN,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,iBAAiB,CAAwB,CAAC;AAEhE,MAAM,CAAC,MAAM,uBAAuB,GAAW,IAAI,CAAC,OAAO,CAAC;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAmBhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,aAAa;AACb,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,YAAY;AACZ,OAAO,EACL,wBAAwB,EACxB,sCAAsC,EACtC,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,YAAY;AACZ,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,YAAY;AACZ,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAG9B,MAAM;AACN,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,26 +1,43 @@
1
1
  {
2
2
  "name": "@panguard-ai/panguard-report",
3
- "version": "0.2.0",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/panguard-ai/panguard-ai"
8
+ },
9
+ "homepage": "https://panguard.ai",
4
10
  "type": "module",
5
11
  "description": "AI-powered security incident report generator / AI 自動產生資安事件報告",
6
12
  "main": "./dist/index.js",
7
13
  "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "import": "./dist/index.js",
17
+ "types": "./dist/index.d.ts"
18
+ }
19
+ },
8
20
  "bin": {
9
21
  "panguard-report": "./dist/cli/index.js"
10
22
  },
11
23
  "publishConfig": {
12
24
  "access": "public"
13
25
  },
26
+ "engines": {
27
+ "node": ">=20.0.0"
28
+ },
14
29
  "files": [
15
30
  "dist",
16
31
  "package.json",
17
32
  "README.md"
18
33
  ],
19
34
  "dependencies": {
20
- "@panguard-ai/core": "0.2.0"
35
+ "pdfkit": "^0.15.0",
36
+ "@panguard-ai/core": "1.0.0"
21
37
  },
22
38
  "devDependencies": {
23
39
  "@types/node": "^22.14.0",
40
+ "@types/pdfkit": "^0.13.9",
24
41
  "typescript": "~5.7.3"
25
42
  },
26
43
  "scripts": {