--- a/reportlab/pdfbase/ttfonts.py Mon Jun 05 13:55:03 2006 +0000
+++ b/reportlab/pdfbase/ttfonts.py Mon Jun 05 14:08:23 2006 +0000
@@ -104,14 +104,13 @@
"<00> <%02X>" % (len(subset) - 1),
"endcodespacerange",
"%d beginbfchar" % len(subset)
- ] + map(lambda n, subset=subset: "<%02X> <%04X>" % (n, subset[n]),
- xrange(len(subset))) + [
+ ] + ["<%02X> <%04X>" % (i,v) for i,v in enumerate(subset)] + [
"endbfchar",
"endcmap",
"CMapName currentdict /CMap defineresource pop",
"end",
"end"
- ]
+ ]
return string.join(cmap, "\n")
def splice(stream, offset, value):
@@ -771,11 +770,11 @@
self.skip(4)
elif flags & GF_WE_HAVE_A_TWO_BY_TWO:
self.skip(8)
- n = n + 1
+ n += 1
numGlyphs = n = len(glyphMap)
while n > 1 and self.hmetrics[n][0] == self.hmetrics[n - 1][0]:
- n = n - 1
+ n -= 1
numberOfHMetrics = n
# The following tables are simply copied from the original
@@ -975,22 +974,26 @@
"""
class State:
- def __init__(self):
+ def __init__(self,asciiReadable=1):
self.assignments = {}
self.nextCode = 0
self.internalName = None
self.frozen = 0
- # Let's add the first 128 unicodes to the 0th subset, so ' '
- # always has code 32 (for word spacing to work) and the ASCII
- # output is readable
- subset0 = range(128)
- self.subsets = [subset0]
- for n in subset0:
- self.assignments[n] = n
- self.nextCode = 128
+ if asciiReadable:
+ # Let's add the first 128 unicodes to the 0th subset, so ' '
+ # always has code 32 (for word spacing to work) and the ASCII
+ # output is readable
+ subset0 = range(128)
+ self.subsets = [subset0]
+ for n in subset0:
+ self.assignments[n] = n
+ self.nextCode = 128
+ else:
+ self.subsets = [[32]*33]
+ self.assignments[32] = 32
- def __init__(self, name, filename, validate=0, subfontIndex=0):
+ def __init__(self, name, filename, validate=0, subfontIndex=0,asciiReadable=1):
"""Loads a TrueType font from filename.
If validate is set to a false values, skips checksum validation. This
@@ -1002,6 +1005,7 @@
self._multiByte = 1 # We want our own stringwidth
self._dynamicFont = 1 # We want dynamic subsetting
self.state = {}
+ self._asciiReadable = asciiReadable
def _py_stringWidth(self, text, size, encoding='utf-8'):
"Calculate text width"
@@ -1017,38 +1021,43 @@
single subset. Returns a list of tuples (subset, string). Use subset
numbers with getSubsetInternalName. Doc is needed for distinguishing
subsets when building different documents at the same time."""
+ asciiReadable = self._asciiReadable
try: state = self.state[doc]
- except KeyError: state = self.state[doc] = TTFont.State()
+ except KeyError: state = self.state[doc] = TTFont.State(asciiReadable)
curSet = -1
cur = []
results = []
if type(text) is not UnicodeType:
text = unicode(text, encoding or 'utf-8') # encoding defaults to utf-8
+ assignments = state.assignments
+ subsets = state.subsets
for code in map(ord,text):
- if state.assignments.has_key(code):
- n = state.assignments[code]
+ if assignments.has_key(code):
+ n = assignments[code]
else:
if state.frozen:
raise pdfdoc.PDFError, "Font %s is already frozen, cannot add new character U+%04X" % (self.fontName, code)
n = state.nextCode
- if n & 0xFF == 32:
+ if n&0xFF==32:
# make code 32 always be a space character
- state.subsets[n >> 8].append(32)
+ if n!=32: subsets[n >> 8].append(32)
state.nextCode += 1
n = state.nextCode
state.nextCode += 1
- state.assignments[code] = n
- if (n & 0xFF) == 0:
- state.subsets.append([])
- state.subsets[n >> 8].append(code)
+ assignments[code] = n
+ if n>32:
+ if not(n&0xFF): subsets.append([])
+ subsets[n >> 8].append(code)
+ else:
+ subsets[0][n] = code
if (n >> 8) != curSet:
if cur:
- results.append((curSet, string.join(map(chr, cur), "")))
+ results.append((curSet, ''.join(map(chr,cur))))
curSet = (n >> 8)
cur = []
cur.append(n & 0xFF)
if cur:
- results.append((curSet, string.join(map(chr, cur), "")))
+ results.append((curSet,''.join(map(chr,cur))))
return results
def getSubsetInternalName(self, subset, doc):
@@ -1056,7 +1065,7 @@
subset of this dynamic font. Use this function instead of
PDFDocument.getInternalFontName."""
try: state = self.state[doc]
- except KeyError: state = self.state[doc] = TTFont.State()
+ except KeyError: state = self.state[doc] = TTFont.State(self._asciiReadable)
if subset < 0 or subset >= len(state.subsets):
raise IndexError, 'Subset %d does not exist in font %s' % (subset, self.fontName)
if state.internalName is None:
@@ -1074,10 +1083,9 @@
FontDescriptor is a (no more than) 256 character subset of the original
TrueType font."""
try: state = self.state[doc]
- except KeyError: state = self.state[doc] = TTFont.State()
+ except KeyError: state = self.state[doc] = TTFont.State(self._asciiReadable)
state.frozen = 1
- for n in xrange(len(state.subsets)):
- subset = state.subsets[n]
+ for n,subset in enumerate(state.subsets):
internalName = self.getSubsetInternalName(n, doc)[1:]
baseFontName = "%s+%s%s" % (SUBSETN(n),self.face.name,self.face.subfontNameX)
--- a/reportlab/test/test_multibyte_jpn.py Mon Jun 05 13:55:03 2006 +0000
+++ b/reportlab/test/test_multibyte_jpn.py Mon Jun 05 14:08:23 2006 +0000
@@ -164,14 +164,15 @@
c.setFont('Helvetica', 30)
c.drawString(100,700, 'Japanese TrueType Font Support')
- msg = u'\u6771\u4EAC : Unicode font, utf8 input'.encode('utf8')
+ msg = u'\u6771\u4EAC : Unicode font'.encode('utf8')
+ msg2 = u'utf8 input 0123456789 ABCDEF'.encode('utf8')
from reportlab.pdfbase.ttfonts import TTFont
try:
- msmincho = TTFont('MS Mincho','msmincho.ttc',subfontIndex=0)
+ msmincho = TTFont('MS Mincho','msmincho.ttc',subfontIndex=0,asciiReadable=0)
fn = ' file=msmincho.ttc subfont 0'
except:
try:
- msmincho = TTFont('MS Mincho','msmincho.ttf')
+ msmincho = TTFont('MS Mincho','msmincho.ttf',asciiReadable=0)
fn = 'file=msmincho.ttf'
except:
msmincho = None
@@ -180,17 +181,21 @@
else:
pdfmetrics.registerFont(msmincho)
c.setFont('MS Mincho', 30)
- c.drawString(100,600, msg+fn)
+ c.drawString(100,600, msg)
+ c.drawString(100,570, msg2)
+ c.drawString(100,540, fn)
if fn.endswith('0'):
try:
- msmincho1 = TTFont('MS Mincho 1','msmincho.ttc',subfontIndex=1)
+ msmincho1 = TTFont('MS Mincho 1','msmincho.ttc',subfontIndex=1,asciiPreload=0)
pdfmetrics.registerFont(msmincho1)
fn = ' file=msmincho.ttc subfont 1'
c.setFont('MS Mincho 1',30)
c.drawString(100,500,msg+fn)
except:
c.setFont('Helvetica',30)
- c.drawString(100,500,msg+fn)
+ c.drawString(100,500,msg)
+ c.drawString(100,470, msg2)
+ c.drawString(100,440, fn)
c.showPage()