分割存储在Azure Blob存储上的PDF
我正在尝试在 Python 3 中做以下事情:
- 从 Azure 的一个存储账户中的文件夹里获取一个 .pdf 文件
- 把这个 .pdf 文件拆分成单独的页面
- 把每一页保存为一个新文件
我想用 fsspec 和 spire.pdf 来实现这个功能,但在尝试把 pdf 文件传给 spire.pdf 时,出现了“错误类型”的错误(这是第一步!)。以下是代码(spire.pdf 的代码来自 这里)。
import fsspec
from spire.pdf.common import *
from spire.pdf import *
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 = fsspec_handle_read.read()
# Create a PdfDocument object
pdf = PdfDocument()
# Load a PDF file
pdf.LoadFromFile(big_pdf)
我遇到的错误是:
ArgumentError: argument 2: <class 'TypeError'>: wrong type
我似乎找不到 spire 期望的文件类型是什么,也不太确定现在传给它的文档是什么文件类型。
1 个回答
0
将存储在Azure Blob存储上的PDF文件拆分
PdfDocument
类的LoadFromFile
方法需要一个文件路径作为参数,而不是文件的内容。
你可以使用下面的代码,它利用io
模块从PDF文件的内容创建一个类似文件的对象,并将其保存到一个临时文件中。然后,将这个文件的路径传递给PdfDocument.LoadFromFile
方法。PDF文档需要一些元数据和页码,所以必须传递文件名。fsspec
只提供二进制格式的数据。
代码:
import fsspec
import tempfile
from spire.pdf.common import *
from spire.pdf import *
adls_account_name="xxxx"
adls_account_key="xxxxx"
with fsspec.open(f'abfss://sample/User_Guide_StatPlanet.pdf', account_name=adls_account_name, account_key=adls_account_key) as fsspec_handle_read:
big_pdf = fsspec_handle_read.read()
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
temp_file.write(big_pdf)
temp_filename = temp_file.name
pdf = PdfDocument()
pdf.LoadFromFile(temp_filename)
pdf.Split("SplitByEachPage-{0}.pdf", 1)
os.remove(temp_filename)
pdf.Close()
上面的代码使用fsspec
来访问PDF文件,创建一个临时文件来写入PDF的内容,然后将PDF加载到一个PdfDocument对象中。接着,代码将PDF拆分成单独的页面,并将每一页保存为一个独立的PDF文件。最后,它会删除临时文件并关闭PdfDocument对象。
输出:
参考:
Spire.PDF-for-Python/Examples/13_Document at main · eiceblue/Spire.PDF-for-Python · GitHub