Home | History | Annotate | Download | only in pens
      1 from __future__ import print_function, division, absolute_import
      2 from fontTools.misc.py23 import *
      3 from fontTools.pens.basePen import BasePen
      4 from reportlab.graphics.shapes import Path
      5 
      6 
      7 class ReportLabPen(BasePen):
      8 
      9 	"""A pen for drawing onto a reportlab.graphics.shapes.Path object."""
     10 
     11 	def __init__(self, glyphSet, path=None):
     12 		BasePen.__init__(self, glyphSet)
     13 		if path is None:
     14 			path = Path()
     15 		self.path = path
     16 
     17 	def _moveTo(self, p):
     18 		(x,y) = p
     19 		self.path.moveTo(x,y)
     20 
     21 	def _lineTo(self, p):
     22 		(x,y) = p
     23 		self.path.lineTo(x,y)
     24 
     25 	def _curveToOne(self, p1, p2, p3):
     26 		(x1,y1) = p1
     27 		(x2,y2) = p2
     28 		(x3,y3) = p3
     29 		self.path.curveTo(x1, y1, x2, y2, x3, y3)
     30 
     31 	def _closePath(self):
     32 		self.path.closePath()
     33 
     34 
     35 if __name__=="__main__":
     36 	import sys
     37 	if len(sys.argv) < 3:
     38 		print("Usage: reportLabPen.py <OTF/TTF font> <glyphname> [<image file to create>]")
     39 		print("  If no image file name is created, by default <glyphname>.png is created.")
     40 		print("  example: reportLabPen.py Arial.TTF R test.png")
     41 		print("  (The file format will be PNG, regardless of the image file name supplied)")
     42 		sys.exit(0)
     43 
     44 	from fontTools.ttLib import TTFont
     45 	from reportlab.lib import colors
     46 
     47 	path = sys.argv[1]
     48 	glyphName = sys.argv[2]
     49 	if (len(sys.argv) > 3):
     50 		imageFile = sys.argv[3]
     51 	else:
     52 		imageFile = "%s.png" % glyphName
     53 
     54 	font = TTFont(path)  # it would work just as well with fontTools.t1Lib.T1Font
     55 	gs = font.getGlyphSet()
     56 	pen = ReportLabPen(gs, Path(fillColor=colors.red, strokeWidth=5))
     57 	g = gs[glyphName]
     58 	g.draw(pen)
     59 
     60 	w, h = g.width, 1000
     61 	from reportlab.graphics import renderPM
     62 	from reportlab.graphics.shapes import Group, Drawing, scale
     63 
     64 	# Everything is wrapped in a group to allow transformations.
     65 	g = Group(pen.path)
     66 	g.translate(0, 200)
     67 	g.scale(0.3, 0.3)
     68 
     69 	d = Drawing(w, h)
     70 	d.add(g)
     71 
     72 	renderPM.drawToFile(d, imageFile, fmt="PNG")
     73