Access VBA调用Web API提交XML获取PDF时编码异常问题排查
问题解决:Access宏提交XML附件后PDF乱码
问题根源
- 提交环节编码错误:原代码用
file.OpenTextFile.ReadAll以文本方式读取XML,会将文件编码转换为Access默认的ANSI编码,再拼接成字符串发送时,MSXML2会用系统默认编码而非UTF-8(Postman默认用UTF-8),导致服务端解析XML时字符编码错乱,最终PDF输出乱码。 - 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
相关产品推荐
相关产品推荐

