Delphi7+Indy10.0.52:XML中Base64编码PDF解码后无法打开的解决方法
问题分析与解决
你的问题核心出在用文本控件/字符串处理二进制数据上:
- TMemo是文本容器,会把PDF这类二进制字节当成Ansi/Unicode文本处理,过程中会丢失或篡改关键字节,导致文件损坏。
DecodeString()返回的字符串类型,无法适配二进制数据的字节结构——PDF的字节并非合法的文本编码字符,转成字符串时会出现不可逆的错误,最终保存的文件自然无法正常打开。
Indy10的TIdDecoderMIME本身支持直接解码到你自行创建的流,完全不需要碰私有成员FStream,正确做法如下:
正确代码示例
var Base64Str: string; // 从XML<Attachment>中提取的Base64编码内容 InputStream: TStringStream; OutputStream: TMemoryStream; Decoder: TIdDecoderMIME; begin // 假设已从XML中获取到Base64Str Base64Str := ...; InputStream := TStringStream.Create(Base64Str); OutputStream := TMemoryStream.Create; Decoder := TIdDecoderMIME.Create(nil); try // 将Base64输入流解码到二进制输出流 Decoder.Decode(InputStream, OutputStream); // 重置流指针到开头,保存为PDF文件 OutputStream.Position := 0; OutputStream.SaveToFile('C:\target.pdf'); finally Decoder.Free; OutputStream.Free; InputStream.Free; end; end;
额外注意事项
- 先清理Base64字符串中的冗余内容:如果XML的
<Attachment>标签内包含换行、空格等无关字符,必须先剔除再解码。 - Indy10.0.52版本的
TIdDecoderMIME默认支持标准Base64解码,无需额外配置编码。 - 二进制数据(PDF、图片等)必须用流类型直接处理,绝对不要通过文本控件或字符串中转。
内容的提问来源于stack exchange,提问作者Antonio Bianca
相关产品推荐
相关产品推荐

