PyMuPDF 将图像转换为 numpy 数组?

问题描述 投票:0回答:1

我有一个现有的函数,使用

pdf2image
将 PDF 的每一页转换为图像。由于多种原因,我无法再使用
pdf2image
,现在必须使用
PyMuPDF
,但是,我无法获得与
pdf2image
相同的结果。

pdf2image
PyMuPDF
的代码分别如下。

pages_list
pdf2image
的每个项目都是
numpy.ndarray
,我可以通过使用
Image.fromarray(pages_list[i])
库查看
PIL
的生成图像来验证PDF是否已正确转换。当我用
pdf2image
的结果查看此内容时,我可以将原始 PDF 视为图像。当我用
PyMuPDF
的结果查看此结果时,我看到一个长而超薄的像素列,无法形成完整的图像。

pdf2image

pages = convert_from_path(img_path, 500)
pages_list = []
for i in range(len(pages)):
    pages_list.append(np.array(pages[i]))

PyMuPDF

pdf_doc = fitz.open(img_path)
pages_list = []
for i in range(len(pdf_doc)):
    page = pdf_doc[i]
    pixmap = page.get_pixmap(dpi=300)
    img = pixmap.tobytes()
    img_array = np.frombuffer(bytearray(img), dtype=np.uint8)
    img_array_np = np.array(img_array)
    pages_list.append(img_array_np)

虽然我成功地将生成的 bytes 对象转换为 numpy 数组,但该数组看起来与

pdf2image
的结果非常不同。我希望从
PyMuPDF
得到与从
pdf2image
完全相同的结果,但不确定我到底哪里出错了。我想这是我从字节转换为 numpy 数组的方式,但我还没有找到有效的修复方法。

# Repeated for pdf2image and PyMuPDF
print(f"{library_name}: \n{type(pages_list[0])}")
print(f".shape: {pages_list[0].shape}")
print(f".ndim: {pages_list[0].ndim}")
print(f".size: {pages_list[0].size}")

# pdf2image: 
# <class 'numpy.ndarray'>
# .shape: (5500, 4250, 3)
# .ndim: 3
# .size: 70125000

# PyMuPDF: 
# <class 'numpy.ndarray'>
# .shape: (378861,)
# .ndim: 1
# .size: 378861

如何从

PyMuPDF
获得与从
pdf2image
相同的结果?

python arrays numpy pymupdf pdf2image
1个回答
0
投票

我发现执行此操作的最简单方法是保存图像并使用 Pillow 再次加载它。

from PIL import Image
import tempfile


def page_to_array(page):
    with tempfile.NamedTemporaryFile() as temp:
        page.get_pixmap().save(temp.name)
        img = Image.open(temp.name)
    return np.array(img)

完成后,这还会自动删除图像文件。

© www.soinside.com 2019 - 2024. All rights reserved.