Содержание статьи
- Как xml перевести в word
- Как открыть документ формата docx
- Как создать xml документ
Перевести xml в doc можно несколькими способами:
- используя возможности программы word;
- при помощи специальных онлайн-сервисов.
Подробнее разберем каждый из способов.
С помощью программы Word
Первым делом понадобится запустить Word. Сделать это можно через ярлык на рабочем столе или меню "Пуск". Затем необходимо открыть нужный xml файл. Чтобы сделать это, надо:
- Нажать на кнопку "Файл", расположенную в верхней левой части экрана.
- В открывшемся меню кликнуть на пункт "Открыть". Справа появится изображение папки с надписью "Обзор". При нажатии на нее откроется корневой каталог, в котором нужно найти xml-файл.
После этого потребуется снова кликнуть на кнопку "Файл" и щелкнуть мышкой на пункт "Сохранить как". Затем пользователь должен указать место для сохранения и в поле "Тип файла" выбрать "Документ word".
В указанном месте на компьютере появится файл с расширением doc. Теперь его можно спокойно открывать программой word или другим текстовым редактором.
При помощи онлайн-сервисов
Сделать это можно на специальных сайтах — конвертерах. Они предназначены для трансформации файлов из одного формата в другой. Таких сайтов в сети существует огромное множество, вот лишь некоторые из них:
- onlineconvertfree.com;
- coolutils.com;
- online-converting.ru;
- zamzar.com.
Рассмотрим процесс конвертации на примере сайте onlineconvertfree.com. Для этого потребуется зайти на ресурс и кликнуть по надписи "Конвертировать в", что находится сверху. Откроется выпадающее меню, в котором необходимо нажать на "Документы конвертер". Пользователь попадет на страницу, где расположена синяя кнопка "Выберите файл"
Дальнейший порядок действий будет выглядеть следующим образом:
- Нажать на кнопку и загрузить xml-файл.
- В появившемся окне выбрать пункт "в doc".
- Подождать, пока закончится процесс конвертации. Его скорость зависит от размера файла.
- Скачать готовый файл на компьютер.
После выполнения вышеуказанных действий его можно будет открыть в программе word. Конвертация файлов при помощи других сервисов проходит аналогичным образом, могут лишь немного отличаться названия разделов.
Перевести xml в doc не сложно, главное действовать по инструкции. Преобразовать файл возможно двумя способами. После конвертации его получится открыть и редактировать в word.
Задача обработки документов в формате docx, а также таблиц xlsx и презентаций pptx является весьма нетривиальной. В этой статье расскажу как научиться парсить, создавать и обрабатывать такие документы используя только XSLT и ZIP архиватор.
Зачем?
docx — самый популярный формат документов, поэтому задача отдавать информацию пользователю в этом формате всегда может возникнуть. Один из вариантов решения этой проблемы — использование готовой библиотеки, может не подходить по ряду причин:
- библиотеки может просто не существовать
- в проекте не нужен ещё один чёрный ящик
- ограничения библиотеки по платформам и т.п.
- проблемы с лицензированием
- скорость работы
Поэтому в этой статье будем использовать только самые базовые инструменты для работы с docx документом.
Структура docx
Для начала разоберёмся с тем, что собой представляет docx документ. docx это zip архив который физически содержит 2 типа файлов:
- xml файлы с расширениями xml и rels
- медиа файлы (изображения и т.п.)
А логически — 3 вида элементов:
- Типы (Content Types) — список типов медиа файлов (например png) встречающихся в документе и типов частей документов (например документ, верхний колонтитул).
- Части (Parts) — отдельные части документа, для нашего документа это document.xml, сюда входят как xml документы так и медиа файлы.
- Связи (Relationships) идентифицируют части документа для ссылок (например связь между разделом документа и колонтитулом), а также тут определены внешние части (например гиперссылки).
Они подробно описаны в стандарте ECMA-376: Office Open XML File Formats, основная часть которого — PDF документ на 5000 страниц, и ещё 2000 страниц бонусного контента.
Минимальный docx
Простейший docx после распаковки выглядит следующим образом
Давайте посмотрим из чего он состоит.
[Content_Types].xml
Находится в корне документа и перечисляет MIME типы содержимого документа:
_rels/.rels
Главный список связей документа. В данном случае определена всего одна связь — сопоставление с идентификатором rId1 и файлом word/document.xml — основным телом документа.
word/document.xml
- — сам документ
- — тело документа
- — параграф
- — run (фрагмент) текста
- — сам текст
- — описание страницы
Если открыть этот документ в текстовом редакторе, то увидим документ из одного слова Test .
word/_rels/document.xml.rels
Здесь содержится список связей части word/document.xml . Название файла связей создаётся из названия части документа к которой он относится и добавления к нему расширения rels . Папка с файлом связей называется _rels и находится на том же уровне, что и часть к которой он относится. Так как связей в word/document.xml никаких нет то и в файле пусто:
Даже если связей нет, этот файл должен существовать.
docx и Microsoft Word
docx созданный с помощью Microsoft Word, да в принципе и с помощью любого другого редактора имеет несколько дополнительных файлов.
Вот что в них содержится:
- docProps/core.xml — основные метаданные документа согласно Open Packaging Conventions и Dublin Core [1], [2].
- docProps/app.xml — общая информация о документе: количество страниц, слов, символов, название приложения в котором был создан документ и т.п.
- word/settings.xml — настройки относящиеся к текущему документу.
- word/styles.xml — стили применимые к документу. Отделяют данные от представления.
- word/webSettings.xml — настройки отображения HTML частей документа и настройки того, как конвертировать документ в HTML.
- word/fontTable.xml — список шрифтов используемых в документе.
- word/theme1.xml — тема (состоит из цветовой схемы, шрифтов и форматирования).
В сложных документах частей может быть гораздо больше.
Реверс-инжиниринг docx
Итак, первоначальная задача — узнать как какой-либо фрагмент документа хранится в xml, чтобы потом создавать (или парсить) подобные документы самостоятельно. Для этого нам понадобятся:
- Архиватор zip
- Библиотека для форматирования XML (Word выдаёт XML без отступов, одной строкой)
- Средство для просмотра diff между файлами, я буду использовать git и TortoiseGit
Инструменты
Также понадобятся скрипты для автоматического (раз)архивирования и форматирования XML.
Использование под Windows:
- unpack file dir — распаковывает документ file в папку dir и форматирует xml
- pack dir file — запаковывает папку dir в документ file
Использование под Linux аналогично, только ./unpack.sh вместо unpack , а pack становится ./pack.sh .
Использование
Поиск изменений происходит следующим образом:
- Создаём пустой docx файл в редакторе.
- Распаковываем его с помощью unpack в новую папку.
- Коммитим новую папку.
- Добавляем в файл из п. 1. изучаемый элемент (гиперссылку, таблицу и т.д.).
- Распаковываем изменённый файл в уже существующую папку.
- Изучаем diff, убирая ненужные изменения (перестановки связей, порядок пространств имён и т.п.).
- Запаковываем папку и проверяем что получившийся файл открывается.
- Коммитим изменённую папку.
Пример 1. Выделение текста жирным
Посмотрим на практике, как найти тег который определяет форматирование текста жирным шрифтом.
- Создаём документ bold.docx с обычным (не жирным) текстом Test.
- Распаковываем его: unpack bold.docx bold .
- Коммитим результат.
- Выделяем текст Test жирным.
- Распаковываем unpack bold.docx bold .
- Изначально diff выглядел следующим образом:
Рассмотрим его подробно:
docProps/app.xml
Изменение времени нам не нужно.
docProps/core.xml
Изменение версии документа и даты модификации нас также не интересует.
word/document.xml
Изменения в w:rsidR не интересны — это внутренняя информация для Microsoft Word. Ключевое изменение тут
в параграфе с Test. Видимо элемент и делает текст жирным. Оставляем это изменение и отменяем остальные.
word/settings.xml
Также не содержит ничего относящегося к жирному тексту. Отменяем.
7 Запаковываем папку с 1м изменением (добавлением ) и проверяем что документ открывается и показывает то, что ожидалось.
8 Коммитим изменение.
Пример 2. Нижний колонтитул
Теперь разберём пример посложнее — добавление нижнего колонтитула.
Вот первоначальный коммит. Добавляем нижний колонтитул с текстом 123 и распаковываем документ. Такой diff получается первоначально:
Сразу же исключаем изменения в docProps/app.xml и docProps/core.xml — там тоже самое, что и в первом примере.
[Content_Types].xml
footer явно выглядит как то, что нам нужно, но что делать с footnotes и endnotes? Являются ли они обязательными при добавлении нижнего колонтитула или их создали заодно? Ответить на этот вопрос не всегда просто, вот основные пути:
- Посмотреть, связаны ли изменения друг с другом
- Экспериментировать
- Ну а если совсем не понятно что происходит:
Идём пока что дальше.
word/_rels/document.xml.rels
Изначально diff выглядит вот так:
Видно, что часть изменений связана с тем, что Word изменил порядок связей, уберём их:
Опять появляются footer, footnotes, endnotes. Все они связаны с основным документом, перейдём к нему:
word/document.xml
Редкий случай когда есть только нужные изменения. Видна явная ссылка на footer из sectPr. А так как ссылок в документе на footnotes и endnotes нет, то можно предположить что они нам не понадобятся.
word/settings.xml
А вот и появились ссылки на footnotes, endnotes добавляющие их в документ.
word/styles.xml
Изменения в стилях нас интересуют только если мы ищем как поменять стиль. В данном случае это изменение можно убрать.
word/footer1.xml
Посмотрим теперь собственно на сам нижний колонтитул (часть пространств имён опущена для читабельности, но в документе они должны быть):
Тут виден текст 123. Единственное, что надо исправить — убрать ссылку на .
В результате анализа всех изменений делаем следующие предположения:
- footnotes и endnotes не нужны
- В [Content_Types].xml надо добавить footer
- В word/_rels/document.xml.rels надо добавить ссылку на footer
- В word/document.xml в тег надо добавить
Уменьшаем diff до этого набора изменений:
Затем запаковываем документ и открываем его.
Если всё сделано правильно, то документ откроется и в нём будет нижний колонтитул с текстом 123. А вот и итоговый коммит.
Таким образом процесс поиска изменений сводится к поиску минимального набора изменений, достаточного для достижения заданного результата.
Практика
Найдя интересующее нас изменение, логично перейти к следующему этапу, это может быть что-либо из:
- Создания docx
- Парсинг docx
- Преобразования docx
Тут нам потребуются знания XSLT и XPath.
Давайте напишем достаточно простое преобразование — замену или добавление нижнего колонтитула в существующий документ. Писать я буду на языке Caché ObjectScript, но даже если вы его не знаете — не беда. В основном будем вызовать XSLT и архиватор. Ничего более. Итак, приступим.
Алгоритм
Алгоритм выглядит следующим образом:
- Распаковываем документ.
- Добавляем наш нижний колонтитул.
- Прописываем ссылку на него в [Content_Types].xml и word/_rels/document.xml.rels .
- В word/document.xml в тег добавляем тег или заменяем в нём ссылку на наш нижний колонтитул.
- Запаковываем документ.
Распаковка
В Caché ObjectScript есть возможность выполнять команды ОС с помощью функции $zf(-1, oscommand). Вызовем unzip для распаковки документа с помощью обёртки над $zf(-1):
Создаём файл нижнего колонтитула
На вход поступает текст нижнего колонтитула, запишем его в файл in.xml:
В XSLT (файл — footer.xsl) будем создавать нижний колонтитул с текстом из тега xml (часть пространств имён опущена, вот полный список):
В результате получится файл нижнего колонтитула footer0.xml :
Добавляем ссылку на колонтитул в список связей основного документа
Сссылки с идентификатором rId0 как правило не существует. Впрочем можно использовать XPath для получения идентификатора которого точно не существует.
Добавляем ссылку на footer0.xml c идентификатором rId0 в word/_rels/document.xml.rels :
Прописываем ссылки в документе
Далее надо в каждый тег добавить тег или заменить в нём ссылку на наш нижний колонтитул. Оказалось, что у каждого тега может быть 3 тега — для первой страницы, четных страниц и всего остального:
Добавляем колонтитул в [Content_Types].xml
Добавляем в [Content_Types].xml информацию о том, что /word/footer0.xml имеет тип application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml :
В результате
Весь код опубликован. Работает он так:
- in.docx — исходный документ
- out.docx — выходящий документ
- TEST — текст, который добавляется в нижний колонтитул
Выводы
Используя только XSLT и ZIP можно успешно работать с документами docx, таблицами xlsx и презентациями pptx.
То, с чем легко справляются машины, зачастую сопряжено с трудностями для человека, и в этом смысле XML (eXtensible Markup Language — расширяемый язык разметки) не исключение. Однако XML позволяет многократно использовать документы и контент, а также автоматизировать деловые процедуры, поэтому накопление опыта и знаний в этой области оправдает себя. К счастью, задача существенно упростилась с появлением версии Microsoft Office 2003. Итак, приступим к делу.
Откройте Word 2003 и наберите в новом файле какую-нибудь строку текста. Сохраните его с помощью команды File / Save As (Файл / Сохранить как), но в качестве типа документа задайте XML. С помощью Проводника (Explorer) укажите местонахождение файла, щелкните на нем правой клавишей мыши, выберите вариант Open With (Открыть как), после чего обратитесь к редактору Notepad. В результате вы обнаружите, что в Word 2003 работать с XML можно на любом уровне. Для документов Word, сохраненных в XML-формате, применяется подготовленная в Microsoft схема под названием WordML (обратите внимание на третью строку своего XML-файла), которая описывает организацию XML-файла и набор допустимых тегов. (Все схемы определяют форму данных, порядок элементов или тегов, сколько тегов требуется и есть ли в них необходимость. Подробная информация о схемах изложена в статье «Structuring XML Documents» (Структурирование XML-документов) по адресу http://go.pcmag.com/structuringxml.) Просмотрев свой WordML-документ, вы увидите, что вся информация, касающаяся документа Word, — шрифты, стили, индивидуальные параметры и сам текст — хранится между XML-тегами w:wordDocument и /w: wordDocument.
В WordML представлена лишь одна из схем, но для формирования данных в соответствии с определенными требованиями понадобятся другие схемы. К счастью, Word 2003 позволяет импортировать XSD-файлы, необходимые для построения и редактирования новых XML-документов. Допустим, что ваша организация планирует обеспечить пользователям возможность импорта материалов с новостями в XML-формате, подходящем для системы управления контентом. Воспользуемся файлом под названием Article.xsd, с выбранной нами готовой схемой и соответствующим его структуре образцом XML-документа под названием SampleArticle.xml. (См. подробности по адресу http://go.pcmag.com/samplexmldocs.) Этот информационный объект содержит поля, с обработкой которых справляется система управления онлайновой информацией, такие, как заголовки новостей, ключевые слова и фотографии.
Необходимо «сообщить» Word 2003, что будет использоваться выбранный нами специальный XSD-файл. Обратимся к команде File / New (Файл / Создать) и выберем вариант XML-документ. В правой панели XML Structure щелкнем на пункте Templates and Add-ins (Шаблоны и надстройки), затем на вкладке new XML Schema. Щелкнем после этого на кнопке Add Schema и найдем файл Article.xsd. И наконец, выберем для этой схемы URI-имя. В данном случае тип будет у нас обозначаться как «Article», что позволит «зарегистрировать» в Word новый XML-тип.
Начать работу с XML лучше всего с образца документа того типа, который вы хотели бы создать и который соответствует вашему XSD-файлу, например такого, как выбранный нами SampleArticle.xml. В качестве базового XML-редактора Word 2003 отлично справляется со своими функциями, ярко выделяя XML-теги с маркерами полей. Щелкнув на любом из полей, можно быстро выделить внутреннее содержимое любого тега или поля (вместе с вложенными полями и имеющимися в них иерархическими тегами). Можно скрыть эти поля или показать их на экране клавишной комбинацией Ctrl-Shift-X, а также добавлять или удалять теги.
После щелчка правой клавишей мыши и выбора пункта View XML Structure Word проанализирует известные теги в файле с XML-документом и выведет их список в правой части экрана в панели XML Structure.
Если XML-элементы в документе соответствуют XSD-схеме, файл называют допустимым XML-документом. Мы не рекомендуем наспех вводить в Word 2003 новые теги, так как это может нанести вред имеющемуся допустимому XML-документу. Но, если ваш XML-документ достаточно простой и у вас есть справочная распечатка допустимых в нем тегов и полей, вы, наверное, сможете размечать содержимое, исходя из особенностей этой XML-структуры.
Еще один аспект XML-конструкции — XML-атрибуты: если щелкнуть правой клавишей мыши на каком-либо поле, а затем выбрать пункт Attributes, можно будет просматривать и редактировать эти связанные с полями дополнительные элементы. Но широкое использование атрибутов в XML-схеме затрудняет рядовому пользователю редактирование XML-материалов.
На рисунке показан образец файла с XML-материалом, сформированного по такой же XSD-схеме, но содержащего только заполнитель. Создавая по XSD-«шаблону» подобный этому образец документа с заполнителем в каждом поле, вы превращаете обычную программу Word 2003 в редактор форм на базе XML. Вполне успешно применять Word в качестве инструмента ввода данных способен практически любой пользователь. Достаточно лишь ввести необходимые данные на место текста-заполнителя в соответствующем поле в рамках каждого тега (и сохранить файл под новым именем). Заполняя требующейся информацией поля между тегами, можно создавать новые XML-документы, соответствующие выбранным вами стандартам.