将编码字符串转字节写入PDF失败,如何确认编码及正确处理?
编辑:问题已解决,感谢Jeremy Lakeman的评论,为我指明了正确方向。
问题背景
我持有一段PDF文件内容字符串,需要基于该字符串生成可正常打开的PDF文件。
编辑:编码字符串的样例可查看相关截图及共享文档内容。
我此前没有编码相关处理经验,若有基础概念错误还请谅解。
已尝试的方案
我最初使用如下代码做字符串转字节、写入文件的操作:
var bytes = System.Text.Encoding.Unicode.GetBytes(FileContentString); File.WriteAllBytes(filePath, bytes);
代码运行后可以生成后缀为.pdf的文件,但用Edge PDF查看器打开时会提示“我们无法打开此文件”。
后续我还尝试了UTF-8、UTF-32编码做转换,所有编码方式都能正常写出文件,但生成的文件要么无法打开,要么打开后仅显示空白页。
存在的疑问
- 这段PDF内容字符串实际使用的是什么编码?
- 是不是我整体的处理逻辑本身就有错误?
解答
你的处理逻辑从根本上存在错误,和选哪种UTF/Unicode编码没有关系:
- PDF是二进制格式文件,不是纯文本文件,不能直接通过Unicode、UTF-8、UTF-32这类面向文本的编码把字符串转成字节就生成合法PDF,这类转换会破坏PDF的原始二进制结构,自然无法正常打开。
- 你手里的PDF内容字符串只有两种常见可能,对应处理方式如下:
- 如果字符串以
JVBERi0开头:这是PDF文件的Base64编码字符串,不需要走文本编码转换,直接做Base64解码即可,参考代码:var bytes = Convert.FromBase64String(FileContentString); File.WriteAllBytes(filePath, bytes); - 如果字符串开头能看到
%PDF-字样:这是PDF原始二进制内容被错误按单字节文本编码解码成的字符串,你需要用ISO-8859-1编码(单字节编码,编码值和字节值一一对应,不会破坏原始二进制)把字符串转回字节数组,参考代码:var bytes = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(FileContentString); File.WriteAllBytes(filePath, bytes);
- 如果字符串以
按上述对应方式处理后,生成的PDF文件即可正常打开。
内容的提问来源于stack exchange,提问作者Austin Jones
相关产品推荐
相关产品推荐

