From 725bb967e553c863972cc6bcb40910a3bcd79e3c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 11 Sep 2013 21:32:00 +0530 Subject: [PATCH] PDF Output: Serialize ToC string as UTF-16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PDF Output: Fix non-breaking space characters incorrectly rendered in PDF outline. Fixes #1223862 [PDF TOC -   appears sometimes as €](https://bugs.launchpad.net/calibre/+bug/1223862) --- src/calibre/ebooks/pdf/render/common.py | 9 ++++++++- src/calibre/ebooks/pdf/render/links.py | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/calibre/ebooks/pdf/render/common.py b/src/calibre/ebooks/pdf/render/common.py index d5f4b6a66b..8470a1b2db 100644 --- a/src/calibre/ebooks/pdf/render/common.py +++ b/src/calibre/ebooks/pdf/render/common.py @@ -100,11 +100,18 @@ class String(unicode): try: raw = s.encode('latin1') if raw.startswith(codecs.BOM_UTF16_BE): - raise UnicodeEncodeError('') + raw = codecs.BOM_UTF16_BE + s.encode('utf-16-be') except UnicodeEncodeError: raw = codecs.BOM_UTF16_BE + s.encode('utf-16-be') stream.write(b'('+raw+b')') +class UTF16String(unicode): + + def pdf_serialize(self, stream): + s = self.replace('\\', '\\\\').replace('(', r'\(').replace(')', r'\)') + raw = codecs.BOM_UTF16_BE + s.encode('utf-16-be') + stream.write(b'('+raw+b')') + class Dictionary(dict): def pdf_serialize(self, stream): diff --git a/src/calibre/ebooks/pdf/render/links.py b/src/calibre/ebooks/pdf/render/links.py index 4d0d588771..2f2b179ff4 100644 --- a/src/calibre/ebooks/pdf/render/links.py +++ b/src/calibre/ebooks/pdf/render/links.py @@ -11,7 +11,7 @@ import os from urlparse import urlparse from urllib2 import unquote -from calibre.ebooks.pdf.render.common import Array, Name, Dictionary, String +from calibre.ebooks.pdf.render.common import Array, Name, Dictionary, String, UTF16String class Destination(Array): @@ -131,7 +131,7 @@ class Links(object): a = self.anchors[path] dest = a.get(frag, a[None]) item = Dictionary({'Parent':parentref, 'Dest':dest, - 'Title':String(toc.text or _('Unknown'))}) + 'Title':UTF16String(toc.text or _('Unknown'))}) return self.pdf.objects.add(item)