1
0
mirror of https://github.com/gryf/ebook-converter.git synced 2026-03-18 07:43:53 +01:00

Enable docx write support

This commit is contained in:
2020-04-13 16:35:28 +02:00
parent a4533957f7
commit d3369d55bc
27 changed files with 103 additions and 131 deletions

View File

@@ -67,6 +67,7 @@ Currently, following formats are supported:
- lrf (for Sony readers) - lrf (for Sony readers)
- epub - epub
- mobi - mobi
- docx
Installation Installation

View File

@@ -1,9 +0,0 @@
#!/usr/bin/env python2
# vim:fileencoding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'

View File

@@ -10,15 +10,15 @@ import textwrap, os
from lxml import etree from lxml import etree
from lxml.builder import ElementMaker from lxml.builder import ElementMaker
from calibre import guess_type from ebook_converter import guess_type
from calibre.constants import numeric_version, __appname__ from ebook_converter.constants import numeric_version, __appname__
from calibre.ebooks.docx.names import DOCXNamespace from ebook_converter.ebooks.docx.names import DOCXNamespace
from calibre.ebooks.metadata import authors_to_string from ebook_converter.ebooks.metadata import authors_to_string
from calibre.ebooks.pdf.render.common import PAPER_SIZES from ebook_converter.ebooks.pdf.render.common import PAPER_SIZES
from calibre.utils.date import utcnow from ebook_converter.utils.date import utcnow
from calibre.utils.localization import canonicalize_lang, lang_as_iso639_1 from ebook_converter.utils.localization import canonicalize_lang, lang_as_iso639_1
from calibre.utils.zipfile import ZipFile from ebook_converter.utils.zipfile import ZipFile
from polyglot.builtins import iteritems, map, unicode_type, native_string_type from ebook_converter.polyglot.builtins import iteritems, map, unicode_type, native_string_type
def xml2str(root, pretty_print=False, with_tail=False): def xml2str(root, pretty_print=False, with_tail=False):

View File

@@ -8,9 +8,9 @@ __copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
from collections import defaultdict from collections import defaultdict
from uuid import uuid4 from uuid import uuid4
from calibre.ebooks.oeb.base import OEB_STYLES from ebook_converter.ebooks.oeb.base import OEB_STYLES
from calibre.ebooks.oeb.transforms.subset import find_font_face_rules from ebook_converter.ebooks.oeb.transforms.subset import find_font_face_rules
from polyglot.builtins import range from ebook_converter.polyglot.builtins import range
def obfuscate_font_data(data, key): def obfuscate_font_data(data, key):

View File

@@ -8,17 +8,17 @@ __copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
import re import re
from collections import Counter from collections import Counter
from calibre.ebooks.docx.writer.container import create_skeleton, page_size, page_effective_area from ebook_converter.ebooks.docx.writer.container import create_skeleton, page_size, page_effective_area
from calibre.ebooks.docx.writer.styles import StylesManager, FloatSpec from ebook_converter.ebooks.docx.writer.styles import StylesManager, FloatSpec
from calibre.ebooks.docx.writer.links import LinksManager from ebook_converter.ebooks.docx.writer.links import LinksManager
from calibre.ebooks.docx.writer.images import ImagesManager from ebook_converter.ebooks.docx.writer.images import ImagesManager
from calibre.ebooks.docx.writer.fonts import FontsManager from ebook_converter.ebooks.docx.writer.fonts import FontsManager
from calibre.ebooks.docx.writer.tables import Table from ebook_converter.ebooks.docx.writer.tables import Table
from calibre.ebooks.docx.writer.lists import ListsManager from ebook_converter.ebooks.docx.writer.lists import ListsManager
from calibre.ebooks.oeb.stylizer import Stylizer as Sz, Style as St from ebook_converter.ebooks.oeb.stylizer import Stylizer as Sz, Style as St
from calibre.ebooks.oeb.base import XPath, barename from ebook_converter.ebooks.oeb.base import XPath, barename
from calibre.utils.localization import lang_as_iso639_1 from ebook_converter.utils.localization import lang_as_iso639_1
from polyglot.builtins import unicode_type, string_or_bytes from ebook_converter.polyglot.builtins import unicode_type, string_or_bytes
def lang_for_tag(tag): def lang_for_tag(tag):
@@ -424,7 +424,7 @@ class Convert(object):
p.width_pts, p.height_pts = page_effective_area(self.opts) p.width_pts, p.height_pts = page_effective_area(self.opts)
def __call__(self): def __call__(self):
from calibre.ebooks.oeb.transforms.rasterize import SVGRasterizer from ebook_converter.ebooks.oeb.transforms.rasterize import SVGRasterizer
self.svg_rasterizer = SVGRasterizer(base_css=self.base_css) self.svg_rasterizer = SVGRasterizer(base_css=self.base_css)
self.svg_rasterizer(self.oeb, self.opts) self.svg_rasterizer(self.oeb, self.opts)

View File

@@ -9,15 +9,15 @@ import os
import posixpath import posixpath
from collections import namedtuple from collections import namedtuple
from functools import partial from functools import partial
from polyglot.builtins import iteritems, itervalues, map, unicode_type from ebook_converter.polyglot.builtins import iteritems, itervalues, map, unicode_type
from lxml import etree from lxml import etree
from calibre import fit_image from ebook_converter import fit_image
from calibre.ebooks.oeb.base import urlunquote from ebook_converter.ebooks.oeb.base import urlunquote
from calibre.ebooks.docx.images import pt_to_emu from ebook_converter.ebooks.docx.images import pt_to_emu
from calibre.utils.filenames import ascii_filename from ebook_converter.utils.filenames import ascii_filename
from calibre.utils.imghdr import identify from ebook_converter.utils.imghdr import identify
Image = namedtuple('Image', 'rid fname width height fmt item') Image = namedtuple('Image', 'rid fname width height fmt item')

View File

@@ -8,9 +8,9 @@ __copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
import posixpath, re import posixpath, re
from uuid import uuid4 from uuid import uuid4
from calibre.utils.filenames import ascii_text from ebook_converter.utils.filenames import ascii_text
from polyglot.builtins import unicode_type from ebook_converter.polyglot.builtins import unicode_type
from polyglot.urllib import urlparse from ebook_converter.polyglot.urllib import urlparse
def start_text(tag, prefix_len=0, top_level=True): def start_text(tag, prefix_len=0, top_level=True):

View File

@@ -8,7 +8,7 @@ __copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
from collections import defaultdict from collections import defaultdict
from operator import attrgetter from operator import attrgetter
from polyglot.builtins import iteritems, itervalues, unicode_type from ebook_converter.polyglot.builtins import iteritems, itervalues, unicode_type
LIST_STYLES = frozenset( LIST_STYLES = frozenset(
'disc circle square decimal decimal-leading-zero lower-roman upper-roman' 'disc circle square decimal decimal-leading-zero lower-roman upper-roman'

View File

@@ -11,10 +11,10 @@ from operator import attrgetter
from lxml import etree from lxml import etree
from calibre.ebooks import parse_css_length from ebook_converter.ebooks import parse_css_length
from calibre.ebooks.docx.writer.utils import convert_color, int_or_zero from ebook_converter.ebooks.docx.writer.utils import convert_color, int_or_zero
from calibre.utils.localization import lang_as_iso639_1 from ebook_converter.utils.localization import lang_as_iso639_1
from polyglot.builtins import iteritems, filter, unicode_type from ebook_converter.polyglot.builtins import iteritems, filter, unicode_type
from tinycss.css21 import CSS21Parser from tinycss.css21 import CSS21Parser
css_parser = CSS21Parser() css_parser = CSS21Parser()

View File

@@ -7,9 +7,9 @@ __copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
from collections import namedtuple from collections import namedtuple
from calibre.ebooks.docx.writer.utils import convert_color from ebook_converter.ebooks.docx.writer.utils import convert_color
from calibre.ebooks.docx.writer.styles import read_css_block_borders as rcbb, border_edges from ebook_converter.ebooks.docx.writer.styles import read_css_block_borders as rcbb, border_edges
from polyglot.builtins import iteritems, range, unicode_type from ebook_converter.polyglot.builtins import iteritems, range, unicode_type
class Dummy(object): class Dummy(object):

View File

@@ -8,10 +8,10 @@ __docformat__ = 'restructuredtext en'
from collections import defaultdict from collections import defaultdict
from calibre.ebooks.oeb.base import urlnormalize, css_text from ebook_converter.ebooks.oeb.base import urlnormalize, css_text
from calibre.utils.fonts.sfnt.subset import subset, NoGlyphs, UnsupportedFont from ebook_converter.utils.fonts.sfnt.subset import subset, NoGlyphs, UnsupportedFont
from polyglot.builtins import iteritems, itervalues, unicode_type, range from ebook_converter.polyglot.builtins import iteritems, itervalues, unicode_type, range
from tinycss.fonts3 import parse_font_family from ebook_converter.tinycss.fonts3 import parse_font_family
def get_font_properties(rule, default=None): def get_font_properties(rule, default=None):

View File

@@ -1,10 +0,0 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2012, Kovid Goyal <kovid at kovidgoyal.net>'
__docformat__ = 'restructuredtext en'

View File

@@ -10,12 +10,12 @@ import codecs, zlib, numbers
from io import BytesIO from io import BytesIO
from datetime import datetime from datetime import datetime
from calibre.constants import plugins, ispy3 from ebook_converter.constants import ispy3
from calibre.utils.logging import default_log from ebook_converter.utils.logging import default_log
from polyglot.builtins import iteritems, unicode_type, codepoint_to_chr from ebook_converter.polyglot.builtins import iteritems, unicode_type, codepoint_to_chr
from polyglot.binary import as_hex_bytes from ebook_converter.polyglot.binary import as_hex_bytes
pdf_float = plugins['speedup'][0].pdf_float pdf_float = lambda x: f"{x:.1f}"
EOL = b'\n' EOL = b'\n'

View File

@@ -75,6 +75,6 @@ def load_font(stream_or_path):
raw = stream_or_path raw = stream_or_path
if hasattr(raw, 'read'): if hasattr(raw, 'read'):
raw = raw.read() raw = raw.read()
from calibre.utils.fonts.sfnt.container import Sfnt from ebook_converter.utils.fonts.sfnt.container import Sfnt
return Sfnt(raw) return Sfnt(raw)

View File

@@ -1,10 +0,0 @@
#!/usr/bin/env python2
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai
from __future__ import absolute_import, division, print_function, unicode_literals
__license__ = 'GPL v3'
__copyright__ = '2012, Kovid Goyal <kovid at kovidgoyal.net>'
__docformat__ = 'restructuredtext en'

View File

@@ -7,7 +7,7 @@ __copyright__ = '2012, Kovid Goyal <kovid at kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
from struct import pack, unpack_from from struct import pack, unpack_from
from polyglot.builtins import range, unicode_type from ebook_converter.polyglot.builtins import range, unicode_type
t1_operand_encoding = [None] * 256 t1_operand_encoding = [None] * 256
t1_operand_encoding[0:32] = (32) * ["do_operator"] t1_operand_encoding[0:32] = (32) * ["do_operator"]

View File

@@ -9,12 +9,12 @@ __docformat__ = 'restructuredtext en'
from struct import unpack_from, unpack, calcsize from struct import unpack_from, unpack, calcsize
from functools import partial from functools import partial
from calibre.utils.fonts.sfnt import UnknownTable from ebook_converter.utils.fonts.sfnt import UnknownTable
from calibre.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs
from calibre.utils.fonts.sfnt.cff.dict_data import TopDict, PrivateDict from ebook_converter.utils.fonts.sfnt.cff.dict_data import TopDict, PrivateDict
from calibre.utils.fonts.sfnt.cff.constants import (cff_standard_strings, from ebook_converter.utils.fonts.sfnt.cff.constants import (cff_standard_strings,
STANDARD_CHARSETS) STANDARD_CHARSETS)
from polyglot.builtins import iteritems, itervalues, range from ebook_converter.polyglot.builtins import iteritems, itervalues, range
# Useful links # Useful links
# http://www.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5176.CFF.pdf # http://www.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5176.CFF.pdf
@@ -194,7 +194,7 @@ class CFFTable(UnknownTable):
self.cff = CFF(self.raw) self.cff = CFF(self.raw)
def subset(self, character_map, extra_glyphs): def subset(self, character_map, extra_glyphs):
from calibre.utils.fonts.sfnt.cff.writer import Subset from ebook_converter.utils.fonts.sfnt.cff.writer import Subset
# Map codes from the cmap table to glyph names, this will be used to # Map codes from the cmap table to glyph names, this will be used to
# reconstruct character_map for the subset font # reconstruct character_map for the subset font
charset_map = {code:self.cff.charset.safe_lookup(glyph_id) for code, charset_map = {code:self.cff.charset.safe_lookup(glyph_id) for code,

View File

@@ -12,10 +12,10 @@ __docformat__ = 'restructuredtext en'
from struct import unpack_from, calcsize, pack from struct import unpack_from, calcsize, pack
from collections import OrderedDict from collections import OrderedDict
from calibre.utils.fonts.utils import read_bmp_prefix from ebook_converter.utils.fonts.utils import read_bmp_prefix
from calibre.utils.fonts.sfnt import UnknownTable, max_power_of_two from ebook_converter.utils.fonts.sfnt import UnknownTable, max_power_of_two
from calibre.utils.fonts.sfnt.errors import UnsupportedFont from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont
from polyglot.builtins import range from ebook_converter.polyglot.builtins import range
def split_range(start_code, end_code, cmap): # {{{ def split_range(start_code, end_code, cmap): # {{{

View File

@@ -9,8 +9,8 @@ __docformat__ = 'restructuredtext en'
from struct import unpack_from, calcsize from struct import unpack_from, calcsize
from collections import OrderedDict, namedtuple from collections import OrderedDict, namedtuple
from calibre.utils.fonts.sfnt.errors import UnsupportedFont from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont
from polyglot.builtins import range, iteritems from ebook_converter.polyglot.builtins import range, iteritems
class Unpackable(object): class Unpackable(object):

View File

@@ -7,19 +7,19 @@ from collections import OrderedDict
from io import BytesIO from io import BytesIO
from struct import calcsize, pack from struct import calcsize, pack
from calibre.utils.fonts.sfnt import UnknownTable, align_block, max_power_of_two from ebook_converter.utils.fonts.sfnt import UnknownTable, align_block, max_power_of_two
from calibre.utils.fonts.sfnt.cff.table import CFFTable from ebook_converter.utils.fonts.sfnt.cff.table import CFFTable
from calibre.utils.fonts.sfnt.cmap import CmapTable from ebook_converter.utils.fonts.sfnt.cmap import CmapTable
from calibre.utils.fonts.sfnt.errors import UnsupportedFont from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont
from calibre.utils.fonts.sfnt.glyf import GlyfTable from ebook_converter.utils.fonts.sfnt.glyf import GlyfTable
from calibre.utils.fonts.sfnt.gsub import GSUBTable from ebook_converter.utils.fonts.sfnt.gsub import GSUBTable
from calibre.utils.fonts.sfnt.head import ( from ebook_converter.utils.fonts.sfnt.head import (
HeadTable, HorizontalHeader, OS2Table, PostTable, VerticalHeader HeadTable, HorizontalHeader, OS2Table, PostTable, VerticalHeader
) )
from calibre.utils.fonts.sfnt.kern import KernTable from ebook_converter.utils.fonts.sfnt.kern import KernTable
from calibre.utils.fonts.sfnt.loca import LocaTable from ebook_converter.utils.fonts.sfnt.loca import LocaTable
from calibre.utils.fonts.sfnt.maxp import MaxpTable from ebook_converter.utils.fonts.sfnt.maxp import MaxpTable
from calibre.utils.fonts.utils import checksum_of_block, get_tables, verify_checksums from ebook_converter.utils.fonts.utils import checksum_of_block, get_tables, verify_checksums
# OpenType spec: http://www.microsoft.com/typography/otspec/otff.htm # OpenType spec: http://www.microsoft.com/typography/otspec/otff.htm

View File

@@ -9,8 +9,8 @@ __docformat__ = 'restructuredtext en'
from struct import unpack_from from struct import unpack_from
from collections import OrderedDict from collections import OrderedDict
from calibre.utils.fonts.sfnt import UnknownTable from ebook_converter.utils.fonts.sfnt import UnknownTable
from polyglot.builtins import iteritems from ebook_converter.polyglot.builtins import iteritems
ARG_1_AND_2_ARE_WORDS = 0x0001 # if set args are words otherwise they are bytes ARG_1_AND_2_ARE_WORDS = 0x0001 # if set args are words otherwise they are bytes
ARGS_ARE_XY_VALUES = 0x0002 # if set args are xy values, otherwise they are points ARGS_ARE_XY_VALUES = 0x0002 # if set args are xy values, otherwise they are points

View File

@@ -9,12 +9,12 @@ __docformat__ = 'restructuredtext en'
from struct import unpack_from from struct import unpack_from
from functools import partial from functools import partial
from calibre.utils.fonts.sfnt import UnknownTable, FixedProperty from ebook_converter.utils.fonts.sfnt import UnknownTable, FixedProperty
from calibre.utils.fonts.sfnt.errors import UnsupportedFont from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont
from calibre.utils.fonts.sfnt.common import (ScriptListTable, FeatureListTable, from ebook_converter.utils.fonts.sfnt.common import (ScriptListTable, FeatureListTable,
SimpleListTable, LookupTable, ExtensionSubstitution, SimpleListTable, LookupTable, ExtensionSubstitution,
UnknownLookupSubTable) UnknownLookupSubTable)
from polyglot.builtins import iteritems, itervalues from ebook_converter.polyglot.builtins import iteritems, itervalues
class SingleSubstitution(UnknownLookupSubTable): class SingleSubstitution(UnknownLookupSubTable):

View File

@@ -8,10 +8,10 @@ __docformat__ = 'restructuredtext en'
from struct import unpack_from, pack, calcsize from struct import unpack_from, pack, calcsize
from calibre.utils.fonts.sfnt import UnknownTable, DateTimeProperty, FixedProperty from ebook_converter.utils.fonts.sfnt import UnknownTable, DateTimeProperty, FixedProperty
from calibre.utils.fonts.sfnt.errors import UnsupportedFont from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont
from calibre.utils.fonts.sfnt.loca import read_array from ebook_converter.utils.fonts.sfnt.loca import read_array
from polyglot.builtins import zip from ebook_converter.polyglot.builtins import zip
class HeadTable(UnknownTable): class HeadTable(UnknownTable):

View File

@@ -8,10 +8,10 @@ __docformat__ = 'restructuredtext en'
from struct import unpack_from, calcsize, pack, error as struct_error from struct import unpack_from, calcsize, pack, error as struct_error
from calibre.utils.fonts.sfnt import (UnknownTable, FixedProperty, from ebook_converter.utils.fonts.sfnt import (UnknownTable, FixedProperty,
max_power_of_two) max_power_of_two)
from calibre.utils.fonts.sfnt.errors import UnsupportedFont from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont
from polyglot.builtins import range from ebook_converter.polyglot.builtins import range
class KernTable(UnknownTable): class KernTable(UnknownTable):

View File

@@ -10,8 +10,8 @@ import array, sys
from operator import itemgetter from operator import itemgetter
from itertools import repeat from itertools import repeat
from calibre.utils.fonts.sfnt import UnknownTable from ebook_converter.utils.fonts.sfnt import UnknownTable
from polyglot.builtins import iteritems, range from ebook_converter.polyglot.builtins import iteritems, range
def four_byte_type_code(): def four_byte_type_code():

View File

@@ -8,9 +8,9 @@ __docformat__ = 'restructuredtext en'
from struct import unpack_from, pack from struct import unpack_from, pack
from calibre.utils.fonts.sfnt import UnknownTable, FixedProperty from ebook_converter.utils.fonts.sfnt import UnknownTable, FixedProperty
from calibre.utils.fonts.sfnt.errors import UnsupportedFont from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont
from polyglot.builtins import zip from ebook_converter.polyglot.builtins import zip
class MaxpTable(UnknownTable): class MaxpTable(UnknownTable):

View File

@@ -11,10 +11,10 @@ from collections import OrderedDict
from operator import itemgetter from operator import itemgetter
from functools import partial from functools import partial
from calibre.utils.icu import safe_chr, ord_string from ebook_converter.utils.icu import safe_chr, ord_string
from calibre.utils.fonts.sfnt.container import Sfnt from ebook_converter.utils.fonts.sfnt.container import Sfnt
from calibre.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs
from polyglot.builtins import unicode_type, range, iteritems, itervalues, map from ebook_converter.polyglot.builtins import unicode_type, range, iteritems, itervalues, map
# TrueType outlines {{{ # TrueType outlines {{{
@@ -193,7 +193,7 @@ def subset(raw, individual_chars, ranges=(), warnings=None):
def option_parser(): def option_parser():
import textwrap import textwrap
from calibre.utils.config import OptionParser from ebook_converter.utils.config import OptionParser
parser = OptionParser(usage=textwrap.dedent('''\ parser = OptionParser(usage=textwrap.dedent('''\
%prog [options] input_font_file output_font_file characters_to_keep %prog [options] input_font_file output_font_file characters_to_keep
@@ -212,7 +212,7 @@ def option_parser():
def print_stats(old_stats, new_stats): def print_stats(old_stats, new_stats):
from calibre import prints from ebook_converter import prints
prints('========= Table comparison (original vs. subset) =========') prints('========= Table comparison (original vs. subset) =========')
prints('Table', ' ', '%10s'%'Size', ' ', 'Percent', ' ', '%10s'%'New Size', prints('Table', ' ', '%10s'%'Size', ' ', 'Percent', ' ', '%10s'%'New Size',
' New Percent') ' New Percent')
@@ -236,7 +236,7 @@ def print_stats(old_stats, new_stats):
def main(args): def main(args):
import sys, time import sys, time
from calibre import prints from ebook_converter import prints
parser = option_parser() parser = option_parser()
opts, args = parser.parse_args(args) opts, args = parser.parse_args(args)
if len(args) < 4 or len(args) > 4: if len(args) < 4 or len(args) > 4:
@@ -303,7 +303,7 @@ if __name__ == '__main__':
def test_mem(): def test_mem():
from calibre.utils.mem import memory from ebook_converter.utils.mem import memory
import gc import gc
gc.collect() gc.collect()
start_mem = memory() start_mem = memory()
@@ -325,7 +325,7 @@ def test():
def all(): def all():
from calibre.utils.fonts.scanner import font_scanner from ebook_converter.utils.fonts.scanner import font_scanner
failed = [] failed = []
unsupported = [] unsupported = []
warnings = {} warnings = {}