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.