Revision: 3708
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3708&view=rev
Author:   mdboom
Date:     2007-08-14 06:22:56 -0700 (Tue, 14 Aug 2007)

Log Message:
-----------
Make searching and copy/paste work in Pdf files (by adding a ToUnicode
CMap).  Only works with Type42 fonts.

Modified Paths:
--------------
    trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py     2007-08-14 
07:07:45 UTC (rev 3707)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_pdf.py     2007-08-14 
13:22:56 UTC (rev 3708)
@@ -485,6 +485,27 @@
             os.path.splitext(os.path.basename(filename))[0],
             symbol_name)
 
+    _identityToUnicodeCMap = """/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (Adobe)
+   /Ordering (UCS)
+   /Supplement 0
+>> def
+/CMapName /Adobe-Identity-UCS def
+/CMapType 2 def
+1 begincodespacerange
+<0000> <ffff>
+endcodespacerange
+%d beginbfrange
+%s
+endbfrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end"""
+    
     def embedTTF(self, filename, characters):
         """Embed the TTF font from the named file into the document."""
 
@@ -612,6 +633,7 @@
             cidToGidMapObject = self.reserveObject('CIDToGIDMap stream')
             fontfileObject = self.reserveObject('font file stream')
             wObject = self.reserveObject('Type 0 widths')
+            toUnicodeMapObject = self.reserveObject('ToUnicode map')
 
             cidFontDict = {
                 'Type'           : Name('Font'),
@@ -631,7 +653,8 @@
                 'Subtype'         : Name('Type0'),
                 'BaseFont'        : ps_name,
                 'Encoding'        : Name('Identity-H'),
-                'DescendantFonts' : [cidFontDictObject]
+                'DescendantFonts' : [cidFontDictObject],
+                'ToUnicode'       : toUnicodeMapObject
                 }
 
             # Make fontfile stream
@@ -652,9 +675,11 @@
             self.endStream()
             self.writeObject(length1Object, length1)
 
-            # Make the 'W' (Widths) array and the CidToGidMap at the same time
+            # Make the 'W' (Widths) array, CidToGidMap and ToUnicode CMap
+            # at the same time
             cid_to_gid_map = [u'\u0000'] * 65536
             cmap = font.get_charmap()
+            unicode_mapping = []
             widths = []
             max_ccode = 0
             for c in characters:
@@ -671,15 +696,28 @@
             last_ccode = -2
             w = []
             max_width = 0
+            unicode_groups = []
             for ccode, width in widths:
                 if ccode != last_ccode + 1:
                     w.append(ccode)
                     w.append([width])
+                    unicode_groups.append([ccode, ccode])
                 else:
                     w[-1].append(width)
+                    unicode_groups[-1][1] = ccode
                 max_width = max(max_width, width)
                 last_ccode = ccode
 
+            unicode_bfrange = []
+            for start, end in unicode_groups:
+                unicode_bfrange.append(
+                    "<%04x> <%04x> [%s]" %
+                    (start, end,
+                     " ".join(["<%04x>" % x for x in range(start, end+1)])))
+            unicode_cmap = (self._identityToUnicodeCMap %
+                            (len(unicode_groups),
+                             "\n".join(unicode_bfrange)))
+                
             # CIDToGIDMap stream
             cid_to_gid_map = "".join(cid_to_gid_map).encode("utf-16be")
             self.beginStream(cidToGidMapObject.id,
@@ -688,6 +726,13 @@
             self.currentstream.write(cid_to_gid_map)
             self.endStream()
 
+            # ToUnicode CMap
+            self.beginStream(toUnicodeMapObject.id,
+                             None,
+                             {'Length': unicode_cmap})
+            self.currentstream.write(unicode_cmap)
+            self.endStream()
+            
             descriptor['MaxWidth'] = max_width
 
             # Write everything out


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to