Вступление
В какой-то момент вашего пути разработки программного обеспечения вам придется конвертировать файлы из одного формата в другой.
DOCX (используемый Microsoft Word) - довольно распространенный формат файлов, который используют многие люди. А иногда нам нужно преобразовать документы Word в HTML.
Этого легко добиться с помощью пакета Mammoth. Это простая, эффективная и быстрая библиотека, используемая для преобразования файлов DOCX в HTML. В этой статье мы узнаем, как использовать Mammoth в Python для преобразования DOCX в HTML.
Установка Мамонта
Рекомендуется подготовить и активировать виртуальную среду перед установкой:
$ python3 -m venv myenv
$ . myenv/bin/activate
Затем давайте установим Mammoth с помощью pip
:
$ pip3 install mammoth
В этом руководстве используется Mammoth версии 1.4.15
. Вот образец
документа,
который
вы можете использовать в этом руководстве. Если у вас есть документ,
который нужно преобразовать, убедитесь, что это файл .docx
Теперь, когда вы готовы к работе, давайте начнем с извлечения текста и написания его как HTML.
Извлечь необработанный текст из файла DOCX
Сохранение форматирования при преобразовании в HTML - одна из лучших функций Mammoth. Однако, если вам нужен просто текст файла DOCX, вы будете приятно удивлены тем, сколько строк кода потребуется.
Вы можете использовать метод extract_raw_text()
для его получения:
import mammoth
with open(input_filename, "rb") as docx_file:
result = mammoth.extract_raw_text(docx_file)
text = result.value # The raw text
with open('output.txt', 'w') as text_file:
text_file.write(text)
Обратите внимание, что этот метод не возвращает действительный
HTML-документ. Он возвращает только текст на странице, поэтому мы
сохраняем его с расширением .txt
Если вам действительно нужно
сохранить макет и / или форматирование, вы захотите извлечь содержимое
HTML.
Преобразование Docx в HTML с помощью настраиваемого сопоставления стилей
По умолчанию Mammoth конвертирует ваш документ в HTML, но не дает вам
действующей HTML-страницы. Хотя веб-браузеры могут отображать контент, в
нем отсутствует <html>
для инкапсуляции документа и <body>
для
содержания документа. Как вы решите интегрировать его результаты,
зависит от вас. Допустим, вы используете веб-фреймворк с шаблонами. Вы,
вероятно, определите шаблон для отображения документа Word и загрузите
вывод Mammoth в тело шаблона.
Mammoth гибок не только в том, как вы можете использовать свои выходные данные, но и в том, как вы можете их создавать. В частности, у нас есть много вариантов, когда мы хотим стилизовать создаваемый HTML. Мы сопоставляем стили, сопоставляя каждое правило форматирования DOCX с эквивалентным (или максимально близким) правилом CSS.
Чтобы узнать, какие стили есть в вашем файле DOCX, у вас есть два варианта:
- Вы можете открыть свой файл docx в MS Word и проверить панель инструментов « Стили».
- Вы можете покопаться в файлах XML, открыв свой файл DOCX с помощью
диспетчера архивов, а затем перейдите к
/word/styles.xml
и найдите свои стили.
Второй вариант может использоваться теми, у кого нет доступа к MS Word или альтернативному текстовому процессору, который может интерпретировать и отображать стили.
Mammoth уже имеет некоторые из наиболее распространенных стилевых карт,
включенных по умолчанию. Например, Heading1
docx Heading1 отображается
на HTML-элемент <h1>
, полужирный - на <strong>
HTML-элемент и
т. Д.
Мы также можем использовать Mammoth для настройки стилей документа при их сопоставлении. Например, если вы хотите заменить все полужирные вхождения в файле DOCX курсивом в HTML, вы можете сделать это:
import mammoth
custom_styles = "b => i"
with open(input_filename, "rb") as docx_file:
result = mammoth.convert_to_html(docx_file, style_map = custom_styles)
text = result.value
with open('output.html', 'w') as html_file:
html_file.write(text)
С custom_styles
стиль слева взят из файла DOCX, а справа -
соответствующий CSS.
Допустим, мы хотели полностью опустить выделенные жирным шрифтом вхождения, мы можем оставить цель сопоставления пустой:
custom_styles = "b => "
Иногда в переносимом документе нужно сохранить множество стилей. Быстро
становится непрактичным создавать переменную для каждого стиля, который
мы хотим сопоставить. К счастью, мы можем использовать docstrings
для
сопоставления любого количества стилей за один раз:
custom_styles = """ b => del
u => em
p[style-name='Heading 1'] => i"""
Вы могли заметить, что последнее отображение немного отличалось от
других. При сопоставлении стилей мы можем использовать квадратные скобки
[]
с условием внутри них, чтобы таким образом оформлялось только
подмножество элементов.
В нашем примере p[style-name='Heading 1']
выбирает абзацы, которые
имеют имя стиля « Heading 1
. Мы также можем использовать
p[style-name^='Heading']
для выбора каждого абзаца, имя стиля которого
начинается с Heading
.
Сопоставление стилей также позволяет нам сопоставлять стили с пользовательскими классами CSS. Поступая так, мы можем формировать стиль HTML по своему усмотрению. Давайте рассмотрим пример, в котором мы определяем наш базовый настраиваемый CSS в строке документации следующим образом:
custom_css ="""
<style>
.red{
color: red;
}
.underline{
text-decoration: underline;
}
.ul.li{
list-style-type: circle;
}
table, th, td {
border: 1px solid black;
}
</style>
"""
Теперь мы можем обновить наше сопоставление для ссылки на классы CSS,
которые мы определили в блоке <style>
custom_styles = """ b => b.red
u => em.red
p[style-name='Heading 1'] => h1.red.underline"""
Теперь все, что нам нужно сделать, это объединить CSS и HTML вместе:
edited_html = custom_css + html
Если в вашем файле DOCX есть какие-либо из этих элементов, вы сможете увидеть результаты.
Теперь, когда мы знаем, как сопоставлять стили, давайте воспользуемся более известной структурой CSS (вместе с JS), чтобы придать нашему HTML лучший вид и отработать более вероятный сценарий из реальной жизни.
Сопоставление стилей с помощью Bootstrap (или любой другой инфраструктуры пользовательского интерфейса)
Как и в случае с custom_css
, нам нужно убедиться, что CSS загружен
вместе с HTML. Нам нужно добавить URI или CDN файла начальной загрузки в
наш HTML:
bootstrap_css = '<link href="https://cdn.jsdelivr.net/npm/ [email protected] /dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">'
bootstrap_js = '<script src="https://cdn.jsdelivr.net/npm/ [email protected] /dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script>'
Мы также немного подправим наши custom_styles
чтобы они
соответствовали нашим новым классам CSS:
custom_styles = """ b => b.mark
u => u.initialism
p[style-name='Heading 1'] => h1.card
table => table.table.table-hover
"""
В первой строке мы сопоставляем полужирный стиль DOCX элементу HTML b
mark
класса, который является эквивалентом класса Bootstrap <mark>
,
используемого для выделения части текста.
Во второй строке мы добавляем класс initialism
u
, немного уменьшая
размер шрифта и переводя текст в верхний регистр.
В третьей строке мы выбираем все абзацы с именем стиля Heading 1
и
преобразуем их в h1
с помощью класса Bootstrap card
, который
устанавливает несколько свойств стиля, таких как цвет фона, положение и
граница для элемента.
В последней строке, мы преобразование всех таблиц в нашем файл DOCX в
table
HTML элемента, с Bootstrap в table
класса , чтобы придать ему
новый облик, и мы делаем это подчеркнуть при наведении, добавив класс
Bootstrap из table-hover
.
Как и раньше, мы используем точечную нотацию для сопоставления нескольких классов с одним и тем же элементом HTML, даже если стили взяты из другого источника.
Наконец, добавьте CDN Bootstrap в наш HTML:
edited_html = bootstrap_css + html + bootstrap_js
Теперь наш HTML-код с безупречным внешним видом готов к публикации! Вот полный код для справки:
import mammoth
input_filename = "file-sample_100kB.docx"
custom_styles = """ b => b.mark
u => u.initialism
p[style-name='Heading 1'] => h1.card
table => table.table.table-hover
"""
bootstrap_css = '<link href="https://cdn.jsdelivr.net/npm/ [email protected] /dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">'
bootstrap_js = '<script src="https://cdn.jsdelivr.net/npm/ [email protected] /dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script>'
with open(input_filename, "rb") as docx_file:
result = mammoth.convert_to_html(docx_file, style_map = custom_styles)
html = result.value
edited_html = bootstrap_css + html + bootstrap_js
output_filename = "output.html"
with open(output_filename, "w") as f:
f.writelines(edited_html)
Кроме того, еще один момент, который следует отметить здесь, что в реальном сценарии вы, вероятно, не будете добавлять Bootstrap CSS непосредственно в содержимое HTML, как мы это сделали здесь. Вместо этого вы должны загружать / внедрять HTML-контент на предварительно упакованную HTML-страницу, которая уже будет иметь необходимые пакеты CSS и JS.
До сих пор вы видели, насколько гибко мы можем стилизовать наш вывод. Mammoth также позволяет нам изменять контент, который мы конвертируем. Давайте посмотрим на это сейчас.
Работа с изображениями, которыми мы не хотим делиться
Допустим, мы хотим исключить преобразование изображений из нашего файла
DOCX. convert_to_html()
принимает convert_image
, который является
функцией обработчика изображений. Он возвращает список изображений,
которые необходимо преобразовать и добавить в документ HTML.
Естественно, если мы переопределим его и вернем пустой список, они будут исключены из преобразованной страницы:
def ignore_image(image):
return []
Теперь давайте передадим эту функцию в качестве параметра
convert_to_html()
:
with open(input_filename, "rb") as docx_file:
result = mammoth.convert_to_html(docx_file, style_map = custom_styles, convert_image=ignore_image)
html = result.value
with open('output.html', 'w') as html_file:
html_file.write(text)
Это оно! Мамонт проигнорирует все изображения при создании файла HTML.
До сих пор мы программно использовали Mammoth с Python. Mammoth - это также инструмент командной строки, поэтому у нас есть другой интерфейс для взаимодействия DOCX с HTML. Посмотрим, как это работает, в следующем разделе.
Преобразование DOCX в HTML с помощью инструмента командной строки
Преобразование файлов с помощью Mammoth с использованием интерфейса командной строки обычно выглядит следующим образом:
$ mammoth path/to/input_filename.docx path/to/output.html
Если вы хотите отделить изображения от HTML, вы можете указать выходную папку:
$ mammoth file-sample_100kB.docx --output-dir=imgs
Мы также можем добавлять собственные стили, как мы это делали в Python. Сначала вам нужно создать файл пользовательского стиля:
$ touch my-custom-styles
Затем мы добавим в него свои собственные стили, синтаксис такой же, как и раньше:
b => b.red
u => em.red
p[style-name='Heading 1'] => h1.red.underline
Теперь мы можем сгенерировать наш HTML-файл в собственном стиле:
$ mammoth file-sample_100kB.docx output.html --style-map=my-custom-styles
И вы сделали! Ваш документ был бы преобразован с использованием определенных пользовательских стилей.
Заключение
Приведение типов файлов - обычная ситуация при работе с веб-технологиями. Преобразование файлов DOCX в хорошо известный HTML-код, которым легко манипулировать, позволяет нам реконструировать данные столько, сколько нам нужно. С Mammoth мы узнали, как извлечь текст из docx и как преобразовать его в HTML.
При преобразовании в HTML мы можем стилизовать вывод с помощью правил CSS, которые мы создаем, или правил, которые поставляются с общими фреймворками пользовательского интерфейса. Мы также можем опустить данные, которые не должны быть доступны в HTML. Наконец, мы увидели, как использовать Mammoth CLI в качестве альтернативы для преобразования файлов.
Вы можете найти образец файла docx вместе с полным кодом учебника в этом репозитории GitHub .