From 20bb107a3a214c74b919f80d624930574b70f696 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 20 Dec 2012 21:55:15 +0530 Subject: [PATCH] OTF embedding --- src/calibre/ebooks/pdf/render/engine.py | 5 +++-- src/calibre/ebooks/pdf/render/fonts.py | 16 ++++++++++------ src/calibre/ebooks/pdf/render/serialize.py | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/calibre/ebooks/pdf/render/engine.py b/src/calibre/ebooks/pdf/render/engine.py index f429d876ac..a1f0361473 100644 --- a/src/calibre/ebooks/pdf/render/engine.py +++ b/src/calibre/ebooks/pdf/render/engine.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, traceback +import sys, traceback, unicodedata from math import sqrt from collections import namedtuple from functools import wraps @@ -358,6 +358,7 @@ class PdfEngine(QPaintEngine): def drawTextItem(self, point, text_item): # super(PdfEngine, self).drawTextItem(point+QPoint(0, 0), text_item) text = type(u'')(text_item.text()).replace('\n', ' ') + text = unicodedata.normalize('NFKC', text) tl = QTextLayout(text, text_item.font(), self.paintDevice()) self.text_option.setTextDirection(Qt.RightToLeft if text_item.renderFlags() & text_item.RightToLeft else Qt.LeftToRight) @@ -488,7 +489,7 @@ if __name__ == '__main__': # f.setUnderline(True) # f.setOverline(True) # f.setStrikeOut(True) - f.setFamily('Calibri') + f.setFamily('OpenDyslexic') p.setFont(f) # p.scale(2, 2) # p.rotate(45) diff --git a/src/calibre/ebooks/pdf/render/fonts.py b/src/calibre/ebooks/pdf/render/fonts.py index a9a1fc795e..b0012c3dd7 100644 --- a/src/calibre/ebooks/pdf/render/fonts.py +++ b/src/calibre/ebooks/pdf/render/fonts.py @@ -55,7 +55,7 @@ class FontStream(Stream): def add_extra_keys(self, d): d['Length1'] = d['DL'] if self.is_otf: - d['Subtype'] = Name('OpenType') + d['Subtype'] = Name('CIDFontType0C') def to_hex_string(c): return bytes(hex(c)[2:]).rjust(4, b'0').decode('ascii') @@ -110,6 +110,7 @@ class Font(object): def __init__(self, metrics, num, objects, compress): self.metrics, self.compress = metrics, compress + self.is_otf = self.metrics.is_otf self.subset_tag = bytes(re.sub('.', lambda m: chr(int(m.group())+ord('A')), oct(num))).rjust(6, b'A').decode('ascii') self.font_stream = FontStream(metrics.is_otf, compress=compress) @@ -136,7 +137,7 @@ class Font(object): 'Supplement':0, }), }) - if not metrics.is_otf: + if not self.is_otf: self.descendant_font['CIDToGIDMap'] = Name('Identity') self.font_dict = Dictionary({ @@ -150,14 +151,17 @@ class Font(object): self.used_glyphs = set() def embed(self, objects): - # TODO: Subsetting and OpenType - self.font_descriptor['FontFile2'] = objects.add(self.font_stream) + self.font_descriptor['FontFile'+('3' if self.is_otf else '2') + ] = objects.add(self.font_stream) self.write_widths(objects) glyph_map = self.metrics.sfnt['cmap'].get_char_codes(self.used_glyphs) self.write_to_unicode(objects, glyph_map) pdf_subset(self.metrics.sfnt, set(glyph_map)) - self.metrics.os2.zero_fstype() - self.metrics.sfnt(self.font_stream) + if self.is_otf: + self.font_stream.write(self.metrics.sfnt['CFF '].raw) + else: + self.metrics.os2.zero_fstype() + self.metrics.sfnt(self.font_stream) def write_to_unicode(self, objects, glyph_map): glyph_map = {k:unicodedata.normalize('NFKC', unichr(v)) for k, v in diff --git a/src/calibre/ebooks/pdf/render/serialize.py b/src/calibre/ebooks/pdf/render/serialize.py index d7e31adc4c..503c299dc5 100644 --- a/src/calibre/ebooks/pdf/render/serialize.py +++ b/src/calibre/ebooks/pdf/render/serialize.py @@ -18,7 +18,7 @@ from calibre.ebooks.pdf.render.common import ( GlyphIndex) from calibre.ebooks.pdf.render.fonts import FontManager -PDFVER = b'%PDF-1.6' +PDFVER = b'%PDF-1.3' Color = namedtuple('Color', 'red green blue opacity')