我有一个现有的函数,使用
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
相同的结果?
我发现执行此操作的最简单方法是保存图像并使用 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)
完成后,这还会自动删除图像文件。