.NET MAUI Android如何从外部文件服务器获取PDF文件?
在.NET MAUI Android平板上通过iText访问SMB共享PDF的解决方案
核心问题原因
Android系统不支持直接识别Windows SMB共享的UNC路径(比如\\Path\to\File\file.pdf),所以直接将这类路径传给PdfReader会报文件未找到错误。必须通过网络协议获取文件流,再传入iText处理。
必要依赖库
需要添加SMB客户端库来访问Windows共享文件,推荐使用NuGet包 SharpCifs.Std,这是.NET平台下成熟的SMB协议实现库。
具体实现步骤
1. 安装NuGet包
在项目中安装SharpCifs.Std:
Install-Package SharpCifs.Std
或直接在NuGet包管理器中搜索安装。
2. 编写SMB流读取与PDF处理代码
通过SMB协议获取文件流,再传入PdfReader进行编辑,编辑后的文件可保存到本地或回传到共享服务器:
using SharpCifs.Smb; using iText.Kernel.Pdf; using System.IO; // 配置SMB共享信息(替换为你的服务器实际参数) string smbServerUrl = "smb://你的用户名:你的密码@服务器IP或主机名/共享文件夹名/file.pdf"; // 本地临时保存编辑后的文件路径(Android应用私有目录) string localEditPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "edited_temp.pdf"); try { // 连接SMB共享并获取PDF文件流 using SmbFile smbPdfFile = new SmbFile(smbServerUrl); using Stream pdfInputStream = smbPdfFile.GetInputStream(); // 用流初始化PdfReader,进行PDF编辑 using PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfInputStream), new PdfWriter(localEditPath)); // 在这里添加你的PDF编辑逻辑,例如: // pdfDoc.AddNewPage(); // 其他编辑操作... pdfDoc.Close(); // 可选:将编辑后的文件回传到SMB服务器 string destSmbUrl = "smb://你的用户名:你的密码@服务器IP或主机名/共享文件夹名/edited_file.pdf"; using SmbFile destSmbFile = new SmbFile(destSmbUrl); using Stream destOutputStream = destSmbFile.GetOutputStream(); using FileStream localStream = new FileStream(localEditPath, FileMode.Open); localStream.CopyTo(destOutputStream); } catch (Exception ex) { // 处理异常,比如权限问题、连接失败等 Console.WriteLine($"操作失败:{ex.Message}"); }
3. 配置Android权限
在Platforms/Android/AndroidManifest.xml中添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
如果服务器使用非标准端口或需要额外权限,可根据实际情况补充配置。
替代方案
如果不想依赖SMB库,还有两种可选思路:
- 先下载到本地:若共享文件可通过HTTP访问,用HttpClient将PDF下载到Android应用的私有目录,再用iText处理,编辑后再上传回服务器。
- 系统文件选择器:使用MAUI的
FilePicker让用户手动选择已挂载的SMB共享文件,这种方式依赖Android系统对SMB的原生支持,部分设备可能需要用户先手动挂载共享文件夹。
关键注意事项
- 如果SMB共享不需要密码,可简化SMB URL为
smb://服务器IP或主机名/共享文件夹名/file.pdf。 - Android 10+需注意网络安全配置,若服务器使用未加密的SMB协议,可能需要在
res/xml/network_security_config.xml中允许访问对应IP。
内容的提问来源于stack exchange,提问作者ItsProbablySomethingStupid
相关产品推荐
相关产品推荐

