You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.8 KiB
72 lines
1.8 KiB
from __future__ import print_function, division, absolute_import |
|
from fontTools.misc.py23 import * |
|
from fontTools.pens.basePen import BasePen |
|
from reportlab.graphics.shapes import Path |
|
|
|
|
|
class ReportLabPen(BasePen): |
|
|
|
"""A pen for drawing onto a reportlab.graphics.shapes.Path object.""" |
|
|
|
def __init__(self, glyphSet, path=None): |
|
BasePen.__init__(self, glyphSet) |
|
if path is None: |
|
path = Path() |
|
self.path = path |
|
|
|
def _moveTo(self, p): |
|
(x,y) = p |
|
self.path.moveTo(x,y) |
|
|
|
def _lineTo(self, p): |
|
(x,y) = p |
|
self.path.lineTo(x,y) |
|
|
|
def _curveToOne(self, p1, p2, p3): |
|
(x1,y1) = p1 |
|
(x2,y2) = p2 |
|
(x3,y3) = p3 |
|
self.path.curveTo(x1, y1, x2, y2, x3, y3) |
|
|
|
def _closePath(self): |
|
self.path.closePath() |
|
|
|
|
|
if __name__=="__main__": |
|
import sys |
|
if len(sys.argv) < 3: |
|
print("Usage: reportLabPen.py <OTF/TTF font> <glyphname> [<image file to create>]") |
|
print(" If no image file name is created, by default <glyphname>.png is created.") |
|
print(" example: reportLabPen.py Arial.TTF R test.png") |
|
print(" (The file format will be PNG, regardless of the image file name supplied)") |
|
sys.exit(0) |
|
|
|
from fontTools.ttLib import TTFont |
|
from reportlab.lib import colors |
|
|
|
path = sys.argv[1] |
|
glyphName = sys.argv[2] |
|
if (len(sys.argv) > 3): |
|
imageFile = sys.argv[3] |
|
else: |
|
imageFile = "%s.png" % glyphName |
|
|
|
font = TTFont(path) # it would work just as well with fontTools.t1Lib.T1Font |
|
gs = font.getGlyphSet() |
|
pen = ReportLabPen(gs, Path(fillColor=colors.red, strokeWidth=5)) |
|
g = gs[glyphName] |
|
g.draw(pen) |
|
|
|
w, h = g.width, 1000 |
|
from reportlab.graphics import renderPM |
|
from reportlab.graphics.shapes import Group, Drawing, scale |
|
|
|
# Everything is wrapped in a group to allow transformations. |
|
g = Group(pen.path) |
|
g.translate(0, 200) |
|
g.scale(0.3, 0.3) |
|
|
|
d = Drawing(w, h) |
|
d.add(g) |
|
|
|
renderPM.drawToFile(d, imageFile, fmt="PNG")
|
|
|