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

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应用添加权限:

  1. 打开UWP项目的Package.appxmanifest文件
  2. 切换到功能标签页,勾选文档库权限
  3. 切换到声明标签页,添加文件类型关联,在属性里设置:
    • 显示名称: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:37:45