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

Pri*_*muS 5 python pdf pypdf bytesio

我有一个函数可以从 PDF 文件中获取页面,并使用(PIL Fork)PyPDF2将第一页转换为 png(或 jpg)Pillow

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()
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

OSError:无法识别图像文件<_io.BytesIO对象位于0x0000023440F3A8E0>

我发现一些线程有类似的问题(PIL open() 方法不适用于 BytesIO),但我看不出我在这里错在哪里,因为我已经pdf_bytes.seek(0)添加了。

任何提示表示赞赏

Shu*_*huo 1

每份文件:

\n\n
\n

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

\n\n

参数:stream \xe2\x80\x93 要写入文件的对象。该对象必须支持 write 方法和tell 方法,类似于文件对象。

\n
\n\n

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

\n\n

之所以有像上面这样的代码是因为:有时,pdf文件只包含一个jpeg文件作为其内容。如果您的 pdf 只是一个普通的 pdf 文件,您不能只读取字节并将其解析为图像。

\n\n

并参考更强大的实现:/sf/answers/2388153071/

\n