# GhostEditor Программа для конвертации из формата `md` в формат `docx`(x это без макросов, m с макросами) (`Office Open XML`),`odt`(`OpenDocument`) #### **1. python-docx** **Назначение**: Создание и модификация Word-документов. **Ключевые возможности**: - Добавление/редактирование текста, таблиц, изображений. - Управление стилями, колонтитулами, сносками. - Работа с XML через абстракции (Paragraph, Run, Table). **Пример**: ```python from docx import Document from docx.shared import Pt doc = Document() paragraph = doc.add_paragraph("Hello ") run = paragraph.add_run("OOXML!") run.bold = True run.font.size = Pt(14) # Таблица table = doc.add_table(rows=2, cols=2) table.cell(0, 0).text = "Cell A1" doc.save("report.docx") ``` **Плюсы**: - Интуитивный API, близкий к логике Word. - Поддержка всех ключевых частей пакета (headers, footers, styles). **Минусы**: - Нет поддержки макросов. - Ограниченная работа с графикой (изображения добавляются, но редактирование сложно). **Ссылка**: [python-docx.readthedocs.io](https://python-docx.readthedocs.io/) --- #### **2. docxtpl** **Назначение**: Генерация документов по шаблонам (Jinja2). **Особенности**: - Шаблоны .docx с переменными (`{{ variable }}`) и логикой (`{% if %}`). - Поддержка таблиц, изображений, HTML-фрагментов. **Пример**: ```python from docxtpl import DocxTemplate doc = DocxTemplate("template.docx") context = { "title": "Отчет за 2023", "items": [{"name": "Item 1"}, {"name": "Item 2"}] } doc.render(context) doc.save("output.docx") ``` **Плюсы**: - Идеален для шаблонизированных отчетов (договоры, счета). - Интеграция с Django/Flask. **Минусы**: - Требует предварительной настройки шаблонов в Word. **Ссылка**: [github.com/elapouya/python-docx-template](https://github.com/elapouya/python-docx-template) --- #### **3. mammoth** **Назначение**: Конвертация .docx → HTML с сохранением структуры. **Особенности**: - Преобразует стили Word в CSS-классы. - Подходит для извлечения контента из сложных документов. **Пример**: ```python import mammoth with open("document.docx", "rb") as docx_file: result = mammoth.convert_to_html(docx_file) html = result.value # HTML-строка warnings = result.messages # Предупреждения ``` **Плюсы**: - Сохраняет семантику (заголовки, списки, таблицы). - Легко интегрируется с парсерами (BeautifulSoup). **Минусы**: - Не подходит для обратной конвертации (HTML → docx). **Ссылка**: [github.com/mwilliamson/mammoth.py](https://github.com/mwilliamson/mammoth.py) --- ### **Низкоуровневые инструменты (для кастомных задач)** #### **1. zipfile + lxml** **Назначение**: Прямой доступ к XML-структуре OOXML. **Когда использовать**: - При работе с нестандартными частями пакета (напр., кастомные XML-маппинги в Excel). - Для восстановления поврежденных файлов. **Пример для Excel**: ```python import zipfile from lxml import etree # Распаковываем workbook.xml with zipfile.ZipFile("report.xlsx") as xlsx: xml_data = xlsx.read("xl/workbook.xml") # Парсим XML workbook = etree.fromstring(xml_data) namespaces = {"ns": "http://schemas.../spreadsheetml/2006/main"} sheets = workbook.findall(".//ns:sheet", namespaces) # Меняем имя листа sheets[0].set("{http://.../officeDocument/2006/relationships}name", "New Sheet") # Сохраняем изменения with zipfile.ZipFile("fixed.xlsx", "w") as new_xlsx: for file in xlsx.namelist(): if file != "xl/workbook.xml": new_xlsx.writestr(file, xlsx.read(file)) new_xlsx.writestr("xl/workbook.xml", etree.tostring(workbook)) ``` **Плюсы**: - Полный контроль над структурой. - Работает с любыми частями пакета. **Минусы**: - Требует знания XML-схем OOXML. - Риск повреждения файла при ошибках. --- #### **2. officedoc** **Назначение**: Универсальный доступ к форматам Office (docx, xlsx, pptx). **Особенности**: - Объединяет функционал `python-docx`, `openpyxl`, `python-pptx` в едином API. - Упрощает обработку мультимедийных вложений. **Пример**: ```python from officedoc import Document doc = Document("mixed.docx") for image in doc.images: image.save("extracted_" + image.filename) for table in doc.tables: print(table.to_dataframe()) # Конвертация в pandas DataFrame ``` **Ссылка**: [github.com/mikem1701/officedoc](https://github.com/mikem1701/officedoc) --- ### **Сравнение библиотек** | **Библиотека** | **Скорость** | **Сложность** | **Особенности** | |----------------------|-------------|---------------|----------------------------| | **python-docx** | Средняя | Средняя | Стандарт для работы с Word | | **docxtpl** | Средняя | Низкая | Шаблонизация через Jinja2 | | **zipfile + lxml** | Высокая | Высокая | Полный контроль над XML | --- #### Для Word (.docx) - **Простое создание документов**: `python-docx`. - **Шаблонные документы** (договоры, счета): `docxtpl`. - **Извлечение контента**: `mammoth` → обработка HTML через BeautifulSoup. - **Редактирование структуры**: `python-docx` + `zipfile` для кастомных частей. #### Для кастомных задач - **Восстановление файлов**: `zipfile` + `lxml` (ручное исправление XML). - **Интеграция с внешними системами**: `openpyxl`/`python-docx` + REST API (напр., выгрузка данных из БД в Excel). --- ### Типичные проблемы и решения 2. Стили не применяются в Word - Проблема: `python-docx` использует стили из `styles.xml`, но не создает новые автоматически. - Решение: ```python from docx.shared import Pt style = doc.styles.add_style("Heading3", WD_STYLE_TYPE.PARAGRAPH) font = style.font font.name = "Arial" font.size = Pt(12) ``` --- ### **Заключение** Для 90% задач достаточно: - **Excel**: `openpyxl` или `pandas`. - **Word**: `python-docx` + `docxtpl`. **Используйте низкоуровневые методы (zipfile/lxml) только когда**: *Для углубленного изучения:* - [Open XML SDK 2.5](https://learn.microsoft.com/ru-ru/office/open-xml/open-xml-sdk) (официальная документация Microsoft). - [ECMA-376 стандарт](https://www.ecma-international.org/publications-and-standards/standards/ecma-376/) (полная спецификация).