Python reportlab inserting image into table
python, reportlab
Solution
You can use the Image of the ReportLab for image purpose instead of PIL.. hope it helps you. I have modified your code to below.
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, cm,landscape
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph, Table, TableStyle, Image
from reportlab.lib.enums import TA_LEFT, TA_CENTER
from reportlab.lib import colors
from reportlab.lib.units import inch
a = Image.open("path/to/temp.jpg")
a.drawHeight = 2*inch
a.drawWidth = 2*inch
data=[['1',a],['3','4']]
c = canvas.Canvas("Reportlabtest.pdf", pagesize=landscape(A4))
table = Table(data, colWidths=200, rowHeights=50)
table.setStyle(TableStyle([
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
('BOX', (0,0), (-1,-1), 0.25, colors.black),
('BACKGROUND',(0,0),(-1,2),colors.lightgrey)
]))
table.wrapOn(c, 200, 400)
table.drawOn(c,20,50)
c.save()
EDIT: to import `cm` function, we should use:
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib.units import cm
Problem
In the reportlab user guide (page79), this is how the images are inserted into the table. ``` I = Image('../images/replogo.gif') I.drawHeight = 1.25*inch*I.drawHeight / I.drawWidth I.drawWidth = 1.25*inch P0 = Paragraph(''' <b>A pa<font color=red>r</font>a<i>graph</i></b> <super><font color=yellow>1</font></super>''', styleSheet["BodyText"]) P = Paragraph(''' <para align=center spaceb=3>The <b>ReportLab Left <font color=red>Logo</font></b> Image</para>''', styleSheet["BodyText"]) data= [['A', 'B', 'C', P0, 'D'], ['00', '01', '02', [I,P], '04'], ['10', '11', '12', [P,I], '14'], ['20', '21', '22', '23', '24'], ['30', '31', '32', '33', '34']] t=Table(data,style=[('GRID',(1,1),(-2,-2),1,colors.green), ('BOX',(0,0),(1,-1),2,colors.red), ('LINEABOVE',(1,2),(-2,2),1,colors.blue), ('LINEBEFORE',(2,1),(2,-2),1,colors.pink), ('BACKGROUND', (0, 0), (0, 1), colors.pink), ('BACKGROUND', (1, 1), (1, 2), colors.lavender), ('BACKGROUND', (2, 2), (2, 3), colors.orange), ('BOX',(0,0),(-1,-1),2,colors.black), ('GRID',(0,0),(-1,-1),0.5,colors.black), ('VALIGN',(3,0),(3,0),'BOTTOM'), ('BACKGROUND',(3,0),(3,0),colors.limegreen), ('BACKGROUND',(3,1),(3,1),colors.khaki), ('ALIGN',(3,1),(3,1),'CENTER'), ('BACKGROUND',(3,2),(3,2),colors.beige), ('ALIGN',(3,2),(3,2),'LEFT'), ]) ``` So based on the above user guide, i assume that to insert images into tables, all i have to do is import image using PIL, image module , load image and use it as data for table. ``` from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4, cm,landscape from reportlab.lib.styles import getSampleStyleSheet from reportlab.platypus import Paragraph, Table, TableStyle from reportlab.lib.enums import TA_LEFT, TA_CENTER from reportlab.lib import colors from PIL import Image as im a=im.open("temp.jpg") data=[['1',a],['3','4']] c = canvas.Canvas("Reportlabtest.pdf", pagesize=landscape(A4)) table = Table(data, colWidths=200, rowHeights=50) table.setStyle(TableStyle([ ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), ('BOX', (0,0), (-1,-1), 0.25, colors.black), ('BACKGROUND',(0,0),(-1,2),colors.lightgrey) ])) table.wrapOn(c, 200, 400) table.drawOn(c,20,50) c.save() ``` But instead of inserting the image into the table, i had this message created on the pdf "PIL.Jpegimageplugin.JPEGImageFile mode=RGB size=200x200 at 0x179B1E8" What could be the problem?