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

时间:2017-03-11 09:27:05

标签: python pdf pypdf2 bytesio

我有一个函数可以通过pyPdf2从PDF文件中获取页面,并且应该将第一页转换为带有Pillow的png(或jpg)(PIL Fork)

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() method not working with BytesIO)但是我无法在这里看到我错在哪里,因为我已经添加了pdf_bytes.seek(0)

任何提示赞赏

1 个答案:

答案 0 :(得分:0)

每份文件:

  

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

     

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

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

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

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