--- a/reportlab/pdfbase/pdfmetrics.py Fri Mar 02 15:35:43 2001 +0000
+++ b/reportlab/pdfbase/pdfmetrics.py Tue Mar 06 17:38:15 2001 +0000
@@ -1,335 +1,2706 @@
-#copyright ReportLab Inc. 2000
-#see license.txt for license details
-#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfbase/pdfmetrics.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/pdfbase/pdfmetrics.py,v 1.21 2001/03/01 00:32:41 rgbecker Exp $
-__version__=''' $Id: pdfmetrics.py,v 1.21 2001/03/01 00:32:41 rgbecker Exp $ '''
-__doc__="""This contains pre-canned text metrics for the PDFgen package, and may also
-be used for any other PIDDLE back ends or packages which use the standard
-Type 1 postscript fonts.
+# widths database for 14 standard fonts - faster to parse then AFM
+"""This provides the character widths database for calculating
+text metrics. Everything for the base 14 fonts is pre-computed
+and available in dictionaries and lists in this module. The
+machinery is also available to parse AFM files annd add new fonts
+and encodings of fonts at run-time.
+
+There are two steps to adding a new font. First, the width of each names
+glyph in the font must be added to the glyphs-by-name database. Then
+for a particular encoding of a font, # how to explain this.
+loadAFMFile() loads an AFM file, adding the glyph widths by name to the
+database.
+
+
+The static database portion of the file contains three dictionaries
+keyed on font names and leading to more data:
+ ascent_descent - ascent and descent for each font
+ widthsByName - glyph names and widths for each glyph in each font
+ encodings - encoding vectors for WinAnsiEncoding and MacRomanEncoding
+
+When the C accelerator module _rl_accel is not present, a dictionary
+widthsByOrdinal is populated each time a font is added. This has
+vectors of 256 elements and is the data used by the stringWidth function.
+When _rl_accel is present, it maintains a similar database for itself.
+
+"""
+# mapping of name to width array, starts empty until fonts are added
+# e.g. widths['Courier'] = [...600,600,600,...]
+widthsByOrdinal = {}
+fontsByName = {}
+# conditional import - try both import techniques, and set a flag
+try:
+ from reportlab.lib import _rl_accel
+ hasAccel = 1
+except ImportError:
+ try:
+ import _rl_accel
+ hasAccel = 1
+ except ImportError:
+ hasAccel = 0
+
+
+def addFont(font):
+ """This lets us use the optimized C stringWidth or pdfmetrics stringwidth
+ function, saving one method call over asking the fonts to do it. For
+ e.g. CID fonts, it falls back to asking the font itself."""
+ fontsByName[font.name] = font
+ if hasattr(font, 'getWidths'):
+ widthsByOrdinal[font.name] = font.getWidths()
+
+
+
+def stringWidth(text, fontName, fontSize):
+ try:
+ widths = widthsByOrdinal[fontName]
+ w = 0
+ for char in text:
+ w = w + widths[ord(char)]
+ return w*fontSize*0.001
+ except KeyError:
+ # CID Font? ask the font itself
+ font = fonts[fontName]
+ return font.stringWidth(text, fontSize)
+
+
+
+# this is a list of the standard 14 font names in Acrobat Reader
+standardEnglishFonts = [
+ 'Courier', 'Courier-Bold', 'Courier-Oblique', 'Courier-BoldOblique',
+ 'Helvetica', 'Helvetica-Bold', 'Helvetica-Oblique', 'Helvetica-BoldOblique',
+ 'Times-Roman', 'Times-Bold', 'Times-Italic', 'Times-BoldItalic',
+ 'Symbol','ZapfDingbats']
+
+# this lists the predefined font encodings - WinAnsi and MacRoman. We have
+# not added MacExpert - it's possible, but would complicate life and nobody
+# is asking. StandardEncoding means something special.
+
+encodings = {}
+encodings['WinAnsiEncoding'] = [
+ None, None, None, None, None, None, None, None, None, None, None, None,
+ None, None, None, None, None, None, None, None, None, None, None, None,
+ None, None, None, None, None, None, None, None, 'space', 'exclam',
+ 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand',
+ 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma',
+ 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
+ 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
+ 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+ 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+ 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+ 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
+ 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
+ 'asciitilde', 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin',
+ 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', 'circumflex',
+ 'perthousand', 'Scaron', 'guilsinglleft', 'OE', 'bullet', 'Zcaron',
+ 'bullet', 'bullet', 'quoteleft', 'quoteright', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash', 'tilde', 'trademark',
+ 'scaron', 'guilsinglright', 'oe', 'bullet', 'zcaron', 'Ydieresis',
+ 'space', 'exclamdown', 'cent', 'sterling', 'currency', 'yen', 'brokenbar',
+ 'section', 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft',
+ 'logicalnot', 'hyphen', 'registered', 'macron', 'degree', 'plusminus',
+ 'twosuperior', 'threesuperior', 'acute', 'mu', 'paragraph', 'periodcentered',
+ 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', 'onequarter',
+ 'onehalf', 'threequarters', 'questiondown', 'Agrave', 'Aacute',
+ 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'AE', 'Ccedilla',
+ 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Igrave', 'Iacute',
+ 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute',
+ 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', 'Ugrave',
+ 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 'germandbls',
+ 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 'aring', 'ae',
+ 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', 'igrave',
+ 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', 'oacute',
+ 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', 'ugrave', 'uacute',
+ 'ucircumflex', 'udieresis', 'yacute', 'thorn', 'ydieresis']
+
+encodings['MacRomanEncoding'] = [
+ None, None, None, None, None, None, None, None, None, None, None, None,
+ None, None, None, None, None, None, None, None, None, None, None, None,
+ None, None, None, None, None, None, None, None, 'space', 'exclam',
+ 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand',
+ 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma',
+ 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
+ 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
+ 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+ 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+ 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+ 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
+ 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
+ 'asciitilde', None, 'Adieresis', 'Aring', 'Ccedilla', 'Eacute',
+ 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex',
+ 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave',
+ 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex',
+ 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis',
+ 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger',
+ 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph',
+ 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
+ 'dieresis', None, 'AE', 'Oslash', None, 'plusminus', None, None, 'yen',
+ 'mu', None, None, None, None, None, 'ordfeminine', 'ordmasculine', None,
+ 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', None, 'florin',
+ None, None, 'guillemotleft', 'guillemotright', 'ellipsis', 'space', 'Agrave',
+ 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft',
+ 'quotedblright', 'quoteleft', 'quoteright', 'divide', None, 'ydieresis',
+ 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright',
+ 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase',
+ 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute',
+ 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave',
+ 'Oacute', 'Ocircumflex', None, 'Ograve', 'Uacute', 'Ucircumflex',
+ 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve',
+ 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron']
+
+
+encodings['iso8859-2'] = [
+ None, None, None, None, None, None, None, None, None, None, None, None,
+ None, None, None, None, None, None, None, None, None, None, None, None,
+ None, None, None, None, None, None, None, None, 'space', 'exclam',
+ 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand',
+ 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma',
+ 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
+ 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
+ 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+ 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+ 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+ 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
+ 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
+ 'asciitilde', 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin',
+ 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', 'circumflex',
+ 'perthousand', 'Scaron', 'guilsinglleft', 'sacute', 'tcaron', 'zcaron',
+ 'zacute', 'bullet', 'quoteleft', 'quoteright', 'quotedblleft',
+ 'quotedblright', 'bullet', 'endash', 'emdash', 'tilde', 'trademark',
+ 'scaron', 'guilsinglright', 'oe', 'bullet', 'zcaron', 'Ydieresis', 'space',
+ 'Aogonek', 'breve', 'Lslash', 'currency', 'Lcaron', 'Sacute', 'section',
+ 'dieresis', 'Scaron', 'Scedilla', 'Tcaron', 'Zacute', 'hyphen', 'Zcaron',
+ 'Zdotaccent', 'degree', 'aogonek', 'ogonek', 'lslash', 'acute', 'lcaron',
+ 'sacute', 'caron', 'cedilla', 'scaron', 'scedilla', 'tcaron', 'zacute',
+ 'hungarumlaut', 'zcaron', 'zdotaccent', 'Racute', 'Aacute', 'Acircumflex',
+ 'Abreve', 'Adieresis', 'Lacute', 'Cacute', 'Ccedilla', 'Ccaron', 'Eacute',
+ 'Eogonek', 'Edieresis', 'Ecaron', 'Iacute', 'Icircumflex', 'Dcaron',
+ 'Dcroat', 'Nacute', 'Ncaron', 'Oacute', 'Ocircumflex', 'Ohungarumlaut',
+ 'Odieresis', 'multiply', 'Rcaron', 'Uring', 'Uacute', 'Uhungarumlaut',
+ 'Udieresis', 'Yacute', 'Tcommaaccent', 'germandbls', 'racute', 'aacute',
+ 'acircumflex', 'abreve', 'adieresis', 'lacute', 'cacute', 'ccedilla',
+ 'ccaron', 'eacute', 'eogonek', 'edieresis', 'ecaron', 'iacute', 'icircumflex',
+ 'dcaron', 'dcroat', 'nacute', 'ncaron', 'oacute', 'ocircumflex', 'ohungarumlaut',
+ 'odieresis', 'divide', 'rcaron', 'uring', 'uacute', 'uhungarumlaut', 'udieresis',
+ 'yacute', 'tcommaaccent', 'dotaccent']
+
+ascent_descent = {
+ 'Courier': (629, -157),
+ 'Courier-Bold': (626, -142),
+ 'Courier-BoldOblique': (626, -142),
+ 'Courier-Oblique': (629, -157),
+ 'Helvetica': (718, -207),
+ 'Helvetica-Bold': (718, -207),
+ 'Helvetica-BoldOblique': (718, -207),
+ 'Helvetica-Oblique': (718, -207),
+ 'Times-Roman': (683, -217),
+ 'Times-Bold': (676, -205),
+ 'Times-BoldItalic': (699, -205),
+ 'Times-Italic': (683, -205),
+ 'Symbol': (0, 0),
+ 'ZapfDingbats': (0, 0)
+ }
+
+# nuild this up one entry at a time to stay under JPython's 64k limit.
+widthsByName = {}
+widthsByName['Helvetica'] = {'A': 667,
+ 'AE': 1000,
+ 'Aacute': 667,
+ 'Acircumflex': 667,
+ 'Adieresis': 667,
+ 'Agrave': 667,
+ 'Aring': 667,
+ 'Atilde': 667,
+ 'B': 667,
+ 'C': 722,
+ 'Ccedilla': 722,
+ 'D': 722,
+ 'E': 667,
+ 'Eacute': 667,
+ 'Ecircumflex': 667,
+ 'Edieresis': 667,
+ 'Egrave': 667,
+ 'Eth': 722,
+ 'Euro': 556,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'Iacute': 278,
+ 'Icircumflex': 278,
+ 'Idieresis': 278,
+ 'Igrave': 278,
+ 'J': 500,
+ 'K': 667,
+ 'L': 556,
+ 'Lslash': 556,
+ 'M': 833,
+ 'N': 722,
+ 'Ntilde': 722,
+ 'O': 778,
+ 'OE': 1000,
+ 'Oacute': 778,
+ 'Ocircumflex': 778,
+ 'Odieresis': 778,
+ 'Ograve': 778,
+ 'Oslash': 778,
+ 'Otilde': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'Scaron': 667,
+ 'T': 611,
+ 'Thorn': 667,
+ 'U': 722,
+ 'Uacute': 722,
+ 'Ucircumflex': 722,
+ 'Udieresis': 722,
+ 'Ugrave': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Yacute': 667,
+ 'Ydieresis': 667,
+ 'Z': 611,
+ 'Zcaron': 611,
+ 'a': 556,
+ 'aacute': 556,
+ 'acircumflex': 556,
+ 'acute': 333,
+ 'adieresis': 556,
+ 'ae': 889,
+ 'agrave': 556,
+ 'ampersand': 667,
+ 'aring': 556,
+ 'asciicircum': 469,
+ 'asciitilde': 584,
+ 'asterisk': 389,
+ 'at': 1015,
+ 'atilde': 556,
+ 'b': 556,
+ 'backslash': 278,
+ 'bar': 260,
+ 'braceleft': 334,
+ 'braceright': 334,
+ 'bracketleft': 278,
+ 'bracketright': 278,
+ 'breve': 333,
+ 'brokenbar': 260,
+ 'bullet': 350,
+ 'c': 500,
+ 'caron': 333,
+ 'ccedilla': 500,
+ 'cedilla': 333,
+ 'cent': 556,
+ 'circumflex': 333,
+ 'colon': 278,
+ 'comma': 278,
+ 'copyright': 737,
+ 'currency': 556,
+ 'd': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'degree': 400,
+ 'dieresis': 333,
+ 'divide': 584,
+ 'dollar': 556,
+ 'dotaccent': 333,
+ 'dotlessi': 278,
+ 'e': 556,
+ 'eacute': 556,
+ 'ecircumflex': 556,
+ 'edieresis': 556,
+ 'egrave': 556,
+ 'eight': 556,
+ 'ellipsis': 1000,
+ 'emdash': 1000,
+ 'endash': 556,
+ 'equal': 584,
+ 'eth': 556,
+ 'exclam': 278,
+ 'exclamdown': 333,
+ 'f': 278,
+ 'fi': 500,
+ 'five': 556,
+ 'fl': 500,
+ 'florin': 556,
+ 'four': 556,
+ 'fraction': 167,
+ 'g': 556,
+ 'germandbls': 611,
+ 'grave': 333,
+ 'greater': 584,
+ 'guillemotleft': 556,
+ 'guillemotright': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'h': 556,
+ 'hungarumlaut': 333,
+ 'hyphen': 333,
+ 'i': 222,
+ 'iacute': 278,
+ 'icircumflex': 278,
+ 'idieresis': 278,
+ 'igrave': 278,
+ 'j': 222,
+ 'k': 500,
+ 'l': 222,
+ 'less': 584,
+ 'logicalnot': 584,
+ 'lslash': 222,
+ 'm': 833,
+ 'macron': 333,
+ 'minus': 584,
+ 'mu': 556,
+ 'multiply': 584,
+ 'n': 556,
+ 'nine': 556,
+ 'ntilde': 556,
+ 'numbersign': 556,
+ 'o': 556,
+ 'oacute': 556,
+ 'ocircumflex': 556,
+ 'odieresis': 556,
+ 'oe': 944,
+ 'ogonek': 333,
+ 'ograve': 556,
+ 'one': 556,
+ 'onehalf': 834,
+ 'onequarter': 834,
+ 'onesuperior': 333,
+ 'ordfeminine': 370,
+ 'ordmasculine': 365,
+ 'oslash': 611,
+ 'otilde': 556,
+ 'p': 556,
+ 'paragraph': 537,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'percent': 889,
+ 'period': 278,
+ 'periodcentered': 278,
+ 'perthousand': 1000,
+ 'plus': 584,
+ 'plusminus': 584,
+ 'q': 556,
+ 'question': 556,
+ 'questiondown': 611,
+ 'quotedbl': 355,
+ 'quotedblbase': 333,
+ 'quotedblleft': 333,
+ 'quotedblright': 333,
+ 'quoteleft': 222,
+ 'quoteright': 222,
+ 'quotesinglbase': 222,
+ 'quotesingle': 191,
+ 'r': 333,
+ 'registered': 737,
+ 'ring': 333,
+ 's': 500,
+ 'scaron': 500,
+ 'section': 556,
+ 'semicolon': 278,
+ 'seven': 556,
+ 'six': 556,
+ 'slash': 278,
+ 'space': 278,
+ 'sterling': 556,
+ 't': 278,
+ 'thorn': 556,
+ 'three': 556,
+ 'threequarters': 834,
+ 'threesuperior': 333,
+ 'tilde': 333,
+ 'trademark': 1000,
+ 'two': 556,
+ 'twosuperior': 333,
+ 'u': 556,
+ 'uacute': 556,
+ 'ucircumflex': 556,
+ 'udieresis': 556,
+ 'ugrave': 556,
+ 'underscore': 556,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'yacute': 500,
+ 'ydieresis': 500,
+ 'yen': 556,
+ 'z': 500,
+ 'zcaron': 500,
+ 'zero': 556}
-Its main function is to let you work out the width of strings; it exposes a
-single function, stringWidth(text, fontName, fontSize), which works out the width of a
-string in the given font in points.
+widthsByName['Helvetica-Bold'] = {'A': 722,
+ 'AE': 1000,
+ 'Aacute': 722,
+ 'Acircumflex': 722,
+ 'Adieresis': 722,
+ 'Agrave': 722,
+ 'Aring': 722,
+ 'Atilde': 722,
+ 'B': 722,
+ 'C': 722,
+ 'Ccedilla': 722,
+ 'D': 722,
+ 'E': 667,
+ 'Eacute': 667,
+ 'Ecircumflex': 667,
+ 'Edieresis': 667,
+ 'Egrave': 667,
+ 'Eth': 722,
+ 'Euro': 556,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'Iacute': 278,
+ 'Icircumflex': 278,
+ 'Idieresis': 278,
+ 'Igrave': 278,
+ 'J': 556,
+ 'K': 722,
+ 'L': 611,
+ 'Lslash': 611,
+ 'M': 833,
+ 'N': 722,
+ 'Ntilde': 722,
+ 'O': 778,
+ 'OE': 1000,
+ 'Oacute': 778,
+ 'Ocircumflex': 778,
+ 'Odieresis': 778,
+ 'Ograve': 778,
+ 'Oslash': 778,
+ 'Otilde': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'Scaron': 667,
+ 'T': 611,
+ 'Thorn': 667,
+ 'U': 722,
+ 'Uacute': 722,
+ 'Ucircumflex': 722,
+ 'Udieresis': 722,
+ 'Ugrave': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Yacute': 667,
+ 'Ydieresis': 667,
+ 'Z': 611,
+ 'Zcaron': 611,
+ 'a': 556,
+ 'aacute': 556,
+ 'acircumflex': 556,
+ 'acute': 333,
+ 'adieresis': 556,
+ 'ae': 889,
+ 'agrave': 556,
+ 'ampersand': 722,
+ 'aring': 556,
+ 'asciicircum': 584,
+ 'asciitilde': 584,
+ 'asterisk': 389,
+ 'at': 975,
+ 'atilde': 556,
+ 'b': 611,
+ 'backslash': 278,
+ 'bar': 280,
+ 'braceleft': 389,
+ 'braceright': 389,
+ 'bracketleft': 333,
+ 'bracketright': 333,
+ 'breve': 333,
+ 'brokenbar': 280,
+ 'bullet': 350,
+ 'c': 556,
+ 'caron': 333,
+ 'ccedilla': 556,
+ 'cedilla': 333,
+ 'cent': 556,
+ 'circumflex': 333,
+ 'colon': 333,
+ 'comma': 278,
+ 'copyright': 737,
+ 'currency': 556,
+ 'd': 611,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'degree': 400,
+ 'dieresis': 333,
+ 'divide': 584,
+ 'dollar': 556,
+ 'dotaccent': 333,
+ 'dotlessi': 278,
+ 'e': 556,
+ 'eacute': 556,
+ 'ecircumflex': 556,
+ 'edieresis': 556,
+ 'egrave': 556,
+ 'eight': 556,
+ 'ellipsis': 1000,
+ 'emdash': 1000,
+ 'endash': 556,
+ 'equal': 584,
+ 'eth': 611,
+ 'exclam': 333,
+ 'exclamdown': 333,
+ 'f': 333,
+ 'fi': 611,
+ 'five': 556,
+ 'fl': 611,
+ 'florin': 556,
+ 'four': 556,
+ 'fraction': 167,
+ 'g': 611,
+ 'germandbls': 611,
+ 'grave': 333,
+ 'greater': 584,
+ 'guillemotleft': 556,
+ 'guillemotright': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'h': 611,
+ 'hungarumlaut': 333,
+ 'hyphen': 333,
+ 'i': 278,
+ 'iacute': 278,
+ 'icircumflex': 278,
+ 'idieresis': 278,
+ 'igrave': 278,
+ 'j': 278,
+ 'k': 556,
+ 'l': 278,
+ 'less': 584,
+ 'logicalnot': 584,
+ 'lslash': 278,
+ 'm': 889,
+ 'macron': 333,
+ 'minus': 584,
+ 'mu': 611,
+ 'multiply': 584,
+ 'n': 611,
+ 'nine': 556,
+ 'ntilde': 611,
+ 'numbersign': 556,
+ 'o': 611,
+ 'oacute': 611,
+ 'ocircumflex': 611,
+ 'odieresis': 611,
+ 'oe': 944,
+ 'ogonek': 333,
+ 'ograve': 611,
+ 'one': 556,
+ 'onehalf': 834,
+ 'onequarter': 834,
+ 'onesuperior': 333,
+ 'ordfeminine': 370,
+ 'ordmasculine': 365,
+ 'oslash': 611,
+ 'otilde': 611,
+ 'p': 611,
+ 'paragraph': 556,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'percent': 889,
+ 'period': 278,
+ 'periodcentered': 278,
+ 'perthousand': 1000,
+ 'plus': 584,
+ 'plusminus': 584,
+ 'q': 611,
+ 'question': 611,
+ 'questiondown': 611,
+ 'quotedbl': 474,
+ 'quotedblbase': 500,
+ 'quotedblleft': 500,
+ 'quotedblright': 500,
+ 'quoteleft': 278,
+ 'quoteright': 278,
+ 'quotesinglbase': 278,
+ 'quotesingle': 238,
+ 'r': 389,
+ 'registered': 737,
+ 'ring': 333,
+ 's': 556,
+ 'scaron': 556,
+ 'section': 556,
+ 'semicolon': 333,
+ 'seven': 556,
+ 'six': 556,
+ 'slash': 278,
+ 'space': 278,
+ 'sterling': 556,
+ 't': 333,
+ 'thorn': 611,
+ 'three': 556,
+ 'threequarters': 834,
+ 'threesuperior': 333,
+ 'tilde': 333,
+ 'trademark': 1000,
+ 'two': 556,
+ 'twosuperior': 333,
+ 'u': 611,
+ 'uacute': 611,
+ 'ucircumflex': 611,
+ 'udieresis': 611,
+ 'ugrave': 611,
+ 'underscore': 556,
+ 'v': 556,
+ 'w': 778,
+ 'x': 556,
+ 'y': 556,
+ 'yacute': 556,
+ 'ydieresis': 556,
+ 'yen': 556,
+ 'z': 500,
+ 'zcaron': 500,
+ 'zero': 556}
-The AFM loading stuff worked for me but is not being heavily tested, as pre-canning
-the widths for the standard 14 fonts in Acrobat Reader is so much more useful. One
-could easily extend it to get the exact bounding box for each characterm useful for
-kerning.
+widthsByName['Helvetica-Oblique'] = {'A': 667,
+ 'AE': 1000,
+ 'Aacute': 667,
+ 'Acircumflex': 667,
+ 'Adieresis': 667,
+ 'Agrave': 667,
+ 'Aring': 667,
+ 'Atilde': 667,
+ 'B': 667,
+ 'C': 722,
+ 'Ccedilla': 722,
+ 'D': 722,
+ 'E': 667,
+ 'Eacute': 667,
+ 'Ecircumflex': 667,
+ 'Edieresis': 667,
+ 'Egrave': 667,
+ 'Eth': 722,
+ 'Euro': 556,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'Iacute': 278,
+ 'Icircumflex': 278,
+ 'Idieresis': 278,
+ 'Igrave': 278,
+ 'J': 500,
+ 'K': 667,
+ 'L': 556,
+ 'Lslash': 556,
+ 'M': 833,
+ 'N': 722,
+ 'Ntilde': 722,
+ 'O': 778,
+ 'OE': 1000,
+ 'Oacute': 778,
+ 'Ocircumflex': 778,
+ 'Odieresis': 778,
+ 'Ograve': 778,
+ 'Oslash': 778,
+ 'Otilde': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'Scaron': 667,
+ 'T': 611,
+ 'Thorn': 667,
+ 'U': 722,
+ 'Uacute': 722,
+ 'Ucircumflex': 722,
+ 'Udieresis': 722,
+ 'Ugrave': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Yacute': 667,
+ 'Ydieresis': 667,
+ 'Z': 611,
+ 'Zcaron': 611,
+ 'a': 556,
+ 'aacute': 556,
+ 'acircumflex': 556,
+ 'acute': 333,
+ 'adieresis': 556,
+ 'ae': 889,
+ 'agrave': 556,
+ 'ampersand': 667,
+ 'aring': 556,
+ 'asciicircum': 469,
+ 'asciitilde': 584,
+ 'asterisk': 389,
+ 'at': 1015,
+ 'atilde': 556,
+ 'b': 556,
+ 'backslash': 278,
+ 'bar': 260,
+ 'braceleft': 334,
+ 'braceright': 334,
+ 'bracketleft': 278,
+ 'bracketright': 278,
+ 'breve': 333,
+ 'brokenbar': 260,
+ 'bullet': 350,
+ 'c': 500,
+ 'caron': 333,
+ 'ccedilla': 500,
+ 'cedilla': 333,
+ 'cent': 556,
+ 'circumflex': 333,
+ 'colon': 278,
+ 'comma': 278,
+ 'copyright': 737,
+ 'currency': 556,
+ 'd': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'degree': 400,
+ 'dieresis': 333,
+ 'divide': 584,
+ 'dollar': 556,
+ 'dotaccent': 333,
+ 'dotlessi': 278,
+ 'e': 556,
+ 'eacute': 556,
+ 'ecircumflex': 556,
+ 'edieresis': 556,
+ 'egrave': 556,
+ 'eight': 556,
+ 'ellipsis': 1000,
+ 'emdash': 1000,
+ 'endash': 556,
+ 'equal': 584,
+ 'eth': 556,
+ 'exclam': 278,
+ 'exclamdown': 333,
+ 'f': 278,
+ 'fi': 500,
+ 'five': 556,
+ 'fl': 500,
+ 'florin': 556,
+ 'four': 556,
+ 'fraction': 167,
+ 'g': 556,
+ 'germandbls': 611,
+ 'grave': 333,
+ 'greater': 584,
+ 'guillemotleft': 556,
+ 'guillemotright': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'h': 556,
+ 'hungarumlaut': 333,
+ 'hyphen': 333,
+ 'i': 222,
+ 'iacute': 278,
+ 'icircumflex': 278,
+ 'idieresis': 278,
+ 'igrave': 278,
+ 'j': 222,
+ 'k': 500,
+ 'l': 222,
+ 'less': 584,
+ 'logicalnot': 584,
+ 'lslash': 222,
+ 'm': 833,
+ 'macron': 333,
+ 'minus': 584,
+ 'mu': 556,
+ 'multiply': 584,
+ 'n': 556,
+ 'nine': 556,
+ 'ntilde': 556,
+ 'numbersign': 556,
+ 'o': 556,
+ 'oacute': 556,
+ 'ocircumflex': 556,
+ 'odieresis': 556,
+ 'oe': 944,
+ 'ogonek': 333,
+ 'ograve': 556,
+ 'one': 556,
+ 'onehalf': 834,
+ 'onequarter': 834,
+ 'onesuperior': 333,
+ 'ordfeminine': 370,
+ 'ordmasculine': 365,
+ 'oslash': 611,
+ 'otilde': 556,
+ 'p': 556,
+ 'paragraph': 537,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'percent': 889,
+ 'period': 278,
+ 'periodcentered': 278,
+ 'perthousand': 1000,
+ 'plus': 584,
+ 'plusminus': 584,
+ 'q': 556,
+ 'question': 556,
+ 'questiondown': 611,
+ 'quotedbl': 355,
+ 'quotedblbase': 333,
+ 'quotedblleft': 333,
+ 'quotedblright': 333,
+ 'quoteleft': 222,
+ 'quoteright': 222,
+ 'quotesinglbase': 222,
+ 'quotesingle': 191,
+ 'r': 333,
+ 'registered': 737,
+ 'ring': 333,
+ 's': 500,
+ 'scaron': 500,
+ 'section': 556,
+ 'semicolon': 278,
+ 'seven': 556,
+ 'six': 556,
+ 'slash': 278,
+ 'space': 278,
+ 'sterling': 556,
+ 't': 278,
+ 'thorn': 556,
+ 'three': 556,
+ 'threequarters': 834,
+ 'threesuperior': 333,
+ 'tilde': 333,
+ 'trademark': 1000,
+ 'two': 556,
+ 'twosuperior': 333,
+ 'u': 556,
+ 'uacute': 556,
+ 'ucircumflex': 556,
+ 'udieresis': 556,
+ 'ugrave': 556,
+ 'underscore': 556,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'yacute': 500,
+ 'ydieresis': 500,
+ 'yen': 556,
+ 'z': 500,
+ 'zcaron': 500,
+ 'zero': 556}
+
-The ascent_descent attribute of the module is a dictionary mapping font names
-(with the proper Postscript capitalisation) to ascents and descents. I ought
-to sort out the fontname case issue and the resolution of PIDDLE fonts to
-Postscript font names within this module, but have not yet done so.
-"""
-import string
-import os
-from reportlab.lib.logger import warnOnce, infoOnce
-DEFAULT_ENCODING='WinAnsiEncoding'
-AFMDIR = 'C:\\code\\users\\andy\\fontembed'
-
-StandardEnglishFonts = [
- 'Courier', 'Courier-Bold', 'Courier-Oblique', 'Courier-BoldOblique',
- 'Helvetica', 'Helvetica-Bold', 'Helvetica-Oblique',
- 'Helvetica-BoldOblique',
- 'Times-Roman', 'Times-Bold', 'Times-Italic', 'Times-BoldItalic',
- 'Symbol','ZapfDingbats']
-
-##############################################################
-#
-# PDF Metrics
-# This is a preamble to give us a stringWidth function.
-# loads and caches AFM files, but won't need to as the
-# standard fonts are there already
-##############################################################
-
-macromanencodingwidths={
- 'courier': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 0, 600, 0, 0, 600, 600, 0, 0, 0, 0, 0, 600, 600, 0, 600, 600, 600, 600, 600, 0, 600, 0, 0, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600],
- 'courier-bold': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 0, 600, 0, 0, 600, 600, 0, 0, 0, 0, 0, 600, 600, 0, 600, 600, 600, 600, 600, 0, 600, 0, 0, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600],
- 'courier-boldoblique': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 0, 600, 0, 0, 600, 600, 0, 0, 0, 0, 0, 600, 600, 0, 600, 600, 600, 600, 600, 0, 600, 0, 0, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600],
- 'courier-oblique': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 0, 600, 0, 0, 600, 600, 0, 0, 0, 0, 0, 600, 600, 0, 600, 600, 600, 600, 600, 0, 600, 0, 0, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600],
- 'helvetica': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 0, 667, 667, 722, 667, 722, 778, 722, 556, 556, 556, 556, 556, 556, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 400, 556, 556, 556, 350, 537, 611, 737, 737, 1000, 333, 333, 0, 1000, 778, 0, 584, 0, 0, 556, 556, 0, 0, 0, 0, 0, 370, 365, 0, 889, 611, 611, 333, 584, 0, 556, 0, 0, 556, 556, 1000, 0, 667, 667, 778, 1000, 944, 556, 1000, 333, 333, 222, 222, 584, 0, 500, 667, 167, 556, 333, 333, 500, 500, 556, 278, 222, 333, 1000, 667, 667, 667, 667, 667, 278, 278, 278, 278, 778, 778, 0, 778, 722, 722, 722, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667],
- 'helvetica-bold': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 0, 722, 722, 722, 667, 722, 778, 722, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 556, 400, 556, 556, 556, 350, 556, 611, 737, 737, 1000, 333, 333, 0, 1000, 778, 0, 584, 0, 0, 556, 611, 0, 0, 0, 0, 0, 370, 365, 0, 889, 611, 611, 333, 584, 0, 556, 0, 0, 556, 556, 1000, 0, 722, 722, 778, 1000, 944, 556, 1000, 500, 500, 278, 278, 584, 0, 556, 667, 167, 556, 333, 333, 611, 611, 556, 278, 278, 500, 1000, 722, 667, 722, 667, 667, 278, 278, 278, 278, 778, 778, 0, 778, 722, 722, 722, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667],
- 'helvetica-boldoblique': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 0, 722, 722, 722, 667, 722, 778, 722, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 556, 400, 556, 556, 556, 350, 556, 611, 737, 737, 1000, 333, 333, 0, 1000, 778, 0, 584, 0, 0, 556, 611, 0, 0, 0, 0, 0, 370, 365, 0, 889, 611, 611, 333, 584, 0, 556, 0, 0, 556, 556, 1000, 0, 722, 722, 778, 1000, 944, 556, 1000, 500, 500, 278, 278, 584, 0, 556, 667, 167, 556, 333, 333, 611, 611, 556, 278, 278, 500, 1000, 722, 667, 722, 667, 667, 278, 278, 278, 278, 778, 778, 0, 778, 722, 722, 722, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667],
- 'helvetica-oblique': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 0, 667, 667, 722, 667, 722, 778, 722, 556, 556, 556, 556, 556, 556, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 400, 556, 556, 556, 350, 537, 611, 737, 737, 1000, 333, 333, 0, 1000, 778, 0, 584, 0, 0, 556, 556, 0, 0, 0, 0, 0, 370, 365, 0, 889, 611, 611, 333, 584, 0, 556, 0, 0, 556, 556, 1000, 0, 667, 667, 778, 1000, 944, 556, 1000, 333, 333, 222, 222, 584, 0, 500, 667, 167, 556, 333, 333, 500, 500, 556, 278, 222, 333, 1000, 667, 667, 667, 667, 667, 278, 278, 278, 278, 778, 778, 0, 778, 722, 722, 722, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667],
- 'symbol': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 333, 0, 500, 0, 833, 778, 0, 333, 333, 0, 549, 250, 0, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 549, 549, 549, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 0, 333, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 200, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 713, 0, 500, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 790],
- 'times-bold': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 333, 555, 500, 500, 1000, 833, 278, 333, 333, 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 930, 722, 667, 722, 722, 667, 611, 778, 778, 389, 500, 778, 667, 944, 722, 778, 611, 778, 722, 556, 667, 722, 722, 1000, 722, 722, 667, 333, 278, 333, 581, 500, 333, 500, 556, 444, 556, 444, 333, 500, 556, 278, 333, 556, 278, 833, 556, 500, 556, 556, 444, 389, 333, 556, 500, 722, 500, 500, 444, 394, 220, 394, 520, 0, 722, 722, 722, 667, 722, 778, 722, 500, 500, 500, 500, 500, 500, 444, 444, 444, 444, 444, 278, 278, 278, 278, 556, 500, 500, 500, 500, 500, 556, 556, 556, 556, 500, 400, 500, 500, 500, 350, 540, 556, 747, 747, 1000, 333, 333, 0, 1000, 778, 0, 570, 0, 0, 500, 556, 0, 0, 0, 0, 0, 300, 330, 0, 722, 500, 500, 333, 570, 0, 500, 0, 0, 500, 500, 1000, 0, 722, 722, 778, 1000, 722, 500, 1000, 500, 500, 333, 333, 570, 0, 500, 722, 167, 500, 333, 333, 556, 556, 500, 250, 333, 500, 1000, 722, 667, 722, 667, 667, 389, 389, 389, 389, 778, 778, 0, 778, 722, 722, 722, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 611],
- 'times-bolditalic': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 389, 555, 500, 500, 833, 778, 278, 333, 333, 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 832, 667, 667, 667, 722, 667, 667, 722, 778, 389, 500, 667, 611, 889, 722, 722, 611, 722, 667, 556, 611, 722, 667, 889, 667, 611, 611, 333, 278, 333, 570, 500, 333, 500, 500, 444, 500, 444, 333, 500, 556, 278, 278, 500, 278, 778, 556, 500, 500, 500, 389, 389, 278, 556, 444, 667, 500, 444, 389, 348, 220, 348, 570, 0, 667, 667, 667, 667, 722, 722, 722, 500, 500, 500, 500, 500, 500, 444, 444, 444, 444, 444, 278, 278, 278, 278, 556, 500, 500, 500, 500, 500, 556, 556, 556, 556, 500, 400, 500, 500, 500, 350, 500, 500, 747, 747, 1000, 333, 333, 0, 944, 722, 0, 570, 0, 0, 500, 576, 0, 0, 0, 0, 0, 266, 300, 0, 722, 500, 500, 389, 606, 0, 500, 0, 0, 500, 500, 1000, 0, 667, 667, 722, 944, 722, 500, 1000, 500, 500, 333, 333, 570, 0, 444, 611, 167, 500, 333, 333, 556, 556, 500, 250, 333, 500, 1000, 667, 667, 667, 667, 667, 389, 389, 389, 389, 722, 722, 0, 722, 722, 722, 722, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 611],
- 'times-italic': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 333, 420, 500, 500, 833, 778, 214, 333, 333, 500, 675, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 675, 675, 675, 500, 920, 611, 611, 667, 722, 611, 611, 722, 722, 333, 444, 667, 556, 833, 667, 722, 611, 722, 611, 500, 556, 722, 611, 833, 611, 556, 556, 389, 278, 389, 422, 500, 333, 500, 500, 444, 500, 444, 278, 500, 500, 278, 278, 444, 278, 722, 500, 500, 500, 500, 389, 389, 278, 500, 444, 667, 444, 444, 389, 400, 275, 400, 541, 0, 611, 611, 667, 611, 667, 722, 722, 500, 500, 500, 500, 500, 500, 444, 444, 444, 444, 444, 278, 278, 278, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 400, 500, 500, 500, 350, 523, 500, 760, 760, 980, 333, 333, 0, 889, 722, 0, 675, 0, 0, 500, 500, 0, 0, 0, 0, 0, 276, 310, 0, 667, 500, 500, 389, 675, 0, 500, 0, 0, 500, 500, 889, 0, 611, 611, 722, 944, 667, 500, 889, 556, 556, 333, 333, 675, 0, 444, 556, 167, 500, 333, 333, 500, 500, 500, 250, 333, 556, 1000, 611, 611, 611, 611, 611, 333, 333, 333, 333, 722, 722, 0, 722, 722, 722, 722, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 611],
- 'times-roman': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 333, 408, 500, 500, 833, 778, 180, 333, 333, 500, 564, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 556, 722, 722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722, 611, 333, 278, 333, 469, 500, 333, 444, 500, 444, 500, 444, 333, 500, 500, 278, 278, 500, 278, 778, 500, 500, 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480, 200, 480, 541, 0, 722, 722, 667, 611, 722, 722, 722, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 278, 278, 278, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 400, 500, 500, 500, 350, 453, 500, 760, 760, 980, 333, 333, 0, 889, 722, 0, 564, 0, 0, 500, 500, 0, 0, 0, 0, 0, 276, 310, 0, 667, 500, 444, 333, 564, 0, 500, 0, 0, 500, 500, 1000, 0, 722, 722, 722, 889, 722, 500, 1000, 444, 444, 333, 333, 564, 0, 500, 722, 167, 500, 333, 333, 556, 556, 500, 250, 333, 444, 1000, 722, 611, 722, 611, 611, 333, 333, 333, 333, 722, 722, 0, 722, 722, 722, 722, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 556],
- 'zapfdingbats': [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,278,974,961,974,980,719,789,790,791,690,960,939,549,855,911,933,911,945,974,755,846,762,761,571,677,763,760,759,754,494,552,537,577,692,786,788,788,790,793,794,816,823,789,841,823,833,816,831,923,744,723,749,790,792,695,776,768,792,759,707,708,682,701,826,815,789,789,707,687,696,689,786,787,713,791,785,791,873,761,762,762,759,759,892,892,788,784,438,138,277,415,392,392,668,668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,732,544,544,910,667,760,760,776,595,694,626,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,894,838,1016,458,748,924,748,918,927,928,928,834,873,828,924,924,917,930,931,463,883,836,836,867,867,696,696,874,0,874,760,946,771,865,771,888,967,888,831,873,927,970,234,0]
- }
-
-winansiencodingwidths={
- 'courier': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600],
- 'courier-bold': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600],
- 'courier-boldoblique': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600],
- 'courier-oblique': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 0, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 0, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600],
- 'helvetica': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 0, 0, 0, 222, 556, 333, 1000, 556, 556, 333, 1000, 667, 333, 1000, 0, 611, 0, 0, 222, 222, 333, 333, 350, 556, 1000, 333, 1000, 500, 333, 944, 0, 500, 667, 0, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 0, 737, 333, 400, 584, 333, 333, 333, 556, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 584, 611, 556, 556, 556, 556, 500, 556, 500],
- 'helvetica-bold': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 0, 0, 0, 278, 556, 500, 1000, 556, 556, 333, 1000, 667, 333, 1000, 0, 611, 0, 0, 278, 278, 500, 500, 350, 556, 1000, 333, 1000, 556, 333, 944, 0, 500, 667, 0, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 0, 737, 333, 400, 584, 333, 333, 333, 611, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 584, 611, 611, 611, 611, 611, 556, 611, 556],
- 'helvetica-boldoblique': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 0, 0, 0, 278, 556, 500, 1000, 556, 556, 333, 1000, 667, 333, 1000, 0, 611, 0, 0, 278, 278, 500, 500, 350, 556, 1000, 333, 1000, 556, 333, 944, 0, 500, 667, 0, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 0, 737, 333, 400, 584, 333, 333, 333, 611, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 584, 611, 611, 611, 611, 611, 556, 611, 556],
- 'helvetica-oblique': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 0, 0, 0, 222, 556, 333, 1000, 556, 556, 333, 1000, 667, 333, 1000, 0, 611, 0, 0, 222, 222, 333, 333, 350, 556, 1000, 333, 1000, 500, 333, 944, 0, 500, 667, 0, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 0, 737, 333, 400, 584, 333, 333, 333, 556, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 584, 611, 556, 556, 556, 556, 500, 556, 500],
- 'symbol': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 333, 0, 500, 0, 833, 778, 0, 333, 333, 0, 549, 250, 0, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 549, 549, 549, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 0, 333, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 200, 480, 0, 0, 750, 0, 0, 500, 0, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 713, 0, 0, 0, 400, 549, 0, 0, 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 790],
- 'times-bold': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 333, 555, 500, 500, 1000, 833, 278, 333, 333, 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 930, 722, 667, 722, 722, 667, 611, 778, 778, 389, 500, 778, 667, 944, 722, 778, 611, 778, 722, 556, 667, 722, 722, 1000, 722, 722, 667, 333, 278, 333, 581, 500, 333, 500, 556, 444, 556, 444, 333, 500, 556, 278, 333, 556, 278, 833, 556, 500, 556, 556, 444, 389, 333, 556, 500, 722, 500, 500, 444, 394, 220, 394, 520, 0, 0, 0, 333, 500, 500, 1000, 500, 500, 333, 1000, 556, 333, 1000, 0, 667, 0, 0, 333, 333, 500, 500, 350, 500, 1000, 333, 1000, 389, 333, 722, 0, 444, 722, 0, 333, 500, 500, 500, 500, 220, 500, 333, 747, 300, 500, 570, 0, 747, 333, 400, 570, 300, 300, 333, 556, 540, 250, 333, 300, 330, 500, 750, 750, 750, 500, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 389, 389, 389, 389, 722, 722, 778, 778, 778, 778, 778, 570, 778, 722, 722, 722, 722, 722, 611, 556, 500, 500, 500, 500, 500, 500, 722, 444, 444, 444, 444, 444, 278, 278, 278, 278, 500, 556, 500, 500, 500, 500, 500, 570, 500, 556, 556, 556, 556, 500, 556, 500],
- 'times-bolditalic': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 389, 555, 500, 500, 833, 778, 278, 333, 333, 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 832, 667, 667, 667, 722, 667, 667, 722, 778, 389, 500, 667, 611, 889, 722, 722, 611, 722, 667, 556, 611, 722, 667, 889, 667, 611, 611, 333, 278, 333, 570, 500, 333, 500, 500, 444, 500, 444, 333, 500, 556, 278, 278, 500, 278, 778, 556, 500, 500, 500, 389, 389, 278, 556, 444, 667, 500, 444, 389, 348, 220, 348, 570, 0, 0, 0, 333, 500, 500, 1000, 500, 500, 333, 1000, 556, 333, 944, 0, 611, 0, 0, 333, 333, 500, 500, 350, 500, 1000, 333, 1000, 389, 333, 722, 0, 389, 611, 0, 389, 500, 500, 500, 500, 220, 500, 333, 747, 266, 500, 606, 0, 747, 333, 400, 570, 300, 300, 333, 576, 500, 250, 333, 300, 300, 500, 750, 750, 750, 500, 667, 667, 667, 667, 667, 667, 944, 667, 667, 667, 667, 667, 389, 389, 389, 389, 722, 722, 722, 722, 722, 722, 722, 570, 722, 722, 722, 722, 722, 611, 611, 500, 500, 500, 500, 500, 500, 500, 722, 444, 444, 444, 444, 444, 278, 278, 278, 278, 500, 556, 500, 500, 500, 500, 500, 570, 500, 556, 556, 556, 556, 444, 500, 444],
- 'times-italic': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 333, 420, 500, 500, 833, 778, 214, 333, 333, 500, 675, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 675, 675, 675, 500, 920, 611, 611, 667, 722, 611, 611, 722, 722, 333, 444, 667, 556, 833, 667, 722, 611, 722, 611, 500, 556, 722, 611, 833, 611, 556, 556, 389, 278, 389, 422, 500, 333, 500, 500, 444, 500, 444, 278, 500, 500, 278, 278, 444, 278, 722, 500, 500, 500, 500, 389, 389, 278, 500, 444, 667, 444, 444, 389, 400, 275, 400, 541, 0, 0, 0, 333, 500, 556, 889, 500, 500, 333, 1000, 500, 333, 944, 0, 556, 0, 0, 333, 333, 556, 556, 350, 500, 889, 333, 980, 389, 333, 667, 0, 389, 556, 0, 389, 500, 500, 500, 500, 275, 500, 333, 760, 276, 500, 675, 0, 760, 333, 400, 675, 300, 300, 333, 500, 523, 250, 333, 300, 310, 500, 750, 750, 750, 500, 611, 611, 611, 611, 611, 611, 889, 667, 611, 611, 611, 611, 333, 333, 333, 333, 722, 667, 722, 722, 722, 722, 722, 675, 722, 722, 722, 722, 722, 556, 611, 500, 500, 500, 500, 500, 500, 500, 667, 444, 444, 444, 444, 444, 278, 278, 278, 278, 500, 500, 500, 500, 500, 500, 500, 675, 500, 500, 500, 500, 500, 444, 500, 444],
- 'times-roman': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 333, 408, 500, 500, 833, 778, 180, 333, 333, 500, 564, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 556, 722, 722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722, 611, 333, 278, 333, 469, 500, 333, 444, 500, 444, 500, 444, 333, 500, 500, 278, 278, 500, 278, 778, 500, 500, 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480, 200, 480, 541, 0, 0, 0, 333, 500, 444, 1000, 500, 500, 333, 1000, 556, 333, 889, 0, 611, 0, 0, 333, 333, 444, 444, 350, 500, 1000, 333, 980, 389, 333, 722, 0, 444, 722, 0, 333, 500, 500, 500, 500, 200, 500, 333, 760, 276, 500, 564, 0, 760, 333, 400, 564, 300, 300, 333, 500, 453, 250, 333, 300, 310, 500, 750, 750, 750, 444, 722, 722, 722, 722, 722, 722, 889, 667, 611, 611, 611, 611, 333, 333, 333, 333, 722, 722, 722, 722, 722, 722, 722, 564, 722, 722, 722, 722, 722, 722, 556, 500, 444, 444, 444, 444, 444, 444, 667, 444, 444, 444, 444, 444, 278, 278, 278, 278, 500, 500, 500, 500, 500, 500, 500, 564, 500, 500, 500, 500, 500, 500, 500, 500],
- 'zapfdingbats': [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,278,974,961,974,980,719,789,790,791,690,960,939,549,855,911,933,911,945,974,755,846,762,761,571,677,763,760,759,754,494,552,537,577,692,786,788,788,790,793,794,816,823,789,841,823,833,816,831,923,744,723,749,790,792,695,776,768,792,759,707,708,682,701,826,815,789,789,707,687,696,689,786,787,713,791,785,791,873,761,762,762,759,759,892,892,788,784,438,138,277,415,392,392,668,668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,732,544,544,910,667,760,760,776,595,694,626,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,894,838,1016,458,748,924,748,918,927,928,928,834,873,828,924,924,917,930,931,463,883,836,836,867,867,696,696,874,0,874,760,946,771,865,771,888,967,888,831,873,927,970,234,0]
- }
-
-widths={
- 'MacRomanEncoding': macromanencodingwidths , 'WinAnsiEncoding': winansiencodingwidths
- }
-
-#HACK to get proper bullet metrics - don't know why they are zero!
-winansiencodingwidths['courier'][129] = 6
+widthsByName['Helvetica-BoldOblique'] = {'A': 722,
+ 'AE': 1000,
+ 'Aacute': 722,
+ 'Acircumflex': 722,
+ 'Adieresis': 722,
+ 'Agrave': 722,
+ 'Aring': 722,
+ 'Atilde': 722,
+ 'B': 722,
+ 'C': 722,
+ 'Ccedilla': 722,
+ 'D': 722,
+ 'E': 667,
+ 'Eacute': 667,
+ 'Ecircumflex': 667,
+ 'Edieresis': 667,
+ 'Egrave': 667,
+ 'Eth': 722,
+ 'Euro': 556,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'Iacute': 278,
+ 'Icircumflex': 278,
+ 'Idieresis': 278,
+ 'Igrave': 278,
+ 'J': 556,
+ 'K': 722,
+ 'L': 611,
+ 'Lslash': 611,
+ 'M': 833,
+ 'N': 722,
+ 'Ntilde': 722,
+ 'O': 778,
+ 'OE': 1000,
+ 'Oacute': 778,
+ 'Ocircumflex': 778,
+ 'Odieresis': 778,
+ 'Ograve': 778,
+ 'Oslash': 778,
+ 'Otilde': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'Scaron': 667,
+ 'T': 611,
+ 'Thorn': 667,
+ 'U': 722,
+ 'Uacute': 722,
+ 'Ucircumflex': 722,
+ 'Udieresis': 722,
+ 'Ugrave': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Yacute': 667,
+ 'Ydieresis': 667,
+ 'Z': 611,
+ 'Zcaron': 611,
+ 'a': 556,
+ 'aacute': 556,
+ 'acircumflex': 556,
+ 'acute': 333,
+ 'adieresis': 556,
+ 'ae': 889,
+ 'agrave': 556,
+ 'ampersand': 722,
+ 'aring': 556,
+ 'asciicircum': 584,
+ 'asciitilde': 584,
+ 'asterisk': 389,
+ 'at': 975,
+ 'atilde': 556,
+ 'b': 611,
+ 'backslash': 278,
+ 'bar': 280,
+ 'braceleft': 389,
+ 'braceright': 389,
+ 'bracketleft': 333,
+ 'bracketright': 333,
+ 'breve': 333,
+ 'brokenbar': 280,
+ 'bullet': 350,
+ 'c': 556,
+ 'caron': 333,
+ 'ccedilla': 556,
+ 'cedilla': 333,
+ 'cent': 556,
+ 'circumflex': 333,
+ 'colon': 333,
+ 'comma': 278,
+ 'copyright': 737,
+ 'currency': 556,
+ 'd': 611,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'degree': 400,
+ 'dieresis': 333,
+ 'divide': 584,
+ 'dollar': 556,
+ 'dotaccent': 333,
+ 'dotlessi': 278,
+ 'e': 556,
+ 'eacute': 556,
+ 'ecircumflex': 556,
+ 'edieresis': 556,
+ 'egrave': 556,
+ 'eight': 556,
+ 'ellipsis': 1000,
+ 'emdash': 1000,
+ 'endash': 556,
+ 'equal': 584,
+ 'eth': 611,
+ 'exclam': 333,
+ 'exclamdown': 333,
+ 'f': 333,
+ 'fi': 611,
+ 'five': 556,
+ 'fl': 611,
+ 'florin': 556,
+ 'four': 556,
+ 'fraction': 167,
+ 'g': 611,
+ 'germandbls': 611,
+ 'grave': 333,
+ 'greater': 584,
+ 'guillemotleft': 556,
+ 'guillemotright': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'h': 611,
+ 'hungarumlaut': 333,
+ 'hyphen': 333,
+ 'i': 278,
+ 'iacute': 278,
+ 'icircumflex': 278,
+ 'idieresis': 278,
+ 'igrave': 278,
+ 'j': 278,
+ 'k': 556,
+ 'l': 278,
+ 'less': 584,
+ 'logicalnot': 584,
+ 'lslash': 278,
+ 'm': 889,
+ 'macron': 333,
+ 'minus': 584,
+ 'mu': 611,
+ 'multiply': 584,
+ 'n': 611,
+ 'nine': 556,
+ 'ntilde': 611,
+ 'numbersign': 556,
+ 'o': 611,
+ 'oacute': 611,
+ 'ocircumflex': 611,
+ 'odieresis': 611,
+ 'oe': 944,
+ 'ogonek': 333,
+ 'ograve': 611,
+ 'one': 556,
+ 'onehalf': 834,
+ 'onequarter': 834,
+ 'onesuperior': 333,
+ 'ordfeminine': 370,
+ 'ordmasculine': 365,
+ 'oslash': 611,
+ 'otilde': 611,
+ 'p': 611,
+ 'paragraph': 556,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'percent': 889,
+ 'period': 278,
+ 'periodcentered': 278,
+ 'perthousand': 1000,
+ 'plus': 584,
+ 'plusminus': 584,
+ 'q': 611,
+ 'question': 611,
+ 'questiondown': 611,
+ 'quotedbl': 474,
+ 'quotedblbase': 500,
+ 'quotedblleft': 500,
+ 'quotedblright': 500,
+ 'quoteleft': 278,
+ 'quoteright': 278,
+ 'quotesinglbase': 278,
+ 'quotesingle': 238,
+ 'r': 389,
+ 'registered': 737,
+ 'ring': 333,
+ 's': 556,
+ 'scaron': 556,
+ 'section': 556,
+ 'semicolon': 333,
+ 'seven': 556,
+ 'six': 556,
+ 'slash': 278,
+ 'space': 278,
+ 'sterling': 556,
+ 't': 333,
+ 'thorn': 611,
+ 'three': 556,
+ 'threequarters': 834,
+ 'threesuperior': 333,
+ 'tilde': 333,
+ 'trademark': 1000,
+ 'two': 556,
+ 'twosuperior': 333,
+ 'u': 611,
+ 'uacute': 611,
+ 'ucircumflex': 611,
+ 'udieresis': 611,
+ 'ugrave': 611,
+ 'underscore': 556,
+ 'v': 556,
+ 'w': 778,
+ 'x': 556,
+ 'y': 556,
+ 'yacute': 556,
+ 'ydieresis': 556,
+ 'yen': 556,
+ 'z': 500,
+ 'zcaron': 500,
+ 'zero': 556}
-ascent_descent = {'courier': (629, -157), 'courier-bold': (626, -142), 'courier-boldoblique': (626, -142), 'courier-oblique': (629, -157), 'helvetica': (718, -207), 'helvetica-bold': (718, -207), 'helvetica-boldoblique': (718, -207), 'helvetica-oblique': (718, -207), 'symbol': (0, 0), 'times-bold': (676, -205), 'times-bolditalic': (699, -205), 'times-italic': (683, -205), 'times-roman': (683, -217), 'zapfdingbats': (0, 0)}
-try:
- try:
- from reportlab.lib import _rl_accel
- except ImportError, errMsg:
- if str(errMsg)!='cannot import name _rl_accel': raise
- import _rl_accel
- _stringWidth = _rl_accel.stringWidth
-except ImportError, errMsg:
- if str(errMsg)!='No module named _rl_accel': raise
- _stringWidth = None
-
- ####################################################################################
- #
- # Everything below here is concerned with parsing AFM files and adding metrics
- # for new fonts at runtime.
- #
- ####################################################################################
+# Courier can be expressed more compactly!
+_w = {}
+for charname in widthsByName['Helvetica'].keys():
+ _w[charname] = 600
+widthsByName['Courier'] = _w
+widthsByName['Courier-Bold'] = _w
+widthsByName['Courier-Oblique'] = _w
+widthsByName['Courier-BoldOblique'] = _w
-WinAnsiNames = [None, None, None, None, None, None, None, None, None, None, None, None,
- None, None, None, None, None, None, None, None, None, None, None, None,
- None, None, None, None, None, None, None, None, 'space', 'exclam',
- 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand',
- 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma',
- 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
- 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
- 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
- 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
- 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f',
- 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
- 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
- 'asciitilde', 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin',
- 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', 'circumflex',
- 'perthousand', 'Scaron', 'guilsinglleft', 'OE', 'bullet', 'Zcaron',
- 'bullet', 'bullet', 'quoteleft', 'quoteright', 'quotedblleft',
- 'quotedblright', 'bullet', 'endash', 'emdash', 'tilde', 'trademark',
- 'scaron', 'guilsinglright', 'oe', 'bullet', 'zcaron', 'Ydieresis',
- 'space', 'exclamdown', 'cent', 'sterling', 'currency', 'yen', 'brokenbar',
- 'section', 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft',
- 'logicalnot', 'hyphen', 'registered', 'macron', 'degree', 'plusminus',
- 'twosuperior', 'threesuperior', 'acute', 'mu', 'paragraph', 'periodcentered',
- 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', 'onequarter',
- 'onehalf', 'threequarters', 'questiondown', 'Agrave', 'Aacute',
- 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'AE', 'Ccedilla',
- 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Igrave', 'Iacute',
- 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute',
- 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', 'Ugrave',
- 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 'germandbls',
- 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 'aring', 'ae',
- 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', 'igrave',
- 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', 'oacute',
- 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', 'ugrave', 'uacute',
- 'ucircumflex', 'udieresis', 'yacute', 'thorn', 'ydieresis']
-
-MacRomanNames = [None, None, None, None, None, None, None, None, None, None, None, None,
- None, None, None, None, None, None, None, None, None, None, None, None,
- None, None, None, None, None, None, None, None, 'space', 'exclam',
- 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand',
- 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma',
- 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
- 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
- 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
- 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
- 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
- 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f',
- 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
- 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
- 'asciitilde', None, 'Adieresis', 'Aring', 'Ccedilla', 'Eacute',
- 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex',
- 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave',
- 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex',
- 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis',
- 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger',
- 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph',
- 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
- 'dieresis', None, 'AE', 'Oslash', None, 'plusminus', None, None, 'yen',
- 'mu', None, None, None, None, None, 'ordfeminine', 'ordmasculine', None,
- 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', None, 'florin',
- None, None, 'guillemotleft', 'guillemotright', 'ellipsis', 'space', 'Agrave',
- 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft',
- 'quotedblright', 'quoteleft', 'quoteright', 'divide', None, 'ydieresis',
- 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright',
- 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase',
- 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute',
- 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave',
- 'Oacute', 'Ocircumflex', None, 'Ograve', 'Uacute', 'Ucircumflex',
- 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve',
- 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron']
+#
+widthsByName['Times-Romans'] = {'A': 722,
+ 'AE': 889,
+ 'Aacute': 722,
+ 'Acircumflex': 722,
+ 'Adieresis': 722,
+ 'Agrave': 722,
+ 'Aring': 722,
+ 'Atilde': 722,
+ 'B': 667,
+ 'C': 667,
+ 'Ccedilla': 667,
+ 'D': 722,
+ 'E': 611,
+ 'Eacute': 611,
+ 'Ecircumflex': 611,
+ 'Edieresis': 611,
+ 'Egrave': 611,
+ 'Eth': 722,
+ 'Euro': 500,
+ 'F': 556,
+ 'G': 722,
+ 'H': 722,
+ 'I': 333,
+ 'Iacute': 333,
+ 'Icircumflex': 333,
+ 'Idieresis': 333,
+ 'Igrave': 333,
+ 'J': 389,
+ 'K': 722,
+ 'L': 611,
+ 'Lslash': 611,
+ 'M': 889,
+ 'N': 722,
+ 'Ntilde': 722,
+ 'O': 722,
+ 'OE': 889,
+ 'Oacute': 722,
+ 'Ocircumflex': 722,
+ 'Odieresis': 722,
+ 'Ograve': 722,
+ 'Oslash': 722,
+ 'Otilde': 722,
+ 'P': 556,
+ 'Q': 722,
+ 'R': 667,
+ 'S': 556,
+ 'Scaron': 556,
+ 'T': 611,
+ 'Thorn': 556,
+ 'U': 722,
+ 'Uacute': 722,
+ 'Ucircumflex': 722,
+ 'Udieresis': 722,
+ 'Ugrave': 722,
+ 'V': 722,
+ 'W': 944,
+ 'X': 722,
+ 'Y': 722,
+ 'Yacute': 722,
+ 'Ydieresis': 722,
+ 'Z': 611,
+ 'Zcaron': 611,
+ 'a': 444,
+ 'aacute': 444,
+ 'acircumflex': 444,
+ 'acute': 333,
+ 'adieresis': 444,
+ 'ae': 667,
+ 'agrave': 444,
+ 'ampersand': 778,
+ 'aring': 444,
+ 'asciicircum': 469,
+ 'asciitilde': 541,
+ 'asterisk': 500,
+ 'at': 921,
+ 'atilde': 444,
+ 'b': 500,
+ 'backslash': 278,
+ 'bar': 200,
+ 'braceleft': 480,
+ 'braceright': 480,
+ 'bracketleft': 333,
+ 'bracketright': 333,
+ 'breve': 333,
+ 'brokenbar': 200,
+ 'bullet': 350,
+ 'c': 444,
+ 'caron': 333,
+ 'ccedilla': 444,
+ 'cedilla': 333,
+ 'cent': 500,
+ 'circumflex': 333,
+ 'colon': 278,
+ 'comma': 250,
+ 'copyright': 760,
+ 'currency': 500,
+ 'd': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'degree': 400,
+ 'dieresis': 333,
+ 'divide': 564,
+ 'dollar': 500,
+ 'dotaccent': 333,
+ 'dotlessi': 278,
+ 'e': 444,
+ 'eacute': 444,
+ 'ecircumflex': 444,
+ 'edieresis': 444,
+ 'egrave': 444,
+ 'eight': 500,
+ 'ellipsis': 1000,
+ 'emdash': 1000,
+ 'endash': 500,
+ 'equal': 564,
+ 'eth': 500,
+ 'exclam': 333,
+ 'exclamdown': 333,
+ 'f': 333,
+ 'fi': 556,
+ 'five': 500,
+ 'fl': 556,
+ 'florin': 500,
+ 'four': 500,
+ 'fraction': 167,
+ 'g': 500,
+ 'germandbls': 500,
+ 'grave': 333,
+ 'greater': 564,
+ 'guillemotleft': 500,
+ 'guillemotright': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'h': 500,
+ 'hungarumlaut': 333,
+ 'hyphen': 333,
+ 'i': 278,
+ 'iacute': 278,
+ 'icircumflex': 278,
+ 'idieresis': 278,
+ 'igrave': 278,
+ 'j': 278,
+ 'k': 500,
+ 'l': 278,
+ 'less': 564,
+ 'logicalnot': 564,
+ 'lslash': 278,
+ 'm': 778,
+ 'macron': 333,
+ 'minus': 564,
+ 'mu': 500,
+ 'multiply': 564,
+ 'n': 500,
+ 'nine': 500,
+ 'ntilde': 500,
+ 'numbersign': 500,
+ 'o': 500,
+ 'oacute': 500,
+ 'ocircumflex': 500,
+ 'odieresis': 500,
+ 'oe': 722,
+ 'ogonek': 333,
+ 'ograve': 500,
+ 'one': 500,
+ 'onehalf': 750,
+ 'onequarter': 750,
+ 'onesuperior': 300,
+ 'ordfeminine': 276,
+ 'ordmasculine': 310,
+ 'oslash': 500,
+ 'otilde': 500,
+ 'p': 500,
+ 'paragraph': 453,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'percent': 833,
+ 'period': 250,
+ 'periodcentered': 250,
+ 'perthousand': 1000,
+ 'plus': 564,
+ 'plusminus': 564,
+ 'q': 500,
+ 'question': 444,
+ 'questiondown': 444,
+ 'quotedbl': 408,
+ 'quotedblbase': 444,
+ 'quotedblleft': 444,
+ 'quotedblright': 444,
+ 'quoteleft': 333,
+ 'quoteright': 333,
+ 'quotesinglbase': 333,
+ 'quotesingle': 180,
+ 'r': 333,
+ 'registered': 760,
+ 'ring': 333,
+ 's': 389,
+ 'scaron': 389,
+ 'section': 500,
+ 'semicolon': 278,
+ 'seven': 500,
+ 'six': 500,
+ 'slash': 278,
+ 'space': 250,
+ 'sterling': 500,
+ 't': 278,
+ 'thorn': 500,
+ 'three': 500,
+ 'threequarters': 750,
+ 'threesuperior': 300,
+ 'tilde': 333,
+ 'trademark': 980,
+ 'two': 500,
+ 'twosuperior': 300,
+ 'u': 500,
+ 'uacute': 500,
+ 'ucircumflex': 500,
+ 'udieresis': 500,
+ 'ugrave': 500,
+ 'underscore': 500,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'yacute': 500,
+ 'ydieresis': 500,
+ 'yen': 500,
+ 'z': 444,
+ 'zcaron': 444,
+ 'zero': 500}
-class FontMetrics:
- """This is an object which parses AFM files and holds all the
- data they contain."""
- def __init__(self, afmFileName):
- self.fontName = None
- self.widthsByPosition = []
- self.parseAFMFile(afmFileName)
-
- def parseAFMFile(self, filename):
- """Returns an array holding the widths of all characters in the font.
- Ultra-crude parser"""
- alllines = open(filename, 'r').readlines()
- # get stuff between StartCharMetrics and EndCharMetrics
- metriclines = []
- between = 0
- for line in alllines:
- lline = string.lower(line)
- i = string.find(lline,'fontName')
- if i>=0:
- fontName = string.strip(line[i+9:])
- self.fontName = fontName
- if string.find(lline, 'endcharmetrics') > -1:
- between = 0
- break
- if between:
- metriclines.append(line)
- if string.find(lline, 'startcharmetrics') > -1:
- between = 1
-
- # break up - very shaky assumption about array size
- widths = [0] * 256
- widthsByName = {}
- for line in metriclines:
- chunks = string.split(line, ';')
+widthsByName['Times-Roman'] = {'A': 722,
+ 'AE': 889,
+ 'Aacute': 722,
+ 'Acircumflex': 722,
+ 'Adieresis': 722,
+ 'Agrave': 722,
+ 'Aring': 722,
+ 'Atilde': 722,
+ 'B': 667,
+ 'C': 667,
+ 'Ccedilla': 667,
+ 'D': 722,
+ 'E': 611,
+ 'Eacute': 611,
+ 'Ecircumflex': 611,
+ 'Edieresis': 611,
+ 'Egrave': 611,
+ 'Eth': 722,
+ 'Euro': 500,
+ 'F': 556,
+ 'G': 722,
+ 'H': 722,
+ 'I': 333,
+ 'Iacute': 333,
+ 'Icircumflex': 333,
+ 'Idieresis': 333,
+ 'Igrave': 333,
+ 'J': 389,
+ 'K': 722,
+ 'L': 611,
+ 'Lslash': 611,
+ 'M': 889,
+ 'N': 722,
+ 'Ntilde': 722,
+ 'O': 722,
+ 'OE': 889,
+ 'Oacute': 722,
+ 'Ocircumflex': 722,
+ 'Odieresis': 722,
+ 'Ograve': 722,
+ 'Oslash': 722,
+ 'Otilde': 722,
+ 'P': 556,
+ 'Q': 722,
+ 'R': 667,
+ 'S': 556,
+ 'Scaron': 556,
+ 'T': 611,
+ 'Thorn': 556,
+ 'U': 722,
+ 'Uacute': 722,
+ 'Ucircumflex': 722,
+ 'Udieresis': 722,
+ 'Ugrave': 722,
+ 'V': 722,
+ 'W': 944,
+ 'X': 722,
+ 'Y': 722,
+ 'Yacute': 722,
+ 'Ydieresis': 722,
+ 'Z': 611,
+ 'Zcaron': 611,
+ 'a': 444,
+ 'aacute': 444,
+ 'acircumflex': 444,
+ 'acute': 333,
+ 'adieresis': 444,
+ 'ae': 667,
+ 'agrave': 444,
+ 'ampersand': 778,
+ 'aring': 444,
+ 'asciicircum': 469,
+ 'asciitilde': 541,
+ 'asterisk': 500,
+ 'at': 921,
+ 'atilde': 444,
+ 'b': 500,
+ 'backslash': 278,
+ 'bar': 200,
+ 'braceleft': 480,
+ 'braceright': 480,
+ 'bracketleft': 333,
+ 'bracketright': 333,
+ 'breve': 333,
+ 'brokenbar': 200,
+ 'bullet': 350,
+ 'c': 444,
+ 'caron': 333,
+ 'ccedilla': 444,
+ 'cedilla': 333,
+ 'cent': 500,
+ 'circumflex': 333,
+ 'colon': 278,
+ 'comma': 250,
+ 'copyright': 760,
+ 'currency': 500,
+ 'd': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'degree': 400,
+ 'dieresis': 333,
+ 'divide': 564,
+ 'dollar': 500,
+ 'dotaccent': 333,
+ 'dotlessi': 278,
+ 'e': 444,
+ 'eacute': 444,
+ 'ecircumflex': 444,
+ 'edieresis': 444,
+ 'egrave': 444,
+ 'eight': 500,
+ 'ellipsis': 1000,
+ 'emdash': 1000,
+ 'endash': 500,
+ 'equal': 564,
+ 'eth': 500,
+ 'exclam': 333,
+ 'exclamdown': 333,
+ 'f': 333,
+ 'fi': 556,
+ 'five': 500,
+ 'fl': 556,
+ 'florin': 500,
+ 'four': 500,
+ 'fraction': 167,
+ 'g': 500,
+ 'germandbls': 500,
+ 'grave': 333,
+ 'greater': 564,
+ 'guillemotleft': 500,
+ 'guillemotright': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'h': 500,
+ 'hungarumlaut': 333,
+ 'hyphen': 333,
+ 'i': 278,
+ 'iacute': 278,
+ 'icircumflex': 278,
+ 'idieresis': 278,
+ 'igrave': 278,
+ 'j': 278,
+ 'k': 500,
+ 'l': 278,
+ 'less': 564,
+ 'logicalnot': 564,
+ 'lslash': 278,
+ 'm': 778,
+ 'macron': 333,
+ 'minus': 564,
+ 'mu': 500,
+ 'multiply': 564,
+ 'n': 500,
+ 'nine': 500,
+ 'ntilde': 500,
+ 'numbersign': 500,
+ 'o': 500,
+ 'oacute': 500,
+ 'ocircumflex': 500,
+ 'odieresis': 500,
+ 'oe': 722,
+ 'ogonek': 333,
+ 'ograve': 500,
+ 'one': 500,
+ 'onehalf': 750,
+ 'onequarter': 750,
+ 'onesuperior': 300,
+ 'ordfeminine': 276,
+ 'ordmasculine': 310,
+ 'oslash': 500,
+ 'otilde': 500,
+ 'p': 500,
+ 'paragraph': 453,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'percent': 833,
+ 'period': 250,
+ 'periodcentered': 250,
+ 'perthousand': 1000,
+ 'plus': 564,
+ 'plusminus': 564,
+ 'q': 500,
+ 'question': 444,
+ 'questiondown': 444,
+ 'quotedbl': 408,
+ 'quotedblbase': 444,
+ 'quotedblleft': 444,
+ 'quotedblright': 444,
+ 'quoteleft': 333,
+ 'quoteright': 333,
+ 'quotesinglbase': 333,
+ 'quotesingle': 180,
+ 'r': 333,
+ 'registered': 760,
+ 'ring': 333,
+ 's': 389,
+ 'scaron': 389,
+ 'section': 500,
+ 'semicolon': 278,
+ 'seven': 500,
+ 'six': 500,
+ 'slash': 278,
+ 'space': 250,
+ 'sterling': 500,
+ 't': 278,
+ 'thorn': 500,
+ 'three': 500,
+ 'threequarters': 750,
+ 'threesuperior': 300,
+ 'tilde': 333,
+ 'trademark': 980,
+ 'two': 500,
+ 'twosuperior': 300,
+ 'u': 500,
+ 'uacute': 500,
+ 'ucircumflex': 500,
+ 'udieresis': 500,
+ 'ugrave': 500,
+ 'underscore': 500,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'yacute': 500,
+ 'ydieresis': 500,
+ 'yen': 500,
+ 'z': 444,
+ 'zcaron': 444,
+ 'zero': 500}
- (c, cid) = string.split(chunks[0])
- (wx, width) = string.split(chunks[1])
- (n, name) = string.split(chunks[2])
- #(b, x1, y1, x2, y2) = string.split(chunks[3])
- widths[string.atoi(cid)] = string.atoi(width)
- widthsByName[name] = string.atoi(width)
-
- # by default, any empties should get the width of a space
- for i in range(len(widths)):
- if widths[i] == 0:
- widths[i] == widths[32]
-
- self.widthsByPosition = widths
- self.widthsByName = widthsByName
-
- def getWinAnsiWidths(self):
- #derive a WinAnsi encoding vector
- winAnsiWidths = [0] * 256
- for i in range(255):
- name = WinAnsiNames[i]
- try:
- width = self.widthsByName[name]
- except:
- width = 0
- winAnsiWidths[i] = width
- return winAnsiWidths
-
- def getMacRomanWidths(self):
- #derive a MacRoman encoding vector
- MacRomanWidths = [0] * 256
- for i in range(255):
- name = MacRomanNames[i]
- try:
- width = self.widthsByName[name]
- except:
- width = 0
- MacRomanWidths[i] = width
- return MacRomanWidths
+widthsByName['Times-Bold'] = {'A': 722,
+ 'AE': 1000,
+ 'Aacute': 722,
+ 'Acircumflex': 722,
+ 'Adieresis': 722,
+ 'Agrave': 722,
+ 'Aring': 722,
+ 'Atilde': 722,
+ 'B': 667,
+ 'C': 722,
+ 'Ccedilla': 722,
+ 'D': 722,
+ 'E': 667,
+ 'Eacute': 667,
+ 'Ecircumflex': 667,
+ 'Edieresis': 667,
+ 'Egrave': 667,
+ 'Eth': 722,
+ 'Euro': 500,
+ 'F': 611,
+ 'G': 778,
+ 'H': 778,
+ 'I': 389,
+ 'Iacute': 389,
+ 'Icircumflex': 389,
+ 'Idieresis': 389,
+ 'Igrave': 389,
+ 'J': 500,
+ 'K': 778,
+ 'L': 667,
+ 'Lslash': 667,
+ 'M': 944,
+ 'N': 722,
+ 'Ntilde': 722,
+ 'O': 778,
+ 'OE': 1000,
+ 'Oacute': 778,
+ 'Ocircumflex': 778,
+ 'Odieresis': 778,
+ 'Ograve': 778,
+ 'Oslash': 778,
+ 'Otilde': 778,
+ 'P': 611,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 556,
+ 'Scaron': 556,
+ 'T': 667,
+ 'Thorn': 611,
+ 'U': 722,
+ 'Uacute': 722,
+ 'Ucircumflex': 722,
+ 'Udieresis': 722,
+ 'Ugrave': 722,
+ 'V': 722,
+ 'W': 1000,
+ 'X': 722,
+ 'Y': 722,
+ 'Yacute': 722,
+ 'Ydieresis': 722,
+ 'Z': 667,
+ 'Zcaron': 667,
+ 'a': 500,
+ 'aacute': 500,
+ 'acircumflex': 500,
+ 'acute': 333,
+ 'adieresis': 500,
+ 'ae': 722,
+ 'agrave': 500,
+ 'ampersand': 833,
+ 'aring': 500,
+ 'asciicircum': 581,
+ 'asciitilde': 520,
+ 'asterisk': 500,
+ 'at': 930,
+ 'atilde': 500,
+ 'b': 556,
+ 'backslash': 278,
+ 'bar': 220,
+ 'braceleft': 394,
+ 'braceright': 394,
+ 'bracketleft': 333,
+ 'bracketright': 333,
+ 'breve': 333,
+ 'brokenbar': 220,
+ 'bullet': 350,
+ 'c': 444,
+ 'caron': 333,
+ 'ccedilla': 444,
+ 'cedilla': 333,
+ 'cent': 500,
+ 'circumflex': 333,
+ 'colon': 333,
+ 'comma': 250,
+ 'copyright': 747,
+ 'currency': 500,
+ 'd': 556,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'degree': 400,
+ 'dieresis': 333,
+ 'divide': 570,
+ 'dollar': 500,
+ 'dotaccent': 333,
+ 'dotlessi': 278,
+ 'e': 444,
+ 'eacute': 444,
+ 'ecircumflex': 444,
+ 'edieresis': 444,
+ 'egrave': 444,
+ 'eight': 500,
+ 'ellipsis': 1000,
+ 'emdash': 1000,
+ 'endash': 500,
+ 'equal': 570,
+ 'eth': 500,
+ 'exclam': 333,
+ 'exclamdown': 333,
+ 'f': 333,
+ 'fi': 556,
+ 'five': 500,
+ 'fl': 556,
+ 'florin': 500,
+ 'four': 500,
+ 'fraction': 167,
+ 'g': 500,
+ 'germandbls': 556,
+ 'grave': 333,
+ 'greater': 570,
+ 'guillemotleft': 500,
+ 'guillemotright': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'h': 556,
+ 'hungarumlaut': 333,
+ 'hyphen': 333,
+ 'i': 278,
+ 'iacute': 278,
+ 'icircumflex': 278,
+ 'idieresis': 278,
+ 'igrave': 278,
+ 'j': 333,
+ 'k': 556,
+ 'l': 278,
+ 'less': 570,
+ 'logicalnot': 570,
+ 'lslash': 278,
+ 'm': 833,
+ 'macron': 333,
+ 'minus': 570,
+ 'mu': 556,
+ 'multiply': 570,
+ 'n': 556,
+ 'nine': 500,
+ 'ntilde': 556,
+ 'numbersign': 500,
+ 'o': 500,
+ 'oacute': 500,
+ 'ocircumflex': 500,
+ 'odieresis': 500,
+ 'oe': 722,
+ 'ogonek': 333,
+ 'ograve': 500,
+ 'one': 500,
+ 'onehalf': 750,
+ 'onequarter': 750,
+ 'onesuperior': 300,
+ 'ordfeminine': 300,
+ 'ordmasculine': 330,
+ 'oslash': 500,
+ 'otilde': 500,
+ 'p': 556,
+ 'paragraph': 540,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'percent': 1000,
+ 'period': 250,
+ 'periodcentered': 250,
+ 'perthousand': 1000,
+ 'plus': 570,
+ 'plusminus': 570,
+ 'q': 556,
+ 'question': 500,
+ 'questiondown': 500,
+ 'quotedbl': 555,
+ 'quotedblbase': 500,
+ 'quotedblleft': 500,
+ 'quotedblright': 500,
+ 'quoteleft': 333,
+ 'quoteright': 333,
+ 'quotesinglbase': 333,
+ 'quotesingle': 278,
+ 'r': 444,
+ 'registered': 747,
+ 'ring': 333,
+ 's': 389,
+ 'scaron': 389,
+ 'section': 500,
+ 'semicolon': 333,
+ 'seven': 500,
+ 'six': 500,
+ 'slash': 278,
+ 'space': 250,
+ 'sterling': 500,
+ 't': 333,
+ 'thorn': 556,
+ 'three': 500,
+ 'threequarters': 750,
+ 'threesuperior': 300,
+ 'tilde': 333,
+ 'trademark': 1000,
+ 'two': 500,
+ 'twosuperior': 300,
+ 'u': 556,
+ 'uacute': 556,
+ 'ucircumflex': 556,
+ 'udieresis': 556,
+ 'ugrave': 556,
+ 'underscore': 500,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'yacute': 500,
+ 'ydieresis': 500,
+ 'yen': 500,
+ 'z': 444,
+ 'zcaron': 444,
+ 'zero': 500}
-if _stringWidth:
- from reportlab.lib import RL_DEBUG
- for e, F in widths.items():
- for f, W in F.items():
- ad = ascent_descent[f]
- _rl_accel.setFontInfo(f,e,ad[0],ad[1],W)
- if RL_DEBUG:
- for c in xrange(256):
- wPy = W[c]
- if wPy>0:
- wX = int(1000*_stringWidth(chr(c),f,1,e))
- if wX!=wPy:
- raise ValueError, "_stringWidth(chr(%d),%s,1,%s)==>%d != %d" % (c,f,e,wX,wPy)
-
-
- def _loadfont(fontName, filename):
- infoOnce('cache loading %s' % filename)
- assert os.path.exists(filename)
-## W = parseAFMfile(filename)
-## ad = (0,0) # TODO don't have this yet?
-## _rl_accel.setFontInfo(fontName,encoding,ad[0],ad[1],W)
- fm = FontMetrics(filename)
- _rl_accel.setFontInfo(string.lower(fontName), 'WinAnsiEncoding', ad[0], ad[1], fm.getWinAnsiWidths())
- _rl_accel.setFontInfo(string.lower(fontName), 'MacRomanEncoding', ad[0], ad[1], fm.getMacRomanWidths())
-
-
- def _SWRecover(text, font, fontSize, encoding):
- #infoOnce('_SWRecover('...',%s,%s,%s')%(font,str(fontSize),encoding))
- try:
- _loadFont(font,encoding)
- return _stringWidth(text,font,fontSize,encoding)
- except:
- warnOnce('Font %s:%s not found - using Courier:%s for widths'%(font,encoding,encoding))
- return _stringWidth(text,'courier',fontSize,encoding)
-
- _rl_accel.defaultEncoding(DEFAULT_ENCODING)
- _rl_accel._SWRecover(_SWRecover)
- stringWidth = _stringWidth
- loadFont = _loadfont
+widthsByName['Times-Italic'] = {'A': 611,
+ 'AE': 889,
+ 'Aacute': 611,
+ 'Acircumflex': 611,
+ 'Adieresis': 611,
+ 'Agrave': 611,
+ 'Aring': 611,
+ 'Atilde': 611,
+ 'B': 611,
+ 'C': 667,
+ 'Ccedilla': 667,
+ 'D': 722,
+ 'E': 611,
+ 'Eacute': 611,
+ 'Ecircumflex': 611,
+ 'Edieresis': 611,
+ 'Egrave': 611,
+ 'Eth': 722,
+ 'Euro': 500,
+ 'F': 611,
+ 'G': 722,
+ 'H': 722,
+ 'I': 333,
+ 'Iacute': 333,
+ 'Icircumflex': 333,
+ 'Idieresis': 333,
+ 'Igrave': 333,
+ 'J': 444,
+ 'K': 667,
+ 'L': 556,
+ 'Lslash': 556,
+ 'M': 833,
+ 'N': 667,
+ 'Ntilde': 667,
+ 'O': 722,
+ 'OE': 944,
+ 'Oacute': 722,
+ 'Ocircumflex': 722,
+ 'Odieresis': 722,
+ 'Ograve': 722,
+ 'Oslash': 722,
+ 'Otilde': 722,
+ 'P': 611,
+ 'Q': 722,
+ 'R': 611,
+ 'S': 500,
+ 'Scaron': 500,
+ 'T': 556,
+ 'Thorn': 611,
+ 'U': 722,
+ 'Uacute': 722,
+ 'Ucircumflex': 722,
+ 'Udieresis': 722,
+ 'Ugrave': 722,
+ 'V': 611,
+ 'W': 833,
+ 'X': 611,
+ 'Y': 556,
+ 'Yacute': 556,
+ 'Ydieresis': 556,
+ 'Z': 556,
+ 'Zcaron': 556,
+ 'a': 500,
+ 'aacute': 500,
+ 'acircumflex': 500,
+ 'acute': 333,
+ 'adieresis': 500,
+ 'ae': 667,
+ 'agrave': 500,
+ 'ampersand': 778,
+ 'aring': 500,
+ 'asciicircum': 422,
+ 'asciitilde': 541,
+ 'asterisk': 500,
+ 'at': 920,
+ 'atilde': 500,
+ 'b': 500,
+ 'backslash': 278,
+ 'bar': 275,
+ 'braceleft': 400,
+ 'braceright': 400,
+ 'bracketleft': 389,
+ 'bracketright': 389,
+ 'breve': 333,
+ 'brokenbar': 275,
+ 'bullet': 350,
+ 'c': 444,
+ 'caron': 333,
+ 'ccedilla': 444,
+ 'cedilla': 333,
+ 'cent': 500,
+ 'circumflex': 333,
+ 'colon': 333,
+ 'comma': 250,
+ 'copyright': 760,
+ 'currency': 500,
+ 'd': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'degree': 400,
+ 'dieresis': 333,
+ 'divide': 675,
+ 'dollar': 500,
+ 'dotaccent': 333,
+ 'dotlessi': 278,
+ 'e': 444,
+ 'eacute': 444,
+ 'ecircumflex': 444,
+ 'edieresis': 444,
+ 'egrave': 444,
+ 'eight': 500,
+ 'ellipsis': 889,
+ 'emdash': 889,
+ 'endash': 500,
+ 'equal': 675,
+ 'eth': 500,
+ 'exclam': 333,
+ 'exclamdown': 389,
+ 'f': 278,
+ 'fi': 500,
+ 'five': 500,
+ 'fl': 500,
+ 'florin': 500,
+ 'four': 500,
+ 'fraction': 167,
+ 'g': 500,
+ 'germandbls': 500,
+ 'grave': 333,
+ 'greater': 675,
+ 'guillemotleft': 500,
+ 'guillemotright': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'h': 500,
+ 'hungarumlaut': 333,
+ 'hyphen': 333,
+ 'i': 278,
+ 'iacute': 278,
+ 'icircumflex': 278,
+ 'idieresis': 278,
+ 'igrave': 278,
+ 'j': 278,
+ 'k': 444,
+ 'l': 278,
+ 'less': 675,
+ 'logicalnot': 675,
+ 'lslash': 278,
+ 'm': 722,
+ 'macron': 333,
+ 'minus': 675,
+ 'mu': 500,
+ 'multiply': 675,
+ 'n': 500,
+ 'nine': 500,
+ 'ntilde': 500,
+ 'numbersign': 500,
+ 'o': 500,
+ 'oacute': 500,
+ 'ocircumflex': 500,
+ 'odieresis': 500,
+ 'oe': 667,
+ 'ogonek': 333,
+ 'ograve': 500,
+ 'one': 500,
+ 'onehalf': 750,
+ 'onequarter': 750,
+ 'onesuperior': 300,
+ 'ordfeminine': 276,
+ 'ordmasculine': 310,
+ 'oslash': 500,
+ 'otilde': 500,
+ 'p': 500,
+ 'paragraph': 523,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'percent': 833,
+ 'period': 250,
+ 'periodcentered': 250,
+ 'perthousand': 1000,
+ 'plus': 675,
+ 'plusminus': 675,
+ 'q': 500,
+ 'question': 500,
+ 'questiondown': 500,
+ 'quotedbl': 420,
+ 'quotedblbase': 556,
+ 'quotedblleft': 556,
+ 'quotedblright': 556,
+ 'quoteleft': 333,
+ 'quoteright': 333,
+ 'quotesinglbase': 333,
+ 'quotesingle': 214,
+ 'r': 389,
+ 'registered': 760,
+ 'ring': 333,
+ 's': 389,
+ 'scaron': 389,
+ 'section': 500,
+ 'semicolon': 333,
+ 'seven': 500,
+ 'six': 500,
+ 'slash': 278,
+ 'space': 250,
+ 'sterling': 500,
+ 't': 278,
+ 'thorn': 500,
+ 'three': 500,
+ 'threequarters': 750,
+ 'threesuperior': 300,
+ 'tilde': 333,
+ 'trademark': 980,
+ 'two': 500,
+ 'twosuperior': 300,
+ 'u': 500,
+ 'uacute': 500,
+ 'ucircumflex': 500,
+ 'udieresis': 500,
+ 'ugrave': 500,
+ 'underscore': 500,
+ 'v': 444,
+ 'w': 667,
+ 'x': 444,
+ 'y': 444,
+ 'yacute': 444,
+ 'ydieresis': 444,
+ 'yen': 500,
+ 'z': 389,
+ 'zcaron': 389,
+ 'zero': 500}
-else:
- class FontCache:
- """Loads and caches font width information on demand. Font names
- converted to lower case for indexing. Public interface is stringWidth"""
- def __init__(self):
- global widths
- self.__widtharrays = widths
-
- def loadFont(self, fontName, filename):
- infoOnce('Info: cache loading%s' % filename)
- assert os.path.exists(filename)
- fm = FontMetrics(filename)
- self.__widtharrays['WinAnsiEncoding'][string.lower(fontName)] = fm.getWinAnsiWidths()
- self.__widtharrays['MacRomanEncoding'][string.lower(fontName)] = fm.getMacRomanWidths()
-
+widthsByName['Times-BoldItalic'] = {'A': 667,
+ 'AE': 944,
+ 'Aacute': 667,
+ 'Acircumflex': 667,
+ 'Adieresis': 667,
+ 'Agrave': 667,
+ 'Aring': 667,
+ 'Atilde': 667,
+ 'B': 667,
+ 'C': 667,
+ 'Ccedilla': 667,
+ 'D': 722,
+ 'E': 667,
+ 'Eacute': 667,
+ 'Ecircumflex': 667,
+ 'Edieresis': 667,
+ 'Egrave': 667,
+ 'Eth': 722,
+ 'Euro': 500,
+ 'F': 667,
+ 'G': 722,
+ 'H': 778,
+ 'I': 389,
+ 'Iacute': 389,
+ 'Icircumflex': 389,
+ 'Idieresis': 389,
+ 'Igrave': 389,
+ 'J': 500,
+ 'K': 667,
+ 'L': 611,
+ 'Lslash': 611,
+ 'M': 889,
+ 'N': 722,
+ 'Ntilde': 722,
+ 'O': 722,
+ 'OE': 944,
+ 'Oacute': 722,
+ 'Ocircumflex': 722,
+ 'Odieresis': 722,
+ 'Ograve': 722,
+ 'Oslash': 722,
+ 'Otilde': 722,
+ 'P': 611,
+ 'Q': 722,
+ 'R': 667,
+ 'S': 556,
+ 'Scaron': 556,
+ 'T': 611,
+ 'Thorn': 611,
+ 'U': 722,
+ 'Uacute': 722,
+ 'Ucircumflex': 722,
+ 'Udieresis': 722,
+ 'Ugrave': 722,
+ 'V': 667,
+ 'W': 889,
+ 'X': 667,
+ 'Y': 611,
+ 'Yacute': 611,
+ 'Ydieresis': 611,
+ 'Z': 611,
+ 'Zcaron': 611,
+ 'a': 500,
+ 'aacute': 500,
+ 'acircumflex': 500,
+ 'acute': 333,
+ 'adieresis': 500,
+ 'ae': 722,
+ 'agrave': 500,
+ 'ampersand': 778,
+ 'aring': 500,
+ 'asciicircum': 570,
+ 'asciitilde': 570,
+ 'asterisk': 500,
+ 'at': 832,
+ 'atilde': 500,
+ 'b': 500,
+ 'backslash': 278,
+ 'bar': 220,
+ 'braceleft': 348,
+ 'braceright': 348,
+ 'bracketleft': 333,
+ 'bracketright': 333,
+ 'breve': 333,
+ 'brokenbar': 220,
+ 'bullet': 350,
+ 'c': 444,
+ 'caron': 333,
+ 'ccedilla': 444,
+ 'cedilla': 333,
+ 'cent': 500,
+ 'circumflex': 333,
+ 'colon': 333,
+ 'comma': 250,
+ 'copyright': 747,
+ 'currency': 500,
+ 'd': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'degree': 400,
+ 'dieresis': 333,
+ 'divide': 570,
+ 'dollar': 500,
+ 'dotaccent': 333,
+ 'dotlessi': 278,
+ 'e': 444,
+ 'eacute': 444,
+ 'ecircumflex': 444,
+ 'edieresis': 444,
+ 'egrave': 444,
+ 'eight': 500,
+ 'ellipsis': 1000,
+ 'emdash': 1000,
+ 'endash': 500,
+ 'equal': 570,
+ 'eth': 500,
+ 'exclam': 389,
+ 'exclamdown': 389,
+ 'f': 333,
+ 'fi': 556,
+ 'five': 500,
+ 'fl': 556,
+ 'florin': 500,
+ 'four': 500,
+ 'fraction': 167,
+ 'g': 500,
+ 'germandbls': 500,
+ 'grave': 333,
+ 'greater': 570,
+ 'guillemotleft': 500,
+ 'guillemotright': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'h': 556,
+ 'hungarumlaut': 333,
+ 'hyphen': 333,
+ 'i': 278,
+ 'iacute': 278,
+ 'icircumflex': 278,
+ 'idieresis': 278,
+ 'igrave': 278,
+ 'j': 278,
+ 'k': 500,
+ 'l': 278,
+ 'less': 570,
+ 'logicalnot': 606,
+ 'lslash': 278,
+ 'm': 778,
+ 'macron': 333,
+ 'minus': 606,
+ 'mu': 576,
+ 'multiply': 570,
+ 'n': 556,
+ 'nine': 500,
+ 'ntilde': 556,
+ 'numbersign': 500,
+ 'o': 500,
+ 'oacute': 500,
+ 'ocircumflex': 500,
+ 'odieresis': 500,
+ 'oe': 722,
+ 'ogonek': 333,
+ 'ograve': 500,
+ 'one': 500,
+ 'onehalf': 750,
+ 'onequarter': 750,
+ 'onesuperior': 300,
+ 'ordfeminine': 266,
+ 'ordmasculine': 300,
+ 'oslash': 500,
+ 'otilde': 500,
+ 'p': 500,
+ 'paragraph': 500,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'percent': 833,
+ 'period': 250,
+ 'periodcentered': 250,
+ 'perthousand': 1000,
+ 'plus': 570,
+ 'plusminus': 570,
+ 'q': 500,
+ 'question': 500,
+ 'questiondown': 500,
+ 'quotedbl': 555,
+ 'quotedblbase': 500,
+ 'quotedblleft': 500,
+ 'quotedblright': 500,
+ 'quoteleft': 333,
+ 'quoteright': 333,
+ 'quotesinglbase': 333,
+ 'quotesingle': 278,
+ 'r': 389,
+ 'registered': 747,
+ 'ring': 333,
+ 's': 389,
+ 'scaron': 389,
+ 'section': 500,
+ 'semicolon': 333,
+ 'seven': 500,
+ 'six': 500,
+ 'slash': 278,
+ 'space': 250,
+ 'sterling': 500,
+ 't': 278,
+ 'thorn': 500,
+ 'three': 500,
+ 'threequarters': 750,
+ 'threesuperior': 300,
+ 'tilde': 333,
+ 'trademark': 1000,
+ 'two': 500,
+ 'twosuperior': 300,
+ 'u': 556,
+ 'uacute': 556,
+ 'ucircumflex': 556,
+ 'udieresis': 556,
+ 'ugrave': 556,
+ 'underscore': 500,
+ 'v': 444,
+ 'w': 667,
+ 'x': 500,
+ 'y': 444,
+ 'yacute': 444,
+ 'ydieresis': 444,
+ 'yen': 500,
+ 'z': 389,
+ 'zcaron': 389,
+ 'zero': 500}
- def getfont(self, fontName, encoding):
- try:
- return self.__widtharrays[encoding][fontName]
- except:
- try:
- self.loadfont(fontName,encoding)
- return self.__widtharrays[encoding][fontName]
- except:
- # font not found, use Courier
- warnOnce('Font %s:%s not found - using Courier:%s for widths'%(fontName,encoding,encoding))
- return self.getfont('courier',encoding)
+widthsByName['Symbol'] = {'Alpha': 722,
+ 'Beta': 667,
+ 'Chi': 722,
+ 'Delta': 612,
+ 'Epsilon': 611,
+ 'Eta': 722,
+ 'Euro': 750,
+ 'Gamma': 603,
+ 'Ifraktur': 686,
+ 'Iota': 333,
+ 'Kappa': 722,
+ 'Lambda': 686,
+ 'Mu': 889,
+ 'Nu': 722,
+ 'Omega': 768,
+ 'Omicron': 722,
+ 'Phi': 763,
+ 'Pi': 768,
+ 'Psi': 795,
+ 'Rfraktur': 795,
+ 'Rho': 556,
+ 'Sigma': 592,
+ 'Tau': 611,
+ 'Theta': 741,
+ 'Upsilon': 690,
+ 'Upsilon1': 620,
+ 'Xi': 645,
+ 'Zeta': 611,
+ 'aleph': 823,
+ 'alpha': 631,
+ 'ampersand': 778,
+ 'angle': 768,
+ 'angleleft': 329,
+ 'angleright': 329,
+ 'apple': 790,
+ 'approxequal': 549,
+ 'arrowboth': 1042,
+ 'arrowdblboth': 1042,
+ 'arrowdbldown': 603,
+ 'arrowdblleft': 987,
+ 'arrowdblright': 987,
+ 'arrowdblup': 603,
+ 'arrowdown': 603,
+ 'arrowhorizex': 1000,
+ 'arrowleft': 987,
+ 'arrowright': 987,
+ 'arrowup': 603,
+ 'arrowvertex': 603,
+ 'asteriskmath': 500,
+ 'bar': 200,
+ 'beta': 549,
+ 'braceex': 494,
+ 'braceleft': 480,
+ 'braceleftbt': 494,
+ 'braceleftmid': 494,
+ 'bracelefttp': 494,
+ 'braceright': 480,
+ 'bracerightbt': 494,
+ 'bracerightmid': 494,
+ 'bracerighttp': 494,
+ 'bracketleft': 333,
+ 'bracketleftbt': 384,
+ 'bracketleftex': 384,
+ 'bracketlefttp': 384,
+ 'bracketright': 333,
+ 'bracketrightbt': 384,
+ 'bracketrightex': 384,
+ 'bracketrighttp': 384,
+ 'bullet': 460,
+ 'carriagereturn': 658,
+ 'chi': 549,
+ 'circlemultiply': 768,
+ 'circleplus': 768,
+ 'club': 753,
+ 'colon': 278,
+ 'comma': 250,
+ 'congruent': 549,
+ 'copyrightsans': 790,
+ 'copyrightserif': 790,
+ 'degree': 400,
+ 'delta': 494,
+ 'diamond': 753,
+ 'divide': 549,
+ 'dotmath': 250,
+ 'eight': 500,
+ 'element': 713,
+ 'ellipsis': 1000,
+ 'emptyset': 823,
+ 'epsilon': 439,
+ 'equal': 549,
+ 'equivalence': 549,
+ 'eta': 603,
+ 'exclam': 333,
+ 'existential': 549,
+ 'five': 500,
+ 'florin': 500,
+ 'four': 500,
+ 'fraction': 167,
+ 'gamma': 411,
+ 'gradient': 713,
+ 'greater': 549,
+ 'greaterequal': 549,
+ 'heart': 753,
+ 'infinity': 713,
+ 'integral': 274,
+ 'integralbt': 686,
+ 'integralex': 686,
+ 'integraltp': 686,
+ 'intersection': 768,
+ 'iota': 329,
+ 'kappa': 549,
+ 'lambda': 549,
+ 'less': 549,
+ 'lessequal': 549,
+ 'logicaland': 603,
+ 'logicalnot': 713,
+ 'logicalor': 603,
+ 'lozenge': 494,
+ 'minus': 549,
+ 'minute': 247,
+ 'mu': 576,
+ 'multiply': 549,
+ 'nine': 500,
+ 'notelement': 713,
+ 'notequal': 549,
+ 'notsubset': 713,
+ 'nu': 521,
+ 'numbersign': 500,
+ 'omega': 686,
+ 'omega1': 713,
+ 'omicron': 549,
+ 'one': 500,
+ 'parenleft': 333,
+ 'parenleftbt': 384,
+ 'parenleftex': 384,
+ 'parenlefttp': 384,
+ 'parenright': 333,
+ 'parenrightbt': 384,
+ 'parenrightex': 384,
+ 'parenrighttp': 384,
+ 'partialdiff': 494,
+ 'percent': 833,
+ 'period': 250,
+ 'perpendicular': 658,
+ 'phi': 521,
+ 'phi1': 603,
+ 'pi': 549,
+ 'plus': 549,
+ 'plusminus': 549,
+ 'product': 823,
+ 'propersubset': 713,
+ 'propersuperset': 713,
+ 'proportional': 713,
+ 'psi': 686,
+ 'question': 444,
+ 'radical': 549,
+ 'radicalex': 500,
+ 'reflexsubset': 713,
+ 'reflexsuperset': 713,
+ 'registersans': 790,
+ 'registerserif': 790,
+ 'rho': 549,
+ 'second': 411,
+ 'semicolon': 278,
+ 'seven': 500,
+ 'sigma': 603,
+ 'sigma1': 439,
+ 'similar': 549,
+ 'six': 500,
+ 'slash': 278,
+ 'space': 250,
+ 'spade': 753,
+ 'suchthat': 439,
+ 'summation': 713,
+ 'tau': 439,
+ 'therefore': 863,
+ 'theta': 521,
+ 'theta1': 631,
+ 'three': 500,
+ 'trademarksans': 786,
+ 'trademarkserif': 890,
+ 'two': 500,
+ 'underscore': 500,
+ 'union': 768,
+ 'universal': 713,
+ 'upsilon': 576,
+ 'weierstrass': 987,
+ 'xi': 493,
+ 'zero': 500,
+ 'zeta': 494}
- def stringWidth(self, text, font, fontSize, encoding=DEFAULT_ENCODING):
- widths = self.getfont(string.lower(font),encoding)
- w = 0
- for char in text:
- w = w + widths[ord(char)]
- return w*fontSize*0.001
+widthsByName['ZapfDingbats'] = {'a1': 974,
+ 'a10': 692,
+ 'a100': 668,
+ 'a101': 732,
+ 'a102': 544,
+ 'a103': 544,
+ 'a104': 910,
+ 'a105': 911,
+ 'a106': 667,
+ 'a107': 760,
+ 'a108': 760,
+ 'a109': 626,
+ 'a11': 960,
+ 'a110': 694,
+ 'a111': 595,
+ 'a112': 776,
+ 'a117': 690,
+ 'a118': 791,
+ 'a119': 790,
+ 'a12': 939,
+ 'a120': 788,
+ 'a121': 788,
+ 'a122': 788,
+ 'a123': 788,
+ 'a124': 788,
+ 'a125': 788,
+ 'a126': 788,
+ 'a127': 788,
+ 'a128': 788,
+ 'a129': 788,
+ 'a13': 549,
+ 'a130': 788,
+ 'a131': 788,
+ 'a132': 788,
+ 'a133': 788,
+ 'a134': 788,
+ 'a135': 788,
+ 'a136': 788,
+ 'a137': 788,
+ 'a138': 788,
+ 'a139': 788,
+ 'a14': 855,
+ 'a140': 788,
+ 'a141': 788,
+ 'a142': 788,
+ 'a143': 788,
+ 'a144': 788,
+ 'a145': 788,
+ 'a146': 788,
+ 'a147': 788,
+ 'a148': 788,
+ 'a149': 788,
+ 'a15': 911,
+ 'a150': 788,
+ 'a151': 788,
+ 'a152': 788,
+ 'a153': 788,
+ 'a154': 788,
+ 'a155': 788,
+ 'a156': 788,
+ 'a157': 788,
+ 'a158': 788,
+ 'a159': 788,
+ 'a16': 933,
+ 'a160': 894,
+ 'a161': 838,
+ 'a162': 924,
+ 'a163': 1016,
+ 'a164': 458,
+ 'a165': 924,
+ 'a166': 918,
+ 'a167': 927,
+ 'a168': 928,
+ 'a169': 928,
+ 'a17': 945,
+ 'a170': 834,
+ 'a171': 873,
+ 'a172': 828,
+ 'a173': 924,
+ 'a174': 917,
+ 'a175': 930,
+ 'a176': 931,
+ 'a177': 463,
+ 'a178': 883,
+ 'a179': 836,
+ 'a18': 974,
+ 'a180': 867,
+ 'a181': 696,
+ 'a182': 874,
+ 'a183': 760,
+ 'a184': 946,
+ 'a185': 865,
+ 'a186': 967,
+ 'a187': 831,
+ 'a188': 873,
+ 'a189': 927,
+ 'a19': 755,
+ 'a190': 970,
+ 'a191': 918,
+ 'a192': 748,
+ 'a193': 836,
+ 'a194': 771,
+ 'a195': 888,
+ 'a196': 748,
+ 'a197': 771,
+ 'a198': 888,
+ 'a199': 867,
+ 'a2': 961,
+ 'a20': 846,
+ 'a200': 696,
+ 'a201': 874,
+ 'a202': 974,
+ 'a203': 762,
+ 'a204': 759,
+ 'a205': 509,
+ 'a206': 410,
+ 'a21': 762,
+ 'a22': 761,
+ 'a23': 571,
+ 'a24': 677,
+ 'a25': 763,
+ 'a26': 760,
+ 'a27': 759,
+ 'a28': 754,
+ 'a29': 786,
+ 'a3': 980,
+ 'a30': 788,
+ 'a31': 788,
+ 'a32': 790,
+ 'a33': 793,
+ 'a34': 794,
+ 'a35': 816,
+ 'a36': 823,
+ 'a37': 789,
+ 'a38': 841,
+ 'a39': 823,
+ 'a4': 719,
+ 'a40': 833,
+ 'a41': 816,
+ 'a42': 831,
+ 'a43': 923,
+ 'a44': 744,
+ 'a45': 723,
+ 'a46': 749,
+ 'a47': 790,
+ 'a48': 792,
+ 'a49': 695,
+ 'a5': 789,
+ 'a50': 776,
+ 'a51': 768,
+ 'a52': 792,
+ 'a53': 759,
+ 'a54': 707,
+ 'a55': 708,
+ 'a56': 682,
+ 'a57': 701,
+ 'a58': 826,
+ 'a59': 815,
+ 'a6': 494,
+ 'a60': 789,
+ 'a61': 789,
+ 'a62': 707,
+ 'a63': 687,
+ 'a64': 696,
+ 'a65': 689,
+ 'a66': 786,
+ 'a67': 787,
+ 'a68': 713,
+ 'a69': 791,
+ 'a7': 552,
+ 'a70': 785,
+ 'a71': 791,
+ 'a72': 873,
+ 'a73': 761,
+ 'a74': 762,
+ 'a75': 759,
+ 'a76': 892,
+ 'a77': 892,
+ 'a78': 788,
+ 'a79': 784,
+ 'a8': 537,
+ 'a81': 438,
+ 'a82': 138,
+ 'a83': 277,
+ 'a84': 415,
+ 'a85': 509,
+ 'a86': 410,
+ 'a87': 234,
+ 'a88': 234,
+ 'a89': 390,
+ 'a9': 577,
+ 'a90': 390,
+ 'a91': 276,
+ 'a92': 276,
+ 'a93': 317,
+ 'a94': 317,
+ 'a95': 334,
+ 'a96': 334,
+ 'a97': 392,
+ 'a98': 392,
+ 'a99': 668,
+ 'space': 278}
- def status(self):
- #returns loaded fonts
- return self.__widtharrays.keys()
+# this is a hack - these are declared as 'StandardEncoding' in the PDF file,
+# which seems to mean 'ignore the names, always use this order'. The font
+# classes have special case code to use these.
+SymbolWidths = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,278,974,961,974,980,719,789,790,791,690,960,939,549,855,911,933,911,945,974,755,846,762,761,571,677,763,760,759,754,494,552,537,577,692,786,788,788,790,793,794,816,823,789,841,823,833,816,831,923,744,723,749,790,792,695,776,768,792,759,707,708,682,701,826,815,789,789,707,687,696,689,786,787,713,791,785,791,873,761,762,762,759,759,892,892,788,784,438,138,277,415,392,392,668,668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,732,544,544,910,667,760,760,776,595,694,626,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,894,838,1016,458,748,924,748,918,927,928,928,834,873,828,924,924,917,930,931,463,883,836,836,867,867,696,696,874,0,874,760,946,771,865,771,888,967,888,831,873,927,970,234,0]
+ZapfDingbatsWidths = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 333, 0, 500, 0, 833, 778, 0, 333, 333, 0, 549, 250, 0, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 549, 549, 549, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 0, 333, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 200, 480, 0, 0, 750, 0, 0, 500, 0, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 713, 0, 0, 0, 400, 549, 0, 0, 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 790]
- TheFontCache = FontCache()
+def test():
+ # load the standard ones:
+ from reportlab.pdfgen import fonts0
+ for baseFontName in standardEnglishFonts:
+ encoding = fonts0.WinAnsi
+ fontName = baseFontName + '-WinAnsi'
+ font = fonts0.BuiltInType1Font(fontName, baseFontName, encoding)
+ addWidths(fontName, font.getWidths())
+ #test it
+ msg = 'Hello World'
+ w = stringWidth(msg, fontName, 10)#
+ print 'width of "%s" in 10-point %s = %0.2f' % (msg, fontName, w)
- #expose the singleton as a single function
- stringWidth = TheFontCache.stringWidth
- loadFont = TheFontCache.loadFont
+if __name__=='__main__':
+ test()
+
\ No newline at end of file