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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:12:44