1
0
mirror of https://github.com/gryf/ebook-converter.git synced 2026-01-01 15:32:26 +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)
- epub
- mobi
- docx
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.builder import ElementMaker
from calibre import guess_type
from calibre.constants import numeric_version, __appname__
from calibre.ebooks.docx.names import DOCXNamespace
from calibre.ebooks.metadata import authors_to_string
from calibre.ebooks.pdf.render.common import PAPER_SIZES
from calibre.utils.date import utcnow
from calibre.utils.localization import canonicalize_lang, lang_as_iso639_1
from calibre.utils.zipfile import ZipFile
from polyglot.builtins import iteritems, map, unicode_type, native_string_type
from ebook_converter import guess_type
from ebook_converter.constants import numeric_version, __appname__
from ebook_converter.ebooks.docx.names import DOCXNamespace
from ebook_converter.ebooks.metadata import authors_to_string
from ebook_converter.ebooks.pdf.render.common import PAPER_SIZES
from ebook_converter.utils.date import utcnow
from ebook_converter.utils.localization import canonicalize_lang, lang_as_iso639_1
from ebook_converter.utils.zipfile import ZipFile
from ebook_converter.polyglot.builtins import iteritems, map, unicode_type, native_string_type
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 uuid import uuid4
from calibre.ebooks.oeb.base import OEB_STYLES
from calibre.ebooks.oeb.transforms.subset import find_font_face_rules
from polyglot.builtins import range
from ebook_converter.ebooks.oeb.base import OEB_STYLES
from ebook_converter.ebooks.oeb.transforms.subset import find_font_face_rules
from ebook_converter.polyglot.builtins import range
def obfuscate_font_data(data, key):

View File

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

View File

@@ -9,15 +9,15 @@ import os
import posixpath
from collections import namedtuple
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 calibre import fit_image
from calibre.ebooks.oeb.base import urlunquote
from calibre.ebooks.docx.images import pt_to_emu
from calibre.utils.filenames import ascii_filename
from calibre.utils.imghdr import identify
from ebook_converter import fit_image
from ebook_converter.ebooks.oeb.base import urlunquote
from ebook_converter.ebooks.docx.images import pt_to_emu
from ebook_converter.utils.filenames import ascii_filename
from ebook_converter.utils.imghdr import identify
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
from uuid import uuid4
from calibre.utils.filenames import ascii_text
from polyglot.builtins import unicode_type
from polyglot.urllib import urlparse
from ebook_converter.utils.filenames import ascii_text
from ebook_converter.polyglot.builtins import unicode_type
from ebook_converter.polyglot.urllib import urlparse
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 operator import attrgetter
from polyglot.builtins import iteritems, itervalues, unicode_type
from ebook_converter.polyglot.builtins import iteritems, itervalues, unicode_type
LIST_STYLES = frozenset(
'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 calibre.ebooks import parse_css_length
from calibre.ebooks.docx.writer.utils import convert_color, int_or_zero
from calibre.utils.localization import lang_as_iso639_1
from polyglot.builtins import iteritems, filter, unicode_type
from ebook_converter.ebooks import parse_css_length
from ebook_converter.ebooks.docx.writer.utils import convert_color, int_or_zero
from ebook_converter.utils.localization import lang_as_iso639_1
from ebook_converter.polyglot.builtins import iteritems, filter, unicode_type
from tinycss.css21 import CSS21Parser
css_parser = CSS21Parser()

View File

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

View File

@@ -8,10 +8,10 @@ __docformat__ = 'restructuredtext en'
from collections import defaultdict
from calibre.ebooks.oeb.base import urlnormalize, css_text
from calibre.utils.fonts.sfnt.subset import subset, NoGlyphs, UnsupportedFont
from polyglot.builtins import iteritems, itervalues, unicode_type, range
from tinycss.fonts3 import parse_font_family
from ebook_converter.ebooks.oeb.base import urlnormalize, css_text
from ebook_converter.utils.fonts.sfnt.subset import subset, NoGlyphs, UnsupportedFont
from ebook_converter.polyglot.builtins import iteritems, itervalues, unicode_type, range
from ebook_converter.tinycss.fonts3 import parse_font_family
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 datetime import datetime
from calibre.constants import plugins, ispy3
from calibre.utils.logging import default_log
from polyglot.builtins import iteritems, unicode_type, codepoint_to_chr
from polyglot.binary import as_hex_bytes
from ebook_converter.constants import ispy3
from ebook_converter.utils.logging import default_log
from ebook_converter.polyglot.builtins import iteritems, unicode_type, codepoint_to_chr
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'

View File

@@ -75,6 +75,6 @@ def load_font(stream_or_path):
raw = stream_or_path
if hasattr(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)

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'
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[0:32] = (32) * ["do_operator"]

View File

@@ -9,12 +9,12 @@ __docformat__ = 'restructuredtext en'
from struct import unpack_from, unpack, calcsize
from functools import partial
from calibre.utils.fonts.sfnt import UnknownTable
from calibre.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs
from calibre.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 import UnknownTable
from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs
from ebook_converter.utils.fonts.sfnt.cff.dict_data import TopDict, PrivateDict
from ebook_converter.utils.fonts.sfnt.cff.constants import (cff_standard_strings,
STANDARD_CHARSETS)
from polyglot.builtins import iteritems, itervalues, range
from ebook_converter.polyglot.builtins import iteritems, itervalues, range
# Useful links
# 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)
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
# reconstruct character_map for the subset font
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 collections import OrderedDict
from calibre.utils.fonts.utils import read_bmp_prefix
from calibre.utils.fonts.sfnt import UnknownTable, max_power_of_two
from calibre.utils.fonts.sfnt.errors import UnsupportedFont
from polyglot.builtins import range
from ebook_converter.utils.fonts.utils import read_bmp_prefix
from ebook_converter.utils.fonts.sfnt import UnknownTable, max_power_of_two
from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont
from ebook_converter.polyglot.builtins import range
def split_range(start_code, end_code, cmap): # {{{

View File

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

View File

@@ -7,19 +7,19 @@ from collections import OrderedDict
from io import BytesIO
from struct import calcsize, pack
from calibre.utils.fonts.sfnt import UnknownTable, align_block, max_power_of_two
from calibre.utils.fonts.sfnt.cff.table import CFFTable
from calibre.utils.fonts.sfnt.cmap import CmapTable
from calibre.utils.fonts.sfnt.errors import UnsupportedFont
from calibre.utils.fonts.sfnt.glyf import GlyfTable
from calibre.utils.fonts.sfnt.gsub import GSUBTable
from calibre.utils.fonts.sfnt.head import (
from ebook_converter.utils.fonts.sfnt import UnknownTable, align_block, max_power_of_two
from ebook_converter.utils.fonts.sfnt.cff.table import CFFTable
from ebook_converter.utils.fonts.sfnt.cmap import CmapTable
from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont
from ebook_converter.utils.fonts.sfnt.glyf import GlyfTable
from ebook_converter.utils.fonts.sfnt.gsub import GSUBTable
from ebook_converter.utils.fonts.sfnt.head import (
HeadTable, HorizontalHeader, OS2Table, PostTable, VerticalHeader
)
from calibre.utils.fonts.sfnt.kern import KernTable
from calibre.utils.fonts.sfnt.loca import LocaTable
from calibre.utils.fonts.sfnt.maxp import MaxpTable
from calibre.utils.fonts.utils import checksum_of_block, get_tables, verify_checksums
from ebook_converter.utils.fonts.sfnt.kern import KernTable
from ebook_converter.utils.fonts.sfnt.loca import LocaTable
from ebook_converter.utils.fonts.sfnt.maxp import MaxpTable
from ebook_converter.utils.fonts.utils import checksum_of_block, get_tables, verify_checksums
# 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 collections import OrderedDict
from calibre.utils.fonts.sfnt import UnknownTable
from polyglot.builtins import iteritems
from ebook_converter.utils.fonts.sfnt import UnknownTable
from ebook_converter.polyglot.builtins import iteritems
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

View File

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

View File

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

View File

@@ -8,10 +8,10 @@ __docformat__ = 'restructuredtext en'
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)
from calibre.utils.fonts.sfnt.errors import UnsupportedFont
from polyglot.builtins import range
from ebook_converter.utils.fonts.sfnt.errors import UnsupportedFont
from ebook_converter.polyglot.builtins import range
class KernTable(UnknownTable):

View File

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

View File

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

View File

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