|
from fontTools.pens.basePen import BasePen |
|
from reportlab.graphics.shapes import Path |
|
|
|
|
|
__all__ = ["ReportLabPen"] |
|
|
|
|
|
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) |
|
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 |
|
|
|
|
|
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") |
|
|