Xamarin Forms UWP中用iTextSharp读取PDF报错:文件或资源未找到求助
解决Xamarin Forms UWP中iTextSharp的PdfReader文件找不到问题
我来帮你搞定这个读取PDF时的报错问题~这个错误其实是UWP应用的沙箱权限限制导致的,不是你代码写错了,而是UWP对文件系统的访问规则和普通桌面应用不一样。
为什么原来的代码会报错?
UWP应用运行在独立的沙箱里,Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)返回的是应用自己的私有文档目录,而不是你电脑系统里的公共Documents文件夹。你要读取的Test.pdf应该是放在公共Documents里的,所以代码找不到这个文件很正常。
下面给你两个可行的解决方案,推荐用第一个,更符合UWP的安全设计:
方案1:用FileOpenPicker获取文件流(推荐)
UWP推荐通过文件选择器让用户手动选择文件,这样应用就能获得该文件的访问权限。我们可以用Xamarin的依赖服务来调用UWP原生的FileOpenPicker:
步骤1:在共享项目定义接口
先创建一个接口来统一文件获取的方法:
public interface IPdfFileAccessor { Task<Stream> GetSelectedPdfStreamAsync(); }
步骤2:在UWP项目实现接口
在UWP项目里添加这个接口的实现,用依赖服务注册:
[assembly: Dependency(typeof(UwpPdfFileAccessor))] namespace YourAppNamespace.UWP { public class UwpPdfFileAccessor : IPdfFileAccessor { public async Task<Stream> GetSelectedPdfStreamAsync() { var picker = new FileOpenPicker(); // 设置只允许选择PDF文件 picker.FileTypeFilter.Add(".pdf"); // 打开时默认定位到系统Documents文件夹 picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; var selectedFile = await picker.PickSingleFileAsync(); if (selectedFile == null) return null; // 获取文件的可读流,这个流可以直接给PdfReader用 return await selectedFile.OpenStreamForReadAsync(); } } }
步骤3:在共享代码中调用
然后在你的业务逻辑里调用这个服务,用流来初始化PdfReader:
var pdfAccessor = DependencyService.Get<IPdfFileAccessor>(); var pdfStream = await pdfAccessor.GetSelectedPdfStreamAsync(); if (pdfStream != null) { // 用流初始化PdfReader,避免路径问题 using (var reader = new PdfReader(pdfStream)) { // 这里写你的PDF处理逻辑,比如添加文本等 // ... // 处理完后记得保存到目标文件,同样推荐用FileSavePicker来选择保存路径 } }
方案2:声明DocumentsLibrary权限(不推荐,权限较宽)
如果你一定要直接访问系统Documents文件夹里的文件,需要给UWP应用添加权限:
- 打开UWP项目的
Package.appxmanifest文件 - 切换到功能标签页,勾选文档库权限
- 切换到声明标签页,添加文件类型关联,在属性里设置:
- 显示名称:PDF文件
- 文件类型:.pdf
然后用UWP的KnownFolders来获取文件,而不是用Environment的路径:
var documentsFolder = KnownFolders.DocumentsLibrary; try { var pdfFile = await documentsFolder.GetFileAsync("Test.pdf"); var stream = await pdfFile.OpenStreamForReadAsync(); using (var reader = new PdfReader(stream)) { // 你的处理逻辑 } } catch (FileNotFoundException) { // 处理文件不存在的情况 }
这个方案需要用户同意应用访问文档库,而且权限比较宽泛,所以一般不推荐,除非你的应用确实需要批量访问文档库的文件。
内容的提问来源于stack exchange,提问作者asv
相关产品推荐
相关产品推荐

