独立EXE下PdfSharp调用MeasureString报System.NotImplementedException求助
问题:PdfSharp独立EXE编译后调用MeasureString崩溃
我用Visual Studio基于C#结合PdfSharp & MigraDoc开发了一款应用,非独立EXE编译时运行正常,但编译为独立EXE后,调用MeasureString计算文本宽度时会崩溃,抛出异常:
System.NotImplementedException: Cannot create value for key: /Info
我曾找到过相关问题案例,但该案例基于Unity场景,不清楚如何适配Visual Studio环境。目前打算如果无法解决就改用带DLL的完整部署方式,寻求可行的解决方案。
异常堆栈信息
System.NotImplementedException: Cannot create value for key: /Info at PdfSharp.Pdf.PdfDictionary.DictionaryElements.GetValue(String, VCF) at PdfSharp.Pdf.Advanced.PdfTrailer.get_Info() at PdfSharp.Pdf.PdfDocument.get_Info() at PdfSharp.Pdf.PdfDocument..ctor() at PDFVerificationProtocol.PDFCreator.CalculateRequiredColumnWidth(String) in Z:\PDF-Prüfprotokoll_Test\PDFVerificationProtocol\PDFVerificationProtocol\PDFCreator.cs:line 381 at PDFVerificationProtocol.PDFCreator.AddPSetTable(Section) in Z:\PDF-Prüfprotokoll_Test\PDFVerificationProtocol\PDFVerificationProtocol\PDFCreator.cs:line 229 at PDFVerificationProtocol.PDFCreator.Run() in Z:\PDF-Prüfprotokoll_Test\PDFVerificationProtocol\PDFVerificationProtocol\PDFCreator.cs:line 54 at PDFVerificationProtocol.Program.RunProgram() in Z:\PDF-Prüfprotokoll_Test\PDFVerificationProtocol\PDFVerificationProtocol\Program.cs:line 34 at PDFVerificationProtocol.Program.Main(String[]) in Z:\PDF-Prüfprotokoll_Test\PDFVerificationProtocol\PDFVerificationProtocol\Program.cs:line 11
出现问题的方法代码
private double CalculateRequiredColumnWidth(string text) { // 使用全局样式字体设置 XFont font = new XFont(globalStyle.Font.Name, globalStyle.Font.Size); // 创建虚拟文档 PdfDocument document = new PdfDocument(); document.AddPage(); XGraphics gfx = XGraphics.FromPdfPage(document.Pages[0]); // 测量文本宽度 XSize textSize = gfx.MeasureString(text, font); // 计算包含内边距的所需宽度 double requiredWidth = textSize.Width + (2 * cellPadding); return requiredWidth; }
解决方案
1. 替换文本测量逻辑,绕开PdfDocument实例化
问题根源在于独立编译下PdfDocument构造时无法创建/Info字典。可以改用基于GDI+内存画布的方式测量文本,完全避免创建PdfDocument:
private double CalculateRequiredColumnWidth(string text) { XFont font = new XFont(globalStyle.Font.Name, globalStyle.Font.Size); // 使用内存Bitmap创建XGraphics,替代PdfDocument依赖 using (var bitmap = new Bitmap(1, 1)) using (var gdiGraphics = Graphics.FromImage(bitmap)) using (var xGraphics = XGraphics.FromGraphics(gdiGraphics, new XSize(bitmap.Width, bitmap.Height))) { XSize textSize = xGraphics.MeasureString(text, font); return textSize.Width + (2 * cellPadding); } }
2. 调整独立编译配置
如果必须保留原有的PdfDocument使用逻辑,尝试修改项目发布设置:
- 关闭裁剪未使用的代码(Trim unused code)选项,防止PdfSharp的关键代码被误裁剪
- 确保发布模式下包含所有PdfSharp相关的依赖程序集
3. 升级PdfSharp版本
检查并升级到最新版的PdfSharp,新版本可能已经修复了独立编译场景下的兼容性问题。
内容的提问来源于stack exchange,提问作者Crizzly
相关产品推荐
相关产品推荐

