Некоторое время назад у меня возникла задача — надо было взять некоторое количество файлов в формате DOCX и конвертировать в другой формат. Ну казалось бы, бери да конвертируй — открыл файл, сохранил в нужный формат…
Дело осложнялось тем, что «некоторое количество» — в моем случае составляло примерно 40 000 документов.
Да, есть всякие там конвертеры, и многие из них даже умеют обрабатывать файлы скопом. Но мне, с другой стороны, было важно, чтобы это было сделано именно с помощью Word. Значит скрипты…
Поиском я быстро нашел статью на Хабре — «Автоматизация конвертирования word файлов в другие форматы» — https://habr.com/ru/post/441736/.
В ней описано решение на VBS. А в комментариях приведен пример с Python, который мне понравился больше. В качестве источника указывается вот эта ссылка: https://stackoverflow.com/questions/29637626/converting-rtf-to-pdf-using-python.
По ней можно обнаружить такой вот скрипт:
import sys
import os,os.path
import comtypes.client
wdFormatPDF = 17
input_dir = ‘input directory’
output_dir = ‘output directory’
for subdir, dirs, files in os.walk(input_dir):
for file in files:
in_file = os.path.join(subdir, file)
output_file = file.split(‘.’)[0]
out_file = output_dir+output_file+’.pdf’
word = comtypes.client.CreateObject(‘Word.Application’)
doc = word.Documents.Open(in_file)
doc.SaveAs(out_file, FileFormat=wdFormatPDF)
doc.Close()
word.Quit()
Мне он очень понравился. Немного «разжую» как этим пользоваться:
1. необходимо скачать и установить интерпретатор Python (берем с официального сайта — https://www.python.org/downloads/)
2. установите Python, при установке в разделе «Optional Features» отметьте галочкой «pip», а в разделе «Advanced Options» не забудьте указать параметр «Add Python to environment variables» (если забыли — все это можно сделать повторно запустив установщик).
3. установите необходимые модули — для этого запустите командную строку и по очереди выполните команды:
pip install python-docx
pip install comtypes
4. создать текстовый файл. Можно его назвать, например, converter.py.
5. в текстовый файл поместить приведенный выше код.
В него подставляем:
- вместо input directory — путь к папке из которой будут браться файлы;
- вместо output directory — соответственно, путь к папку, куда надо поместить файлы после конвертирования;
- вместо wdFormatPDF = 17 — значение, соответствующее тому формату, который нужен на выходе.
Ниже привожу табличку поддерживаемых форматов (изначально отсюда https://docs.microsoft.com/en-us/office/vba/api/word.wdsaveformat).
Например, если хотим RTF — wdFormatRTF = 6.
- соответственно, заменяем значение в третьей снизу строчке, которая начинается на doc.SaveAs…. и содержание строчки out_file = output_dir+output_file+’.pdf’ — здесь тоже в конце нужно написать расширение того формата, в который будут конвертироваться файлы.
После этого осталось лишь запустить процесс двойным щелчком на получившемся файле.
Преимущество перед всяческими конвертерами очевидно:
- бесплатно;
- конвертация происходит именно с помощью Word, а значит с предсказуемым результатом;
- созданные заранее скрипты можно собрать в один, автоматизировав (если вам такое нужно, конечно) многие операции. Т.е. взять откуда-то определенные файлы, сохранить в те или иные форматы, и «разложить» их по нужным местам.
Есть и минусы:
- конвертация достаточно медленная. Испытывал на сравнительно небольших файлах, 10 — 20 страниц. За 10 минут конвертируется около 100 штук. Пробовал создавать RAM-диск под это дело, но на скорости это отразилось мало.
- если по какому-либо файлу у Word’a возникают какие-то вопросы (например, в моем случае часто выскакивала табличка о том, что связанные файлы недоступны), весь процесс останавливается, пока не вмешается пользователь (например, в приведенном примере — возникало диалоговое окно, в котором надо было нажать «ок». Возможно, как-то это можно «победить», но я пока не копал данном направлении.
- пока идет конвертация, нельзя пользоваться Word’ом.
Ниже обещанная таблица поддерживаемых форматов:
Name | Value | Description |
---|---|---|
wdFormatDocument | 0 | Microsoft Office Word 97 — 2003 binary file format. |
wdFormatDOSText | 4 | Microsoft DOS text format. |
wdFormatDOSTextLineBreaks | 5 | Microsoft DOS text with line breaks preserved. |
wdFormatEncodedText | 7 | Encoded text format. |
wdFormatFilteredHTML | 10 | Filtered HTML format. |
wdFormatFlatXML | 19 | Open XML file format saved as a single XML file. |
wdFormatFlatXMLMacroEnabled | 20 | Open XML file format with macros enabled saved as a single XML file. |
wdFormatFlatXMLTemplate | 21 | Open XML template format saved as a XML single file. |
wdFormatFlatXMLTemplateMacroEnabled | 22 | Open XML template format with macros enabled saved as a single XML file. |
wdFormatOpenDocumentText | 23 | OpenDocument Text format. |
wdFormatHTML | 8 | Standard HTML format. |
wdFormatRTF | 6 | Rich text format (RTF). |
wdFormatStrictOpenXMLDocument | 24 | Strict Open XML document format. |
wdFormatTemplate | 1 | Word template format. |
wdFormatText | 2 | Microsoft Windows text format. |
wdFormatTextLineBreaks | 3 | Windows text format with line breaks preserved. |
wdFormatUnicodeText | 7 | Unicode text format. |
wdFormatWebArchive | 9 | Web archive format. |
wdFormatXML | 11 | Extensible Markup Language (XML) format. |
wdFormatDocument97 | 0 | Microsoft Word 97 document format. |
wdFormatDocumentDefault | 16 | Word default document file format. For Word, this is the DOCX format. |
wdFormatPDF | 17 | PDF format. |
wdFormatTemplate97 | 1 | Word 97 template format. |
wdFormatXMLDocument | 12 | XML document format. |
wdFormatXMLDocumentMacroEnabled | 13 | XML document format with macros enabled. |
wdFormatXMLTemplate | 14 | XML template format. |
wdFormatXMLTemplateMacroEnabled | 15 | XML template format with macros enabled. |
wdFormatXPS | 18 | XPS format. |
Епрст…где отступы-то в коде ? )