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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:45:35