Saltar al contenido

Inserte la imagen en Reportlab, ya sea desde la imagen PIL o StringIO

No dudes en divulgar nuestro sitio y códigos en tus redes sociales, necesitamos tu ayuda para ampliar nuestra comunidad.

Solución:

No tuve suerte con los métodos propuestos.

Verificar el código en pdfdoc.py muestra que AttributError resulta de tratar StringIO como un nombre de archivo:

    if source is None:
        pass # use the canned one.
    elif hasattr(source,'jpeg_fh'):
        self.loadImageFromSRC(source)   #it is already a PIL Image
    else:
        # it is a filename

Verificando más la fuente, muestra que jpeg_fh es un attribute de la clase ImageReader en reportlab.lib.utils. ImageReader acepta imágenes StringIO y PIL.

Entonces, envolver StringIO en un ImageReader resolvió el problema para mí:

import PIL
from reportlab.lib.utils import ImageReader

io_img = StringIO(data)
pil_img = PIL.Image.open(StringIO(data))

reportlab_io_img = ImageReader(io_img)
reportlab_pil_img = ImageReader(pil_img)

canvas.drawImage(reportlab_io_img, ...)
canvas.drawImage(reportlab_pil_img, ...)

La declaración repetitiva “Los formatos compatibles con PIL/Java 1.4 (la biblioteca de imágenes de Python/Java) son compatibles” simplemente significa que los formatos de datos compatibles con PIL son apoyados por reportlab (ya que usa PIL para leerlos).

Ahora, de echar un vistazo reportlab.platypus.flowables.Image código es posible ver que acepta un nombre de archivo o un objeto de archivo como entrada. Lo primero no es lo que quieres, así que concentrémonos en lo segundo. Tu dijiste StringIO no parecía funcionar, pero lo hace si tienes un poco de cuidado. Probablemente hiciste algo mal con él, aquí hay dos formas correctas de usar StringIO:

import sys
import PIL
from cStringIO import StringIO
from reportlab.platypus.flowables import Image

# Method 1
data = open(sys.argv[1]).read()
img1 = StringIO(data)

# Method 2
img2 = StringIO()
PIL.Image.open(sys.argv[2]).save(img2, 'PNG')
img2.seek(0)

# Method 3 (fails)
img3 = StringIO(PIL.Image.open(sys.argv[2]).tostring())

story = [Image(img1), Image(img2)]
#Image(img3)

El método 3 falla porque img3 ahora contiene los datos sin procesar de la imagen, por lo que no tiene idea del formato real de estos datos. No hay razón para intentar usar este método para tal tarea.

Si tiene datos sin procesar y conoce el modo de imagen de sus datos (‘L’, ‘RGB’, etc.) y también su ancho, alto, entonces puede usar un cuarto método (correcto) basado en PIL.Image.fromstring(...).save(mystrio, 'someformat').

valoraciones y comentarios

Si aceptas, tienes la habilidad dejar un artículo acerca de qué te ha impresionado de este escrito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *