PowerShell下载Base64编码PDF出现空白问题求助
问题:PowerShell解码Base64 PDF后显示空白
概述
编写脚本下载ISP Spectrum的月度账单,通过Invoke-RestMethod获取到包含Base64编码PDF的JSON响应。
请求代码
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession $session.Cookies.Add((New-Object System.Net.Cookie("thumbprint_consumer_portal", "xxxx", "/", ".spectrum.net"))) $pdf = Invoke-RestMethod -UseBasicParsing -Uri "https://apis.spectrum.net/selfservice/graph" ` -Method "POST" ` -WebSession $session ` -Headers @{ "authorization"="Bearer xxxx" } ` -ContentType "application/json" ` -Body "{$body}"
原解码保存代码
$raw = $pdf.data.viewer.account.statementPdf $file = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($raw)) Out-File -FilePath "bill.pdf" -InputObject $file
问题现象
解码保存后的PDF页数、文件大小与官网原文件一致,但打开后显示空白,Acrobat和Chrome PDF Viewer均无法正常查看内容。
排查结果
- 将原始Base64文本通过CyberChef解码保存,PDF可正常显示,确认问题出在PowerShell的解码/编码流程
- 尝试多种文本编码(ASCII、UTF8、Unicode等):ASCII生成的文件参数匹配但仍空白;UTF8等编码导致文件体积翻倍且仍空白;其他编码直接造成文件损坏
- 尝试
Invoke-RestMethod的-OutFile参数,生成的文件不可读;修改请求ContentType会触发服务端拦截或报错
解决方法
问题根源是你将Base64解码后的二进制PDF数据转成了文本字符串,再用Out-File保存——这会破坏PDF的二进制结构。PDF是二进制文件,需直接将解码后的字节数组写入文件,跳过文本编码转换步骤。
替换原解码保存代码为:
$raw = $pdf.data.viewer.account.statementPdf # 直接解码为字节数组并写入文件 [System.IO.File]::WriteAllBytes("bill.pdf", [System.Convert]::FromBase64String($raw))
说明
[System.Convert]::FromBase64String($raw)直接得到了PDF的原始二进制字节流,[System.IO.File]::WriteAllBytes会将字节数组原封不动写入文件,完全保留PDF的结构,避免文本编码带来的损坏。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

