C#实现PDF读取保存遇异常:生成PDF空白且无法保留图片
问题分析与解决方案
核心错误原因
PDF是二进制格式文件,你的代码错误地使用StreamReader(文本读取器)读取内容,再通过Encoding.UTF8.GetBytes转换回字节流。这个过程会破坏PDF中的非文本二进制数据(比如图片、压缩内容):文本读取器会尝试把二进制字节解析成字符,导致原始数据丢失或损坏,最终生成的PDF自然空白且丢失图片。
修正方案:直接处理二进制流
不需要将PDF内容转换成字符串,直接复制原始二进制流即可完整保留PDF的所有内容。
修正后的代码
Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog(); bool? response = openFileDialog.ShowDialog(); if (response == true) { // 构建目标文件夹路径并创建 string folderPath = "ProjectPDFs"; string rootPath = @"X:\Vents-US Inventory"; string targetFolder = Path.Combine(rootPath, folderPath); Directory.CreateDirectory(targetFolder); // 构建目标文件路径 string targetFilePath = Path.Combine(targetFolder, openFileDialog.SafeFileName); // 直接复制原始文件流,全程保留二进制数据 using (Stream sourceStream = openFileDialog.OpenFile()) using (Stream targetStream = new FileStream(targetFilePath, FileMode.Create, FileAccess.Write)) { sourceStream.CopyTo(targetStream); } }
关键改进点
- 移除了字符串转换步骤,直接从源文件流复制到目标文件流,完整保留PDF的所有二进制内容。
- 简化了文件夹创建逻辑,
Directory.CreateDirectory可直接接收路径字符串,无需额外创建DirectoryInfo实例。 - 增加了用户确认对话框操作的判断(
response == true),避免用户取消选择后执行无效代码。
内容的提问来源于stack exchange,提问作者Ty Vents
相关产品推荐
相关产品推荐

