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

Android平台.NET Maui中获取资源图片路径的问题

解决MAUI Android中iText7读取嵌入资源图片的问题

在MAUI Android中,设置为MauiAsset、MauiImage或Resource的资源是嵌入到程序集中的,并非存储在文件系统的可访问路径下,因此直接使用文件路径调用ImageDataFactory.Create(string path)会抛出文件未找到异常。以下是正确的实现方式:

核心解决方案:通过程序集读取嵌入资源流

  1. 确认资源的生成操作:确保你的图片文件的生成操作设置为MauiAsset(默认会标记为嵌入资源),或者手动设置为Embedded resource。
  2. 构建资源的完整命名:嵌入资源的名称格式为[项目命名空间].[资源层级路径(斜杠替换为点)].[文件名]。例如你的项目命名空间是BalanceReportApp,图片路径是Assets/logo.png,则资源全名是BalanceReportApp.Assets.logo.png。
  3. 从程序集获取资源流,再传递给iText7的ImageDataFactory.Create(Stream)方法。

修改后的代码示例

using System.Reflection;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Event;
using iText.Kernel.Pdf.Xobject;
using iText.Layout;
using iText.Layout.Element;

public class PDFHeaderEventHandler : IEventHandler
{
    public void HandleEvent(Event currentEvent)
    {
        try
        {
            PdfDocumentEvent docEvent = (PdfDocumentEvent)currentEvent;
            PdfDocument pdfDoc = docEvent.GetDocument();
            PdfPage page = docEvent.GetPage();
            Document document = new Document(pdfDoc);

            // 1. 获取当前程序集
            Assembly assembly = typeof(PDFHeaderEventHandler).Assembly;
            // 2. 替换为你的资源全名
            string resourceName = "BalanceReportApp.Assets.logo.png";

            // 3. 读取资源流
            using (Stream stream = assembly.GetManifestResourceStream(resourceName))
            {
                if (stream == null)
                {
                    throw new FileNotFoundException("未找到嵌入资源", resourceName);
                }
                // 4. 用流创建ImageData
                ImageData logoData = ImageDataFactory.Create(stream);
                Image logo = new Image(logoData)
                    .SetWidth(50) // 根据需要调整尺寸
                    .SetHeight(50);

                // 将图片添加到页眉位置
                document.ShowTextAligned(logo, 36, 806, page.GetPageNumber(), TextAlignment.LEFT, VerticalAlignment.TOP, 0);
            }
        }
        catch (Exception ex)
        {
            // 处理异常
            Console.WriteLine($"加载图片失败: {ex.Message}");
        }
    }
}

验证资源全名的方法

如果你不确定资源的正确全名,可以在程序启动时打印所有嵌入资源名称来确认:

Assembly assembly = typeof(YourMainClass).Assembly;
foreach (string resource in assembly.GetManifestResourceNames())
{
    Console.WriteLine(resource);
}

针对不同资源类型的补充说明

  • MauiImage:如果图片设置为MauiImage,MAUI会生成不同分辨率的变体,若需要特定分辨率的图片,资源名会包含分辨率后缀(如Assets.logo.mdpi.png),可根据需求选择对应的资源名。
  • Resource(Android原生资源):如果是放在Android项目Resources/drawable下的资源,可通过Android的Resources类获取流,例如:
    using Android.Content.Res;
    // 在Android平台代码中获取
    Stream stream = Android.App.Application.Context.Resources.OpenRawResource(Resource.Drawable.logo);
    ImageData logoData = ImageDataFactory.Create(stream);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:52:32