Как конвертировать DOCX в HTML с помощью Python Mammoth

Введение В какой-то момент вашего пути разработки программного обеспечения вам придется конвертировать файлы из одного формата в другой. DOCX (используемый Microsoft Word) - довольно распространенный формат файлов, который используют многие люди. А иногда нам нужно преобразовать документы Word в HTML. Этого легко добиться с помощью пакета Mammoth. Это простая, эффективная и быстрая библиотека, используемая для преобразования файлов DOCX в HTML. В этой статье мы узнаем, как использовать Mammoth в Python для преобразования DOCX в HTML. Установка M

Вступление

В какой-то момент вашего пути разработки программного обеспечения вам придется конвертировать файлы из одного формата в другой.

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, у вас есть два варианта:

  1. Вы можете открыть свой файл docx в MS Word и проверить панель инструментов « Стили».
  2. Вы можете покопаться в файлах 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 .

comments powered by Disqus