Python-библиотека для преобразования HTML-контента в документы Word (.docx) с поддержкой таблиц, списков, изображений и CSS-стилей.
pip install html2docxconverteruv add html2docxconverter<p>- абзацы текста<figure>- контейнеры для изображений<ul>- неупорядоченные списки<ol>- упорядоченные списки<li>- элементы списков<table>- таблицы<tr>- строки таблицы<td>- ячейки таблицы<th>- заголовочные ячейки таблицы<colgroup>- группировка столбцов таблицы<col>- определение столбца таблицы<tbody>- тело таблицы<img>- изображения (поддержка src, srcset, data URI, относительных путей)
<strong>,<b>- жирный текст<em>,<i>- курсив<u>- подчеркнутый текст<s>,<strike>,<del>- зачеркнутый текст<sup>- верхний индекс<sub>- нижний индекс<span>- контейнер для стилизации текста
color- цвет текста (имена цветов, hex, rgb)background-color- выделение цветом (имена цветов, hex, rgb)font-size- размер шрифта (px, pt, em, %)text-align- выравнивание текста (left, right, center, justify)vertical-align- вертикальное выравнивание (top, middle, bottom)
width- ширина таблицы/ячейки (px, %)height- высота строки/ячейки (px)background-color- цвет фона таблицы/ячейкиborder- граница (ширина стиль цвет)border-width- ширина границыborder-style- стиль границы (solid, single)border-color- цвет границыfloat- позиционирование таблицы (left, right)
width— ширина изображения (px, %, em)height— высота изображения (px, em)aspect-ratio— сохранение пропорцийobject-fit—contain,coverdisplay—block,inline-blockfloat—left,right(обтекание текста)margin— внешние отступыborder-radius— скругление углов (реализовано через маску PNG)box-shadow— тень (реализована через Pillow)
Дополнительно:
- поддержка WebP → PNG
- поддержка srcset (выбор лучшего изображения)
- поддержка относительных путей через
<base href="..."> - автоматическое ограничение ширины и высоты страницы
- Автоматическая обработка
<base href="...">для относительных путей - Корректная работа с вложенными списками
- Поддержка layout‑таблиц (если указан CSS‑класс)
- Поддержка многоуровневых списков
- Поддержка inline‑стилей в
<span> - Корректная обработка HTML‑структуры через BeautifulSoup
from docx import Document
from htmltodocx import HTMLtoDocx
# Создание нового документа
doc = Document()
# HTML-контент для конвертации
html_content = """
<p>Это <strong>жирный</strong> и <em>курсивный</em> текст.</p>
<ul>
<li>Первый элемент</li>
<li>Второй элемент</li>
</ul>
"""
# Конвертация HTML в DOCX
converter = HTMLtoDocx(doc)
converted_doc = converter.parse_html(html_content)
# Сохранение документа
doc.save("output.docx")from docx import Document
from htmltodocx import HTMLtoDocx
# Создание нового документа
doc = Document()
# Получение HTML и конвертация в DOCX
converter = HTMLtoDocx(doc)
converted_doc = converter.parse_url('https://habr.com/en/news/930292/')
# Сохранение документа
doc.save("output.docx")from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from htmltodocx.schemas import ConfigSchema, DefaultTableStyleSchema, DefaultConfigSchema
from docx import Document
from htmltodocx import HTMLtoDocx
align_map = {
"left": WD_PARAGRAPH_ALIGNMENT.LEFT,
"center": WD_PARAGRAPH_ALIGNMENT.CENTER,
"right": WD_PARAGRAPH_ALIGNMENT.RIGHT,
"justify": WD_PARAGRAPH_ALIGNMENT.JUSTIFY,
}
align_image_class_map = {
"image-style-block-align-left": WD_PARAGRAPH_ALIGNMENT.LEFT,
"image-style-block-align-right": WD_PARAGRAPH_ALIGNMENT.RIGHT,
"image-style-block-align-center": WD_PARAGRAPH_ALIGNMENT.CENTER,
}
vertical_align_map = {"top": "top", "middle": "center", "bottom": "bottom"}
border_side = ["top", "left", "bottom", "right"]
border_style = {
"none": "nil",
"solid": "single",
"dotted": "dotted",
"dashed": "dash",
"double": "double",
"groove": "threeDEmboss",
"ridge": "threeDEngrave",
"inset": "inset",
"outset": "outset",
}
default_settings = DefaultConfigSchema(
align_paragraph=WD_PARAGRAPH_ALIGNMENT.JUSTIFY,
align_image=WD_PARAGRAPH_ALIGNMENT.CENTER,
vertical_align='center',
table_style=DefaultTableStyleSchema(
width="1pt", style="single", color="000000"
)
)
base_config = ConfigSchema(
align_map=align_map,
align_image_class_map=align_image_class_map,
vertical_align_map=vertical_align_map,
border_side=border_side,
border_style=border_style,
default_settings=default_settings
)
# HTML-контент для конвертации
html_content = """
<p>Это <strong>жирный</strong> и <em>курсивный</em> текст.</p>
<ul>
<li>Первый элемент</li>
<li>Второй элемент</li>
</ul>
"""
# Конвертация HTML в DOCX
doc = Document()
converter = HTMLtoDocx(doc, config=base_config, layout_table_class='layout-table', message_start='HTML контент: ')
converted_doc = converter.parse_html(html_content)
par = doc.add_paragraph()
par.add_run('Hello World!')
# Сохранение документа
doc.save("output.docx")MIT License