Python使用fsspec与spire.pdf处理Azure Gen2存储PDF遇类型错误
问题原因
你遇到的wrong type错误是因为fsspec_handle_read.read()返回的是字节数据(bytes类型),而Spire.PDF的PdfDocument.LoadFromFile()方法只接受文件路径字符串作为参数,类型不匹配导致报错。
解决方案
下面提供两种可行的修复方案,按需选择:
方案1:临时文件中转
将从Azure存储读取的字节数据写入本地临时文件,再通过文件路径加载到Spire.PDF中:
import fsspec import tempfile from spire.pdf import PdfDocument # 读取Azure存储中的PDF字节数据 with fsspec.open(f'abfss://container/folder/myfile.pdf', account_name=adls_account_name, account_key=adls_account_key) as fsspec_handle_read: big_pdf_bytes = fsspec_handle_read.read() # 写入临时文件 with tempfile.NamedTemporaryFile(suffix='.pdf', delete=False) as temp_pdf: temp_pdf.write(big_pdf_bytes) temp_pdf_path = temp_pdf.name # 加载PDF并拆分 pdf = PdfDocument() pdf.LoadFromFile(temp_pdf_path) # 拆分单页并保存 for page_num in range(pdf.Pages.Count): new_pdf = PdfDocument() new_pdf.Pages.Add(pdf.Pages[page_num]) new_pdf.SaveToFile(f'page_{page_num+1}.pdf') new_pdf.Close() pdf.Close() # 可选:删除临时文件 import os os.unlink(temp_pdf_path)
方案2:使用流加载(更高效)
Spire.PDF提供了LoadFromStream()方法,可以直接加载字节流,无需临时文件:
import fsspec from io import BytesIO from spire.pdf import PdfDocument # 读取Azure存储中的PDF字节数据并转为BytesIO流 with fsspec.open(f'abfss://container/folder/myfile.pdf', account_name=adls_account_name, account_key=adls_account_key) as fsspec_handle_read: big_pdf_bytes = fsspec_handle_read.read() pdf_stream = BytesIO(big_pdf_bytes) # 通过流加载PDF pdf = PdfDocument() pdf.LoadFromStream(pdf_stream) # 拆分单页并保存 for page_num in range(pdf.Pages.Count): new_pdf = PdfDocument() new_pdf.Pages.Add(pdf.Pages[page_num]) new_pdf.SaveToFile(f'page_{page_num+1}.pdf') new_pdf.Close() pdf.Close()
关键说明
- Spire.PDF的
LoadFromFile()仅支持文件路径,不能直接传入字节或流;LoadFromStream()支持BytesIO等流对象,更适合内存中处理文件。 - 如果需要将拆分后的文件写回Azure存储,可以继续使用
fsspec.open()以写入模式打开目标路径,将生成的单页PDF字节写入。
内容的提问来源于stack exchange,提问作者gertrude89
相关产品推荐
相关产品推荐

