# XP.ReportEngine — PDF 报告生成引擎 ## 概述 XP.ReportEngine 是 XplorePlane 平面 CT 检测系统的 PDF 报告生成模块。负责将 XP.ImageProcessing 的检测分析结果(距离测量、BGA 气泡率、空隙测量、通孔填锡率)转换为结构化的 PDF 检测报告。 模块采用管线式架构(Pipeline),将报告生成过程分解为五个独立阶段: **模板加载 → 数据适配 → 数据绑定 → 排版计算 → PDF 渲染** ## 技术栈 | 依赖 | 版本 | 用途 | |------|------|------| | .NET 8.0 | net8.0-windows7.0 | 运行时 | | itext7 | 8.0.5 | PDF 文档生成核心库 | | itext7.bouncy-castle-adapter | 8.0.5 | iText 7 加密支持 | | Newtonsoft.Json | 13.0.3 | JSON 模板反序列化 | | Prism.Wpf | 9.0.537 | 模块化框架与 DI | ## 项目结构 ``` XP.ReportEngine/ ├── Interfaces/ # 核心接口定义 │ ├── IReportGenerator.cs │ ├── IReportGeneratorFactory.cs │ ├── ITemplateEngine.cs │ ├── IDataBinder.cs │ ├── ILayoutEngine.cs │ ├── IPdfRenderer.cs │ └── IReportDataAdapter.cs ├── Models/ # 数据模型 │ ├── ReportContext.cs │ ├── ImageData.cs │ ├── ReportTemplate.cs │ ├── TemplateElement.cs │ ├── LayoutPage.cs │ ├── ReportResult.cs │ ├── ReportGenerationOptions.cs │ └── ProcessorOutput.cs ├── Services/ # 服务实现 │ ├── PdfReportGenerator.cs # 管线协调器 │ ├── ReportGeneratorFactory.cs # 工厂 │ ├── JsonTemplateEngine.cs # JSON 模板加载与验证 │ ├── ExpressionDataBinder.cs # ${} 表达式数据绑定 │ ├── PageLayoutEngine.cs # 分页与排版 │ ├── ITextPdfRenderer.cs # iText 7 PDF 渲染 │ ├── ProcessorDataAdapter.cs # 处理器数据适配 │ └── ReportIdGenerator.cs # 报告编号生成 ├── Fonts/ # 字体目录(当前使用系统字体,目录保留备用) ├── Templates/ # JSON 报告模板 │ └── StandardReportTemplate.json ├── Resources/ # 多语言资源文件 │ ├── Resources.resx │ ├── Resources.zh-CN.resx │ ├── Resources.zh-TW.resx │ └── Resources.en-US.resx ├── Documents/ # 项目文档 ├── ReportEngineModule.cs # Prism 模块入口 └── XP.ReportEngine.csproj ``` ## 快速开始 ### 1. 字体说明 模块使用 Windows 系统自带字体(微软雅黑 + Arial),无需额外添加字体文件。详见 `Documents/FontFilesGuidance.md`。 ### 2. 通过 DI 容器调用 模块通过 `ReportEngineModule` 自动注册到 Prism DI 容器,其他模块可直接注入 `IReportGenerator` 使用: ```csharp public class MyService { private readonly IReportGenerator _reportGenerator; public MyService(IReportGenerator reportGenerator) { _reportGenerator = reportGenerator; } public async Task GenerateReport() { var context = new ReportContext { Metadata = new ReportMetadata { ReportId = "RPT-20250511-001", InspectionDate = DateTime.Now, SampleName = "PCB-001", OperatorName = "张三" }, Properties = new Dictionary { ["sampleName"] = "PCB-001" } }; var options = new ReportGenerationOptions { TemplatePath = "Templates/StandardReportTemplate.json", OutputFilePath = @"D:\Reports\report.pdf", Format = ReportOutputFormat.Pdf }; var result = await _reportGenerator.GenerateAsync(context, options); if (result.IsSuccess) { // PDF 已保存到 OutputFilePath } else { // result.ErrorMessage 包含错误信息 } } } ``` ### 3. 使用数据适配器 将 XP.ImageProcessing 处理器输出转换为 ReportContext: ```csharp var adapter = container.Resolve(); var processorOutputs = new List { new ProcessorOutput { ProcessorType = "BgaVoidRateProcessor", OutputData = new Dictionary { ["BgaCount"] = 120, ["VoidRate"] = 0.035, ["Classification"] = "Pass" } } }; var metadata = new ReportMetadata { ReportId = "RPT-20250511-001", InspectionDate = DateTime.Now, SampleName = "PCB-001", OperatorName = "张三" }; ReportContext context = adapter.Adapt(processorOutputs, metadata); ``` ## 核心接口 | 接口 | 实现类 | 职责 | |------|--------|------| | `IReportGenerator` | `PdfReportGenerator` | 协调管线各阶段,生成 PDF | | `IReportGeneratorFactory` | `ReportGeneratorFactory` | 根据格式创建对应生成器 | | `ITemplateEngine` | `JsonTemplateEngine` | JSON 模板加载、反序列化、验证 | | `IDataBinder` | `ExpressionDataBinder` | `${}` 表达式解析与数据绑定 | | `ILayoutEngine` | `PageLayoutEngine` | 分页、元素定位、表格跨页 | | `IPdfRenderer` | `ITextPdfRenderer` | 使用 iText 7 渲染 PDF | | `IReportDataAdapter` | `ProcessorDataAdapter` | OutputData → ReportContext 转换 | ## 数据绑定表达式 模板中支持以下绑定语法: | 语法 | 说明 | 示例 | |------|------|------| | `${propertyName}` | 简单属性绑定 | `${sampleName}` | | `${object.property}` | 嵌套属性路径 | `${metadata.reportId}` | | `${list[index]}` | 列表索引访问 | `${bgaBalls[0].voidRate}` | | `${functionName(param)}` | 格式化函数 | `${formatDate(inspectionDate)}` | | `${loc:ResourceKey}` | 本地化键解析 | `${loc:Report_Title}` | 内置格式化函数: - `formatDate(value)` — 根据当前语言格式化日期 - `formatNumber(value, decimals)` — 根据当前语言格式化数字 - `formatPercent(value)` — 格式化百分比 ## 多语言支持 支持三种语言:简体中文(zh-CN)、繁体中文(zh-TW)、英文(en-US)。 通过 `ILocalizationService` 自动解析 `${loc:Key}` 表达式为当前语言文本。模块在初始化时注册资源源到 Fallback Chain。 ## 模板定义 标准模板位于 `Templates/StandardReportTemplate.json`,包含以下页面类型: - `homepage` — 报告首页(元数据 + 摘要表格) - `metricData` — 距离测量数据页 - `bgaInspection` — BGA 焊球检测页(含数据表格) - `voidInspection` — 空隙检测页(含数据表格) - `viaFillInspection` — 通孔填锡检测页 模板 JSON 结构需包含三个必需顶层字段:`document`、`pages`、`styles`。 ## 错误处理 模块采用结果对象模式(Result Pattern),所有公共方法返回 `ReportResult` 而非抛出异常: - `ReportResult.Success(stream)` — 成功,包含 PDF MemoryStream - `ReportResult.Failure(message, ex)` — 失败,包含错误信息和可选异常 非致命性问题(缺失属性、未定义样式、图像缺失)会记录警告日志并继续执行,不会中断报告生成。 ## 构建 ```bash cd XplorePlane dotnet build XP.ReportEngine/XP.ReportEngine.csproj ```