如何将服务器响应返回的PDF字节字符串转换为可用的PDF文件?
核心错误点
- 自定义
TxtToBin函数逻辑完全错误:该函数将原始字节转换为01格式的二进制字符串拼接输出,你后续将该字符串编码为字节写入文件,写入内容和原PDF二进制数据完全无关,必然导致文件损坏,请直接删除该函数。 - 将PDF二进制内容以普通字符串形式读取:PDF是二进制格式,包含大量非文本字符,调用
GetParameterValue读取为字符串时,会触发默认编码转换,丢失、篡改原始二进制数据,这是直接存储字符串转码后得到的PDF显示空白的核心原因。 - 多次无意义的编码转换:你先后使用Unicode、UTF8对内容反复编码转码,进一步破坏了原始PDF的字节结构。
正确解决方法
根据你使用MultipartFormDataParser的场景,PDF内容是作为multipart表单的文件字段返回的,不要从普通参数集合读取,要从文件集合读取原始二进制流:
' 发送请求部分增加异常校验,避免未完成请求就读数据 Dim message As Task(Of HttpResponseMessage) = client.PostAsync(linkApi, content) message.Wait() Dim response = message.Result response.EnsureSuccessStatusCode() ' 解析multipart返回 Dim streamResponse = response.Content.ReadAsStreamAsync() streamResponse.Wait() Dim parser = MultipartFormDataParser.Parse(streamResponse.Result) ' 读取文件名参数 Dim name_id = parser.GetParameterValue("paramString") ' 从Files集合读取PDF二进制流,不要读普通参数 Dim pdfFile = parser.Files.FirstOrDefault(Function(f) f.Name = "PDF") If pdfFile IsNot Nothing Then Dim saveDir = "你的本地保存目录路径" Dim path_pdf = Path.Combine(saveDir, $"{name_id}.pdf") ' 直接复制二进制流到本地文件,不做任何编码转换 Using fs As New FileStream(path_pdf, FileMode.Create, FileAccess.Write) pdfFile.Data.CopyTo(fs) End Using End If
如果确认服务器是将PDF转为Base64字符串放在普通参数中返回,使用如下方式解码即可:
Dim pdfBase64 = parser.GetParameterValue("PDF") Dim pdfBytes = Convert.FromBase64String(pdfBase64) Dim path_pdf = Path.Combine("你的本地保存目录路径", $"{name_id}.pdf") File.WriteAllBytes(path_pdf, pdfBytes)
内容的提问来源于stack exchange,提问作者KuKeC
相关产品推荐
相关产品推荐

