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

Access VBA调用Web API提交XML获取PDF时编码异常问题排查

问题解决:Access宏提交XML附件后PDF乱码

问题根源

  1. 提交环节编码错误:原代码用file.OpenTextFile.ReadAll以文本方式读取XML,会将文件编码转换为Access默认的ANSI编码,再拼接成字符串发送时,MSXML2会用系统默认编码而非UTF-8(Postman默认用UTF-8),导致服务端解析XML时字符编码错乱,最终PDF输出乱码。
  2. PDF保存方式错误:responseBody是二进制数据,原代码用ADODB.Stream的文本模式(Type=2)写入,会把二进制字节当成文本处理,破坏PDF的二进制结构,导致打开后乱码。

修正后的提交代码

改用二进制流构建请求体,避免编码转换问题:

Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "POST", url, False

' 定义multipart分隔符
Dim boundary As String
boundary = "---------------------------7e0dd540448"

' 设置请求头,明确分隔符
http.setRequestHeader "Content-Type", "multipart/form-data; boundary=" & boundary

' 初始化请求体流(二进制模式)
Dim reqStream As Object
Set reqStream = CreateObject("ADODB.Stream")
reqStream.Type = 1
reqStream.Open

' 写入分隔符
Dim boundaryBytes() As Byte
boundaryBytes = StrConv("--" & boundary & vbCrLf, vbFromUnicode)
reqStream.Write boundaryBytes

' 写入文件字段头,明确XML编码为UTF-8
Dim header As String
header = "Content-Disposition: form-data; name=""action-xmlagentxmlfile""; filename=""" & file.GetFileName(filePath) & """" & vbCrLf & _
         "Content-Type: application/xml; charset=utf-8" & vbCrLf & vbCrLf
Dim headerBytes() As Byte
headerBytes = StrConv(header, vbFromUnicode)
reqStream.Write headerBytes

' 直接读取XML文件的二进制内容,避免编码转换
Dim xmlStream As Object
Set xmlStream = CreateObject("ADODB.Stream")
xmlStream.Type = 1
xmlStream.Open
xmlStream.LoadFromFile filePath
xmlStream.CopyTo reqStream
xmlStream.Close

' 写入结尾分隔符
Dim endBoundaryBytes() As Byte
endBoundaryBytes = StrConv(vbCrLf & "--" & boundary & "--" & vbCrLf, vbFromUnicode)
reqStream.Write endBoundaryBytes

' 发送请求
reqStream.Position = 0
http.send reqStream.Read
reqStream.Close

修正后的PDF保存代码

改用二进制模式写入响应体:

Dim fsT As Object
Set fsT = CreateObject("ADODB.Stream")
fsT.Type = 1 ' 二进制模式
fsT.Open
fsT.Write http.responseBody ' 直接写入二进制PDF数据
fsT.SaveToFile savePath, 2 ' 2表示覆盖已存在的文件
fsT.Close

关键说明

  • 提交时用二进制流处理整个请求体,确保XML文件的原始编码(UTF-8)不被修改,同时明确告知服务端XML的编码格式,和Postman的请求行为保持一致。
  • 保存PDF时严格使用二进制模式,完全保留响应的字节数据,避免文本模式的编码转换破坏PDF文件结构。

内容的提问来源于stack exchange,提问作者vilmarci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 11:07:31