分割存储在Azure Blob存储上的PDF

0 投票
1 回答
69 浏览
提问于 2025-04-14 17:40

我正在尝试在 Python 3 中做以下事情:

  1. 从 Azure 的一个存储账户中的文件夹里获取一个 .pdf 文件
  2. 把这个 .pdf 文件拆分成单独的页面
  3. 把每一页保存为一个新文件

我想用 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

撰写回答