簡體   English   中英

使用 pyPDF2 和 BytesIO 將 PDF 頁面轉換為圖像

[英]Convert PDF page to image with pyPDF2 and BytesIO

我有一個 function,它通過pyPdf2從 PDF 文件中獲取一個頁面,並且應該使用Pillow (PIL Fork)將第一頁轉換為 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)

任何提示表示贊賞

每個文件:

write(stream)將添加到該對象的頁面集合作為PDF文件寫出。

參數:stream-要寫入文件的對象。 該對象必須支持write方法和tell方法,類似於文件對象。

因此,對象pdf_bytes包含一個PDF文件,而不是圖像文件。

之所以會有類似上述代碼的原因是:有時,pdf文件僅包含jpeg文件作為其內容。 如果您的pdf只是普通的pdf文件,則不能僅讀取字節並將其解析為圖像。

並稱為更可靠的實現: https : //stackoverflow.com/a/34116472/334999

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 將 PDF 轉換為 Python 中的圖像

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM