Azure Data Factory带Cookie下载PDF至ADLS2及转PDF修复
解决Databricks提取PDF二进制字符串转文件损坏的问题
问题核心
你当前的代码逻辑完全错误,导致无法还原原始PDF二进制内容:原代码将字符串转成UTF-8字节后做Base64编码,再解码,这相当于绕了一圈又回到了原字符串的UTF-8编码,根本没处理存储在Response里的原始PDF二进制数据,所以生成的文件必然损坏。
针对不同Response内容格式的解决方案
首先需要明确pdf_content_string的实际格式,对应以下处理方式:
情况1:Response内容是URL编码的二进制字符串(开头为%PDF)
HTTP活动返回的JSON中,二进制内容常被URL编码(每个字节用%XX表示),此时用URL解码即可还原原始字节:
from urllib.parse import unquote_to_bytes # 解码URL编码的字符串,得到原始PDF字节 pdf_bytes = unquote_to_bytes(pdf_content_string) # 写入ADLS Gen2(注意Databricks路径需用/dbfs前缀或dbutils操作) with open("/dbfs/mnt/your-adls-container/path/output.pdf", "wb") as f: f.write(pdf_bytes) # 或直接用dbutils写入 # dbutils.fs.put("/mnt/your-adls-container/path/output.pdf", pdf_bytes, overwrite=True)
情况2:Response内容是字节字符串的repr形式(如b'%PDF-1.4...')
如果字符串是Python字节对象的字符串表示(带b'前缀和'后缀),需先清理格式再用Latin-1编码还原字节(Latin-1保证每个字符对应一个原始字节):
# 移除字节字符串的标识前缀和引号 clean_content = pdf_content_string.strip("b'\"") # 用Latin-1编码还原原始二进制 pdf_bytes = clean_content.encode('latin-1') # 写入文件 with open("/dbfs/mnt/your-adls-container/path/output.pdf", "wb") as f: f.write(pdf_bytes)
情况3:Response内容是Base64编码字符串
如果确认Response里的字符串是Base64编码后的PDF内容,直接解码即可:
import base64 pdf_bytes = base64.b64decode(pdf_content_string, validate=True) # 写入文件 with open("/dbfs/mnt/your-adls-container/path/output.pdf", "wb") as f: f.write(pdf_bytes)
验证方法
可以先打印pdf_content_string的前20个字符,判断其格式:
- 开头是
%PDF→ 情况1 - 开头是
b'%PDF→ 情况2 - 开头是类似
JVBERi0xLjQK→ 情况3(Base64编码的PDF开头)
内容的提问来源于stack exchange,提问作者Javier de la Iglesia
相关产品推荐
相关产品推荐

