使用iText7和C#如何获取PdfDocument对象的完整路径或文件名
问题核心原因
所有主流PDF处理库(包括iText7、PdfSharp、iTextSharp等)的内存PdfDocument实例本身不会默认携带文件路径属性:只有当实例是从本地磁盘文件直接加载而来时,部分库才会提供对应属性读取源文件路径,你通过拆分生成的内存对象本身就没有和磁盘文件绑定,自然不存在内置的路径/文件名属性。
可行解决方法
你可以根据自己的业务场景选择以下任意一种方案:
方案1:拆分阶段绑定元数据(最优推荐)
不要仅存储List<PdfDocument>类型的拆分结果,自定义封装类同时存储文档对象和你需要的关联属性,拆分阶段就完成赋值,后续遍历直接读取即可。
示例代码:
// 自定义封装类,可按需扩展字段 public class SplitPdfItem { public PdfDocument Document { get; set; } public int OriginalPageNum { get; set; } public string RawPdfSourcePath { get; set; } // 可提前预设文件名规则,也可后续根据文档内容更新 public string ExpectedFileName { get; set; } } // 遍历拆分后的对象直接读取属性 foreach (var item in splitPdfItems) { var currentDoc = item.Document; var currentFileName = item.ExpectedFileName; // 执行你的文件复制/存储逻辑 }
方案2:临时写入磁盘获取路径
如果已经完成拆分无法修改拆分逻辑,可以先将内存中的PdfDocument写入临时目录拿到路径,完成业务处理后再按需清理临时文件:
// 生成唯一临时文件路径 var tempFilePath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid():N}.pdf"); // 保存文档到临时路径,保存方法根据你用的PDF库调整写法 using (var fs = new FileStream(tempFilePath, FileMode.Create)) { doc.Save(fs); } // 此处可使用tempFilePath执行你的业务逻辑 // 处理完成后可调用 File.Delete(tempFilePath) 清理临时文件
方案3:直接读取文档内容生成目标路径
如果你的核心需求是根据文档内容确定存储路径,完全不需要中间关联磁盘路径,直接读取PdfDocument的文本、元数据等内容生成目标文件名,直接保存到最终路径即可:
// 示例为iText7读取页面文本的逻辑,不同库调整对应API即可 var textExtractor = new PdfTextExtractor(); var pageContent = textExtractor.GetTextFromPage(doc.GetPage(1)); // 按需截取内容生成文件名 var targetFileName = pageContent.Split('\n').First().Trim() + ".pdf"; var targetFullPath = Path.Combine("你的目标存储目录", targetFileName); // 直接保存到目标路径 using (var fs = new FileStream(targetFullPath, FileMode.Create)) { doc.Save(fs); }
内容的提问来源于stack exchange,提问作者dpberry178
相关产品推荐
相关产品推荐

