122 lines
4.1 KiB
Python
122 lines
4.1 KiB
Python
#Copyright ReportLab Europe Ltd. 2000-2004
|
|
#see license.txt for license details
|
|
#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/test/test_pdfbase_pdfmetrics.py
|
|
#test_pdfbase_pdfmetrics_widths
|
|
"""
|
|
Various tests for PDF metrics.
|
|
|
|
The main test prints out a PDF documents enabling checking of widths of every
|
|
glyph in every standard font. Long!
|
|
"""
|
|
from reportlab.test import unittest
|
|
from reportlab.test.utils import makeSuiteForClasses, outputfile, printLocation
|
|
from reportlab.pdfbase import pdfmetrics
|
|
from reportlab.pdfbase import _fontdata
|
|
from reportlab.pdfgen.canvas import Canvas
|
|
from reportlab.lib import colors
|
|
|
|
verbose = 0
|
|
fontNamesToTest = _fontdata.standardFonts #[0:12] #leaves out Symbol and Dingbats for now
|
|
|
|
|
|
def decoratePage(c, header):
|
|
c.setFont('Helvetica-Oblique',10)
|
|
c.drawString(72, 800, header)
|
|
c.drawCentredString(297, 54, 'Page %d' % c.getPageNumber())
|
|
|
|
|
|
def makeWidthTestForAllGlyphs(canv, fontName, outlining=1):
|
|
"""New page, then runs down doing all the glyphs in one encoding"""
|
|
thisFont = pdfmetrics.getFont(fontName)
|
|
encName = thisFont.encName
|
|
canv.setFont('Helvetica-Bold', 12)
|
|
title = 'Glyph Metrics Test for font %s, ascent=%s, descent=%s, encoding=%s' % (fontName, str(thisFont.face.ascent), str(thisFont.face.descent), encName)
|
|
canv.drawString(80, 750, title)
|
|
canv.setFont('Helvetica-Oblique',10)
|
|
canv.drawCentredString(297, 54, 'Page %d' % canv.getPageNumber())
|
|
|
|
if outlining:
|
|
# put it in the outline
|
|
canv.bookmarkPage('GlyphWidths:' + fontName)
|
|
canv.addOutlineEntry(fontName,'GlyphWidths:' + fontName, level=1)
|
|
|
|
y = 720
|
|
widths = thisFont.widths
|
|
glyphNames = thisFont.encoding.vector
|
|
# need to get the right list of names for the font in question
|
|
for i in range(256):
|
|
if y < 72:
|
|
canv.showPage()
|
|
decoratePage(canv, title)
|
|
y = 750
|
|
glyphName = glyphNames[i]
|
|
if glyphName is not None:
|
|
canv.setFont('Helvetica', 10)
|
|
text = unicode(chr(i),encName).encode('utf8')*30
|
|
try:
|
|
w = canv.stringWidth(text, fontName, 10)
|
|
canv.drawString(80, y, '%03d %s w=%3d' % (i, glyphName, int((w/3.)*10)))
|
|
canv.setFont(fontName, 10)
|
|
canv.drawString(200, y, text)
|
|
|
|
# now work out width and put a red marker next to the end.
|
|
canv.setFillColor(colors.red)
|
|
canv.rect(200 + w, y-1, 5, 10, stroke=0, fill=1)
|
|
canv.setFillColor(colors.black)
|
|
except KeyError:
|
|
canv.drawString(200, y, 'Could not find glyph named "%s"' % glyphName)
|
|
y = y - 12
|
|
|
|
|
|
def makeTestDoc(fontNames):
|
|
filename = outputfile('test_pdfbase_pdfmetrics.pdf')
|
|
c = Canvas(filename)
|
|
c.bookmarkPage('Glyph Width Tests')
|
|
c.showOutline()
|
|
c.addOutlineEntry('Glyph Width Tests', 'Glyph Width Tests', level=0)
|
|
if verbose:
|
|
print # get it on a different line to the unittest log output.
|
|
for fontName in fontNames:
|
|
if verbose:
|
|
print 'width test for', fontName
|
|
|
|
makeWidthTestForAllGlyphs(c, fontName)
|
|
c.showPage()
|
|
c.save()
|
|
if verbose:
|
|
if verbose:
|
|
print 'saved',filename
|
|
|
|
|
|
class PDFMetricsTestCase(unittest.TestCase):
|
|
"Test various encodings used in PDF files."
|
|
|
|
def test0(self):
|
|
"Visual test for correct glyph widths"
|
|
makeTestDoc(fontNamesToTest)
|
|
|
|
|
|
def makeSuite():
|
|
return makeSuiteForClasses(PDFMetricsTestCase)
|
|
|
|
|
|
#noruntests
|
|
if __name__=='__main__':
|
|
usage = """Usage:
|
|
(1) test_pdfbase_pdfmetrics.py - makes doc for all standard fonts
|
|
(2) test_pdfbase_pdfmetrics.py fontname - " " for just one font."""
|
|
import sys
|
|
verbose = 1
|
|
# accept font names as arguments; otherwise it does the lot
|
|
if len(sys.argv) > 1:
|
|
for arg in sys.argv[1:]:
|
|
if not arg in fontNamesToTest:
|
|
print 'unknown font %s' % arg
|
|
print usage
|
|
sys.exit(0)
|
|
|
|
fontNamesToTest = sys.argv[1:]
|
|
|
|
unittest.TextTestRunner().run(makeSuite())
|
|
printLocation()
|