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)