You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

独立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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:57:35