У меня есть функция, использующая pdf2image для преобразования каждой страницы PDF-файла в изображения. По разным причинам я больше не могу использовать pdf2image и теперь должен вместо этого использовать PyMuPDF, однако у меня возникли проблемы с получением тех же результатов, что и при использовании pdf2image.
Коды для pdf2image и PyMuPDF приведены ниже.
Каждый элемент в pages_list для pdf2image является numpy.ndarray, и я могу убедиться, что PDF-файлы были правильно преобразованы, просмотрев полученное изображение Image.fromarray(pages_list[i]) с помощью библиотеки PIL. Когда я просматриваю это с результатом pdf2image, я вижу исходный PDF-файл в виде изображения. Когда я просматриваю это с результатом PyMuPDF, я вижу один длинный очень тонкий столбец пикселей, которые не образуют полного изображения.
Расчетное время ожидания: я могу использовать Pillow локально для просмотра изображений, но в конечном итоге это перейдет в лямбда-функцию AWS, и мне не разрешено использовать Pillow и сохранять файлы.
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)
Хотя я успешно преобразовал полученный объект байтов в массив numpy, массив сильно отличается от результатов pdf2image. Я надеялся получить точно такой же результат от PyMuPDF, как и от pdf2image, но не уверен, где именно я ошибаюсь. Я предполагаю, что это что-то в том, как я конвертирую байты в массив, но мне еще предстоит найти работающее решение.
# 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?






Блок кода ниже решил мою проблему, благодаря этому вопросу и изменению кода, прокомментированному Джорджем Маккаем.
doc = fitz.open(img_path)
pages_list = []
for page in doc:
zoom_x, zoom_y = 2.0, 2.0
mat = fitz.Matrix(zoom_x, zoom_y)
pix = page.get_pixmap(matrix=mat)
im = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.h, pix.w, pix.n)
im = np.ascontiguousarray(im[..., [2, 1, 0]])
pages_list.append(im)
Используйте класс
Pixmap, нейтрализованный объект изображения PyMuPDF. Он содержит областьbytessamples, содержащую отдельные байты изображения. Например:img = np.ndarray([pix.h, pix.w, 3], dtype=np.uint8, buffer=pix.samples_mv).