C# PdfStamper运行抛出“未将对象引用设置到对象的实例”错误求解
问题根因排查
- 第一是空值校验逻辑和顺序完全错误:你把路径空校验放在了
PdfReader实例化之后,要是pdfTemplate本身为空,在执行new PdfReader(pdfTemplate)的时候就已经可能触发空引用;且你的校验条件用了&&逻辑与,只有两个路径同时为空才会拦截,只要其中一个不为空代码就会继续执行,完全起不到校验作用。 - 第二是
PdfStamper构造的入参没有做有效性校验:你直接把new FileStream(...)的返回值传入构造方法,要是FileStream创建失败(比如路径无写入权限、文件被占用),就会把空引用传入PdfStamper触发报错。 - 第三是你贴出的代码中
pdfTemplate、newFile看起来是类全局变量,存在被其他逻辑意外修改、或者多线程场景下被篡改的可能。
修复方案
调整后的代码参考如下:
private void FillFormChg() { // 方法内局部变量存储路径,避免全局变量被篡改 string pdfTemplate = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Slip.pdf"); string newFile = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "SlipTemp.pdf"); try { // 先做路径和文件存在性校验,再使用路径 if (string.IsNullOrWhiteSpace(pdfTemplate) || string.IsNullOrWhiteSpace(newFile)) { MessageBox.Show("路径参数为空!"); return; } if (!System.IO.File.Exists(pdfTemplate)) { MessageBox.Show("模板文件不存在!"); return; } using (PdfReader pdfReader = new PdfReader(pdfTemplate)) using (FileStream fs = new FileStream(newFile, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { PdfStamper pdfStamper = new PdfStamper(pdfReader, fs); pdfStamper.Writer.CloseStream = false; AcroFields pdfFormFields = pdfStamper.AcroFields; // 后续业务逻辑 } } catch (Exception ex) { // 打印完整异常和内部异常,定位具体空对象 MessageBox.Show($"报错信息:{ex.Message}\n内部异常:{ex.InnerException?.Message}\n堆栈:{ex.StackTrace}"); } }
如果调整后还是报错,直接看捕获到的内部异常信息,就能精准定位到底是哪个对象为空。
内容的提问来源于stack exchange,提问作者s.d.c321
相关产品推荐
相关产品推荐

