使用PdfSharp.PdfReader打开PDF时遇资源缺失异常求助
我之前处理过好几个类似的PdfSharp资源加载问题,给你几个针对性的排查和解决步骤:
先确认NuGet包的正确性
如果你是通过NuGet安装的PdfSharp-gdi,先检查版本是否和你的项目框架兼容(比如.NET Framework版本是否匹配)。有时候旧版本或者安装过程中出现损坏,会导致资源文件没正确嵌入。可以尝试卸载后重新安装:Uninstall-Package PdfSharp-gdi Install-Package PdfSharp-gdi验证资源文件是否嵌入到程序集
如果是手动引用的PdfSharp-gdi.dll,可以用ILSpy这类工具打开程序集,看看里面有没有PdfSharp.Resources.Messages.resources这个资源文件。要是你自己编译PdfSharp源码,一定要确保资源文件的生成操作设置为「嵌入的资源」,不然编译后资源不会被包含进去。处理区域性不匹配的问题
异常提示明确提到了区域性,你可以在调用PdfReader.Open之前,强制把当前线程的区域性设为中性,避开区域性资源的加载问题:// 放在PDF读取代码之前 System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(string.Empty); System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(string.Empty);要是你的系统用的是比较特殊的区域性,也可以临时切换到en-US测试看看。
检查附属程序集和签名
确保PdfSharp-gdi的所有附属资源程序集(比如对应不同语言的zh-CN文件夹下的dll)都和主程序集签名一致,而且放在主程序集的同一目录下。Web项目的话,要确认bin目录里这些文件都存在。尝试切换到PCL版本(备选方案)
如果GDI版本的资源问题一直搞不定,可以试试PdfSharp的PCL版本,安装不带-gdi后缀的PdfSharp包,调整代码适配一下,PCL版本的资源管理通常更稳定。
另外,给你个调试小技巧:捕获异常时打印完整的堆栈信息,能帮你更快定位到底是哪个环节出了问题:
try { pdfDocument1 = PdfReader.Open(stream1, PdfDocumentOpenMode.Import); } catch (System.Resources.MissingManifestResourceException ex) { Console.WriteLine($"详细错误信息:{ex.ToString()}"); }
内容的提问来源于stack exchange,提问作者LIvanov

