Android平台.NET Maui中获取资源图片路径的问题
解决MAUI Android中iText7读取嵌入资源图片的问题
在MAUI Android中,设置为MauiAsset、MauiImage或Resource的资源是嵌入到程序集中的,并非存储在文件系统的可访问路径下,因此直接使用文件路径调用ImageDataFactory.Create(string path)会抛出文件未找到异常。以下是正确的实现方式:
核心解决方案:通过程序集读取嵌入资源流
- 确认资源的生成操作:确保你的图片文件的生成操作设置为
MauiAsset(默认会标记为嵌入资源),或者手动设置为Embedded resource。 - 构建资源的完整命名:嵌入资源的名称格式为
[项目命名空间].[资源层级路径(斜杠替换为点)].[文件名]。例如你的项目命名空间是BalanceReportApp,图片路径是Assets/logo.png,则资源全名是BalanceReportApp.Assets.logo.png。 - 从程序集获取资源流,再传递给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
相关产品推荐
相关产品推荐

