如何使用PDFSharp为列表中每个不同属性值生成并保存独立PDF文档
解决方法
你只需要做两处核心调整即可实现需求:
- 简化分组属性值的获取逻辑:不需要把匿名类Key转成字符串再做批量替换,直接通过Key访问对应属性就能拿到纯净的原始值,避免字符串处理带来的额外异常风险。
- 动态生成PDF保存路径:将属性值拼接到保存文件名中,保证每个分组对应唯一的文件名,避免后续文件覆盖前面生成的文件。
修正后的完整代码示例
// 原有分组逻辑保持不变 var listName = collectionName .GroupBy(p => new { p.propertyName }) .ToList(); // 编码注册属于全局初始化操作,挪到循环外仅执行一次即可,避免重复调用浪费性能 System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); // 遍历每一个分组 foreach (var trip in listName) { // 直接取属性值,无需做字符串替换操作 string pnString = trip.Key.propertyName.Trim(); // 为当前分组创建独立的PDF文档 PdfDocument doc = new PdfDocument(); PdfPage page = doc.AddPage(); XGraphics gfx = XGraphics.FromPdfPage(page); // 此处补充你的字体、画刷等初始化代码 gfx.DrawString(pnString, new XFont("Arial", 40, XFontStyle.Bold), myGreen, new XPoint(5, 250)); // 此处补充其他PDF内容绘制逻辑 // 处理属性值中的非法文件名字符,避免保存报错 var invalidFileNameChars = Path.GetInvalidFileNameChars(); string safeFileName = new string(pnString.Select(c => invalidFileNameChars.Contains(c) ? '_' : c).ToArray()); // 动态拼接保存路径,保证每个文件名称唯一 string fullSavePath = Path.Combine(@"C:\My\File\Path", $"{safeFileName}.pdf"); doc.Save(fullSavePath); // 释放文档资源,避免内存占用过高 doc.Dispose(); }
额外注意事项
- 注意修正遍历对象,你原有代码中遍历的
paidTrip需要替换为分组后得到的listName - 如果属性值可能重复,你可以在文件名中额外拼接时间戳、序号等信息进一步保证文件名唯一
内容的提问来源于stack exchange,提问作者Ole M
相关产品推荐
相关产品推荐

