One of the big limitations of reportlab is that it has no support for vector-based images. You can't insert SVG, EPS or any other vector-based format in your documents.
Until now.
By hijacking another app called uniconvertor, I have managed to insert as vectors SVG images in a reportlab document.
Here's the hackish code:
import sys,os
from app.io import load
from app.plugins import plugins
import app
from reportlab.platypus import *
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
app.init_lib()
plugins.load_plugin_configuration()
class SVGImage(Flowable):
def __init__(self,imgname):
self.doc = load.load_drawing(imgname)
for k in dir(self.doc):
print k
self.saver = plugins.find_export_plugin(plugins.guess_export_plugin(".pdf"))
Flowable.__init__(self)
def wrap(self,aW,aH):
br=self.doc.BoundingRect()
return br[2],br[3]
def drawOn(self,canv,x,y,_sW=0):
canv.translate(x,y)
self.saver (self.doc,".ignoreme.pdf",options={'pdfgen_canvas':canv})
os.unlink(".ignoreme.pdf")
styles = getSampleStyleSheet()
def go():
doc = SimpleDocTemplate("phello.pdf")
Story = [Spacer(1,2*inch)]
style = styles["Normal"]
p = SVGImage('warning.svg')
Story.append(p)
doc.build(Story)
go()
It has several problems (see where the second paragraph ended), but it does work.
To run it, you need a warning.svg file (edit as needed) and
you run it this way (replacing the path as proper for your setup):
PYTHONPATH=/usr/lib/python2.5/site-packages/uniconvertor/ python use_uniconv.py
In fact, this is not limited to SVG files. You should be able to use the following formats:
CorelDRAW ver.7-X3,X4 (CDR/CDT/CCX/CDRX/CMX)
Adobe Illustrator up to 9 ver. (AI postscript based)
Postscript (PS)
Encapsulated Postscript (EPS)
Computer Graphics Metafile (CGM)
Windows Metafile (WMF)
XFIG
Scalable Vector Graphics (SVG)
Skencil/Sketch/sK1 (SK and SK1)
Acorn Draw (AFF)