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

在Xamarin.Forms的.NET Standard2项目中用pdfHtml生成PDF遇assembly空值异常

解决Xamarin.Forms(.NET Standard 2)中pdfHtml生成PDF的Assembly空引用异常

问题根源

Xamarin.Forms的跨平台项目结构(共享库+平台专属项目)和.NET 6控制台环境差异很大,Assembly.GetExecutingAssembly()在共享项目中可能返回空或者错误的程序集,再加上资源嵌入配置、路径处理的问题,最终触发空引用异常。

具体修复步骤

  • 确保资源嵌入配置正确
    右键你的test.html文件→属性,把「生成操作」改成「嵌入的资源」。然后通过以下代码打印所有可用的资源名称,确认你的resourceName完全匹配:

    var assembly = typeof(YourSharedProjectClass).Assembly;
    foreach (var name in assembly.GetManifestResourceNames())
    {
        Console.WriteLine(name);
    }
    

    资源名称格式是[共享项目程序集名].[文件夹名].[文件名],比如你的共享项目叫MyApp.Shared,文件在Data文件夹下,资源名就是MyApp.Shared.Data.test.html。

  • 替换Assembly获取方式
    不要用Assembly.GetExecutingAssembly(),改用共享项目中某个类的程序集,确保拿到的是包含嵌入资源的共享库程序集:

    // 把YourSharedProjectClass换成你共享项目里实际存在的类
    var assembly = typeof(YourSharedProjectClass).Assembly;
    
  • 适配Xamarin的文件路径
    Xamarin.Forms不能随便用自定义路径,要使用系统允许的存储目录,比如:

    string targetPath = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), 
        "output.pdf"
    );
    
  • 完善pdfHtml的转换配置
    Xamarin环境下需要补充必要的配置,避免隐性错误:

    ConverterProperties converterProperties = new ConverterProperties();
    // 启用内置字体,避免字体缺失问题
    converterProperties.SetFontProvider(new DefaultFontProvider(true));
    // 设置BaseUri,确保HTML中的相对资源能被解析
    converterProperties.SetBaseUri(Path.GetDirectoryName(targetPath));
    

修正后的完整代码

using System.IO;
using System.Reflection;
using iText.Html2pdf;
using iText.Html2pdf.Resolver.Font;

// 替换成你共享项目中的实际类
var assembly = typeof(YourSharedClass).Assembly;
var resourceName = "MyApp.Shared.Data.test.html"; // 替换成实际的资源名

// 获取合法的存储路径
string targetPath = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), 
    "output.pdf"
);

using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
using (FileStream pdfDest = File.Open(targetPath, FileMode.Create))
{
    string result = reader.ReadToEnd();
    ConverterProperties converterProperties = new ConverterProperties();
    converterProperties.SetFontProvider(new DefaultFontProvider(true));
    converterProperties.SetBaseUri(Path.GetDirectoryName(targetPath));
    
    HtmlConverter.ConvertToPdf(result, pdfDest, converterProperties);
}

内容的提问来源于stack exchange,提问作者rherzog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:01:15