Search code examples
pythonpython-3.xpyside2wand

Convert WandImageObject into QPixmap


I am converting PdfPages into images with the wand.image library.
I need to store them into the cache and not store them local, but i cant figure out how to transform this WandImage-Object into a pixmap. I already read the documentation of wand.image and did a lot of research but couldn't solve the problem myself..

My Code was running perfectly well when i saved it local:

def pdf_to_jpeg(self, pdf_path):
    list_of_images = []
    wand_image_pdf = WI(filename=pdf_path, resolution=20)
    wand_image_jpegs = wand_image_pdf.convert("jpeg")
    for page_number, wand_image_jpeg in enumerate(wand_image_jpegs.sequence):
        jpeg = WI(image=wand_image_jpeg)
        jpeg.save(filename="../output/{0}.jpeg".format(str(page_number)))
        list_of_images.append("../output/{0}.jpeg".format(str(page_number)))
    return list_of_images

But with my new code:

def pdf_to_jpeg(self, pdf_path):
    list_of_images = []
    wand_image_pdf = WI(filename=pdf_path, resolution=20)
    wand_image_jpegs = wand_image_pdf.convert("jpeg")
    for page_number, wand_image_jpeg in enumerate(wand_image_jpegs.sequence):
        jpeg = WI(image=wand_image_jpeg)
        list_of_images.append(jpeg)
    return list_of_images

I get an Error:

QImage::QImage(), XPM is not supported
Traceback (most recent call last):

File "/Users/darjusch.schrand/PycharmProjects/PdfConverter/pdf_converter/main.py", line 33, in setup
    self.push_button_to_image = self.logic.create_push_button(self.list_of_images)

File "/Users/darjusch.schrand/PycharmProjects/PdfConverter/pdf_converter/logic/logic.py", line 21, in create_push_button
    pixmap = QPixmap(pic)
TypeError: The argument must be a sequence of strings.

Minimum Working Example:

from PySide2.QtGui import QPixmap, QIcon
from PySide2.QtCore import QSize
from PySide2.QtWidgets import QPushButton

class Logic:

def create_push_button(list_of_images):
    push_button_to_image = {}
    for pic in list_of_images:
        push_button = QPushButton()
        pixmap = QPixmap(pic)
        button_icon = QIcon(pixmap)
        push_button.setIcon(button_icon)
        push_button.setIconSize(QSize(100, 100))
        push_button.setCheckable(True)
        push_button_to_image[push_button] = pic
    return push_button_to_image

def pdf_to_jpeg(pdf_path):
    list_of_images = []
    wand_image_pdf = WI(filename=pdf_path, resolution=20)
    wand_image_jpegs = wand_image_pdf.convert("jpeg")
    for page_number, wand_image_jpeg in enumerate(wand_image_jpegs.sequence):
        jpeg = WI(image=wand_image_jpeg)
        list_of_images.append(jpeg)
    return list_of_images

pdf_to_jpeg("example.pdf")

example.pdf


Solution

  • The sequence is:

    from wand.image import Image
    
    from PySide2 import QtCore, QtGui, QtWidgets
    
    
    def pdf_to_qimages(pdf_path, resolution=200, fmt="png"):
        qimages = []
        with Image(filename=pdf_path, resolution=resolution) as pdf_im:
            for page in pdf_im.sequence:
                with Image(page) as page_image:
                    qimage = QtGui.QImage()
                    data = page_image.make_blob(format=fmt)
                    qimage.loadFromData(data)
                    qimages.append(qimage)
        return qimages
    
    
    if __name__ == "__main__":
        import os
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        current_dir = os.path.dirname(os.path.realpath(__file__))
        pdf_path = os.path.join(current_dir, "sample.pdf")
    
        qimages = pdf_to_qimages(pdf_path, resolution=20, fmt="jpeg")
    
        w = QtWidgets.QListWidget(
            viewMode=QtWidgets.QListWidget.IconMode,
            resizeMode=QtWidgets.QListWidget.Adjust,
            movement=QtWidgets.QListView.Static,
            iconSize=QtCore.QSize(200, 400),
        )
        for qimage in qimages:
            pixmap = QtGui.QPixmap.fromImage(qimage)
    
            it = QtWidgets.QListWidgetItem()
            it.setIcon(QtGui.QIcon(pixmap))
            w.addItem(it)
        w.resize(640, 480)
        w.show()
        sys.exit(app.exec_())