3

我有一个函数可以从 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()

这会导致错误:

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

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

任何提示表示赞赏

4

1 回答 1

1

每个文件:

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

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

所以对象 pdf_bytes 包含一个 PDF 文件,而不是一个图像文件。

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

并称为更强大的实现:https ://stackoverflow.com/a/34116472/334999

于 2017-03-11T10:48:13.350 回答