Пакетное конвертирование текстовых файлов с помощью Word и Python

Некоторое время назад у меня возникла задача — надо было взять некоторое количество файлов в формате 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. создать текстовый файл. Можно его назвать, например, converter.py.

3. в текстовый файл поместить приведенный выше код.

В него подставляем:

  • вместо 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’ — здесь тоже в конце нужно написать расширение того формата, в который будут конвертироваться файлы.

После этого осталось лишь запустить процесс двойным щелчком на получившемся файле.

Преимущество перед всяческими конвертерами очевидно:

  1. бесплатно;
  2. конвертация происходит именно с помощью Word, а значит с предсказуемым результатом;
  3. созданные заранее скрипты можно собрать в один, автоматизировав (если вам такое нужно, конечно) многие операции. Т.е. взять откуда-то определенные файлы, сохранить в те или иные форматы, и «разложить» их по нужным местам.

Есть и минусы:

  1. конвертация достаточно медленная. Испытывал на сравнительно небольших файлах, 10 — 20 страниц. За 10 минут конвертируется около 100 штук. Пробовал создавать RAM-диск под это дело, но на скорости это отразилось мало.
  2. если по какому-либо файлу у Word’a возникают какие-то вопросы (например, в моем случае часто выскакивала табличка о том, что связанные файлы недоступны), весь процесс останавливается, пока не вмешается пользователь (например, в приведенном примере — возникало диалоговое окно, в котором надо было нажать «ок». Возможно, как-то это можно «победить», но я пока не копал данном направлении.
  3. пока идет конвертация, нельзя пользоваться 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.
Софт Комментарии: 0

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.