[reportlab-users] SVG and EPS

Robin Becker robin at reportlab.com
Tue Aug 29 12:56:15 EDT 2006


Rob Schall wrote:
> Wow, most of that definitely went way over my head.  The code below I 
> assume will make a "object" from scratch. If I already have an svg file 
> or eps file, there isn't a function, or set of functions to simply 
> convert it to a drawing object, in which i can do things like drawOn? I 
> came across a svglib.py file, which allows me to import it and 
> supposedly draw it, but that isn't quite working.
......


unfortunately not. We have stuff for drawing to svg, but not parsing it. 
Likewise eps is a pretty big language. Usually I just look inside the eps and 
see if the operators make some sense. Then I can start creating a drawing object 
or function which abstracts the various movetos linetos curvetos etc etc to 
create a path which will draw the outline and or fill it.

Inside an eps I might see something like

331.7844 260.1304 m
320.6108 260.1304 314.558 265.8712 314.558 274.7176 c
314.558 322.98 L
303.5404 322.98 L
303.5404 327.7904 L
314.558 327.7904 L
314.558 354.6368 L
320.766 354.6368 327.2836 354.4816 333.646 354.6368 c
333.646 327.7904 L
349.4748 327.7904 L
349.4748 322.98 L
333.646 322.98 L
333.646 264.9408 L
349.7852 264.9408 L
349.7852 260.1304 L
331.7844 260.1304 l
f


well the m is a moveto, the c's are curvetos, the L's are linetos and the l is a 
  closing lineto (I think it means join back to the start of the path). The f 
says fill.


Well we can do that like this

from reportlab.graphics.shapes import Drawing, Group, definePath
from reportlab.colors import red, green
class HackPath(Drawing):
     def __init__(self,width=400,height=400,*args,**kw):
         apply(Drawing.__init__,(self,width,height)+args,kw)
         self.add(definePath([('moveTo',331.7844,260.1304),
		('curveTo',320.6108,260.1304,314.558,265.8712,314.558,274.7176),
		('lineTo',314.558,322.98),
         	#.......
         	('closePath',)]),name='P')
         self.P.fillColor = green
         self.P.strokeColor = red
         self.P.strokeWidth = 2

if __name__=="__main__": #NORUNTESTS
     HackPath().save(formats=['pdf'],outDir='.',fnRoot=None)

Which is something you can run and have a look at the output HackPath000.pdf.
-- 
Robin Becker


More information about the reportlab-users mailing list