Re: Chinese Custom Glyphs

Robin Becker <[email protected]>
Newsgroups gmane.comp.python.reportlab.user
Message-ID <[email protected]>
Hi Daniel,

The code that reads the PS name is below; effectively we're looking for a name 
to use further down the line; in particular we use it in the subset naming.

I don't think you need to care about the exact name, but I managed to use a 
completely made up name using this patch

diff -r c903815560d1 src/reportlab/pdfbase/ttfonts.py
--- a/src/reportlab/pdfbase/ttfonts.py  Wed Jun 24 14:13:27 2015 +0100
+++ b/src/reportlab/pdfbase/ttfonts.py  Wed Jul 01 16:31:05 2015 +0100
@@ -57,6 +57,7 @@
  from reportlab import rl_config
  from reportlab.lib.rl_accel import hex32, add32, calcChecksum, 
instanceStringWidthTTF
  from collections import namedtuple
+import time

  class TTFError(pdfdoc.PDFError):
      "TrueType font exception"
@@ -395,6 +396,7 @@

  class TTFontFile(TTFontParser):
      "TTF file parser and generator"
+    _ninc = 0

      def __init__(self, file, charInfo=1, validate=0,subfontIndex=0):
          """Loads and parses a TrueType font file.
@@ -490,7 +492,9 @@

          # Don't just assume, check for None since some shoddy fonts cause 
crashes here...
          if not psName:
-            raise TTFError("Could not find PostScript font name")
+            self.name = '_rl_%s_%s_ttf' % (time.time(), self.__class__._ninc)
+            self.__class__._ninc += 1
+            #raise TTFError("Could not find PostScript font name")
          for c in psName:
              if char2int(c)>126 or c in b' [](){}<>/%':
                  raise TTFError("psName=%r contains invalid character %s" % 
(psName,ascii(c)))

ie instead of raising an error just fake a name based on current time.



> 		# name - Naming table
> 		name_offset = self.seek_table("name")
> 		format = self.read_ushort()
> 		if format != 0:
> 			raise TTFError("Unknown name table format (%d)" % format)
> 		numRecords = self.read_ushort()
> 		string_data_offset = name_offset + self.read_ushort()
> 		names = {1:None,2:None,3:None,4:None,6:None}
> 		K = list(names.keys())
> 		nameCount = len(names)
> 		for i in xrange(numRecords):
> 			platformId = self.read_ushort()
> 			encodingId = self.read_ushort()
> 			languageId = self.read_ushort()
> 			nameId = self.read_ushort()
> 			length = self.read_ushort()
> 			offset = self.read_ushort()
> 			if nameId not in K: continue
> 			N = None
> 			if platformId == 3 and encodingId == 1 and languageId == 0x409: # Microsoft, Unicode, US English, PS Name
> 				opos = self._pos
> 				try:
> 					self.seek(string_data_offset + offset)
> 					if length % 2 != 0:
> 						raise TTFError("PostScript name is UTF-16BE string of odd length")
> 					length /= 2
> 					N = []
> 					A = N.append
> 					while length > 0:
> 						char = self.read_ushort()
> 						A(bytes([char]) if isPy3 else chr(char))
> 						length -= 1
> 					N = b''.join(N)
> 				finally:
> 					self._pos = opos
> 			elif platformId == 1 and encodingId == 0 and languageId == 0: # Macintosh, Roman, English, PS Name
> 				# According to OpenType spec, if PS name exists, it must exist
> 				# both in MS Unicode and Macintosh Roman formats.  Apparently,
> 				# you can find live TTF fonts which only have Macintosh format.
> 				N = self.get_chunk(string_data_offset + offset, length)
> 			if N and names[nameId]==None:
> 				names[nameId] = N
> 				nameCount -= 1
> 				if nameCount==0: break
> 		if names[6] is not None:
> 			psName = names[6].replace(b" ", b"-")  #Dinu Gherman's fix for font names with spaces
> 		elif names[4] is not None:
> 			psName = names[4].replace(b" ", b"-")
> 		# Fine, one last try before we bail.
> 		elif names[1] is not None:
> 			psName = names[1].replace(b" ", b"-")
> 		else:
> 			psName = None



On 01/07/2015 15:26, Daniel Casper wrote:
> To whom it may concern,
>
>
>
> I wanted to reach out and discuss the state of custom character set /
> custom glyph support for the ReportLab libraries.  We currently use the
> open source package in PDF Generation utilities that are used in many
> countries.  In China specifically, our users make use of the Private
> Character Editor to provide custom glyphs for fonts on their systems.  They
> then choose the font EUDC to include those custom glyphs for their
> documents.  Unfortunately, when attempting to register this font with the
> ReportLab library we receive the following traceback:
>
>
>
> Traceback (most recent call last):
>
>    File reportlab\pdfbase\ttfonts.pyo, line 1009, in __init__
>
>    File reportlab\pdfbase\ttfonts.pyo, line 915, in __init__
>
>    File reportlab\pdfbase\ttfonts.pyo, line 413, in __init__
>
>    File reportlab\pdfbase\ttfonts.pyo, line 499, in extractInfo
>
> TTFError: Could not find PostScript font name
>
>
> Has anyone else worked with fonts that don't contain these PostScript
> names, or is there some other way to go about getting them embedded?
>
I think it's possible there is a name, but we are looking for the wrong one.



> Thanks in advance,
>
>
>
> --Dan
...........
-- 
Robin Becker
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.