使用PyPDF2和BytesIO将PDF页面转换为图像。

5
我有一个函数,通过PyPDF2从PDF文件中获取页面,并应该使用Pillow(PIL分支)将第一页转换为png(或jpg)。
from PyPDF2 import PdfFileWriter, PdfFileReader
import os
from PIL import Image
import io

# Open PDF Source #
app_path = os.path.dirname(__file__)
src_pdf= PdfFileReader(open(os.path.join(app_path, "../../../uploads/%s" % filename), "rb"))

# Get the first page of the PDF #
dst_pdf = PdfFileWriter()
dst_pdf.addPage(src_pdf.getPage(0))

# Create BytesIO #
pdf_bytes = io.BytesIO()
dst_pdf.write(pdf_bytes)
pdf_bytes.seek(0)

file_name = "../../../uploads/%s_p%s.png" % (name, pagenum)
img = Image.open(pdf_bytes)
img.save(file_name, 'PNG')
pdf_bytes.flush()

这导致了一个错误:
OSError: 无法识别图像文件<_io.BytesIO object at 0x0000023440F3A8E0> 我找到了一些类似问题的讨论帖子(PIL open()方法与BytesIO不兼容),但是我看不出我在这里错在哪里,因为我已经添加了pdf_bytes.seek(0)。
非常感谢任何提示。
2个回答

1

每个文档:

write(stream) 将添加到此对象的页面集合作为PDF文件写入。

参数: stream – 一个用于写入文件的对象。该对象必须支持 write 方法和 tell 方法,类似于文件对象。

因此,pdf_bytes 对象包含的是 PDF 文件,而不是图像文件。

上述代码之所以能够工作的原因是:有时候,pdf 文件只包含 jpeg 文件作为其内容。如果您的 PDF 只是普通的 PDF 文件,则不能仅读取字节并将其解析为图像。

更健壮的实现方法请参考: https://dev59.com/L3E85IYBdhLWcg3wnU0d#34116472


-1

[![在此输入图片描述][1]][1]

import glob, sys, fitz

# To get better resolution
zoom_x = 2.0  # horizontal zoom
zoom_y = 2.0  # vertical zoom
mat    = fitz.Matrix(zoom_x, zoom_y)  # zoom factor 2 in each dimension


filename = "/xyz/abcd/1234.pdf"  # name of pdf file you want to render
doc = fitz.open(filename)
for page in doc:
    pix = page.get_pixmap(matrix=mat)  # render page to an image
    pix.save("/xyz/abcd/1234.png")  # store image as a PNG

致谢

[使用PyMuPDF在Python中将PDF转换为图像][2]

https://towardsdatascience.com/convert-pdf-to-image-in-python-using-pymupdf-9cc8f602525b


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接