Автоматическое преобразование файлов Microsoft Word в различные форматы

При решении повседневных ИТ-задач, таких как администрирование сети и поддержка пользователей, часто применяются различные файлы, особенно документы, составленные в текстовых редакторах. К сожалению, встроенные инструменты Windows позволяют работать с документами только как с файлами; стандартные инструменты не обеспечивают обработку внутренних данных Word, например преобразование типа документа.

Я составил сценарий WSH (Windows Script Host) под названием ConvertWord, который используется в качестве командной оболочки для Microsoft Word и облегчает работу с документами. Кроме того, сценарий может быть полезен для тестирования некорректных документов.

Требования ConvertWord

Для использования ConvertWord на компьютере должен быть установлен Word 97 или более поздняя версия текстового редактора. Полный исходный текст ConvertWord можно загрузить с Web-узла нашего журнала. Фрагменты сценария ConvertWord приведены ниже. Файлы convertword.wsf и convertword.cmd следует сохранить в одной папке.

ConvertWord может автоматически задействовать любой преобразователь файловых форматов, реализованный в Word. Вместе с Word поставляется базовый набор преобразователей форматов файлов для типовых документов. Однако в этот набор не входят специальные конвертеры, например для документов Microsoft Works или WordPerfect. Чтобы получить эти и другие факультативные конвертеры, необходимо выполнить специальную установку Word.

Стандартные конвертеры Word, которые входят в пакет Microsoft Office Resource Kits, можно загрузить со страницы Office 2003 Editions Resource Kit по адресу http://www.microsoft.com/office/ork/2003/default.htm. Конвертеры из пакета ресурсов совместимы с Word 97 и более новыми версиями редактора. После установки пакета ресурсов следует перейти в созданный каталог (по умолчанию, \%programfiles%orktools) и отыскать файл с набором конвертеров (oconvpck.exe), а затем запустить oconvpck.exe на всех компьютерах, на которых нужно развернуть конвертеры.

Назначение ConvertWord

Первоначально целью создания ConvertWord было выполнение некоторых задач, недоступных для мастера Batch Conversion Wizard редактора Word. Мастер Batch Conversion Wizard — полезное дополнение к инструментальному набору любого администратора. Мастер представляет собой шаблон Word, который выполняет преобразование одного входного формата в один выходной формат. Более подробную информацию о таком преобразовании можно найти в статье Microsoft «How to automatically convert many documents to Word 2002 format» по адресу http://support.microsoft.com/?kbid=313714.

Мастер Batch Conversion Wizard выполняет много задач, но не оптимизирован для некоторых из них, например дистанционного администрирования или автоматизации простых преобразований для конечных пользователей, совместно работающих с документами в отдельных узлах сети. ConvertWord поможет решить подобные задачи распределенного преобразования, выполняя следующие базовые операции.

  • Направляет в систему запрос об имеющейся в ней версии Word.
  • Автоматически открывает списки документов смешанных типов произвольной длины.
  • Гарантированно сохраняет документы с уникальными именами в формате Word (по умолчанию) или других форматах.
  • Тестирует документы в поисках проблем форматирования и некорректных пользовательских паролей.

Как работает ConvertWord

Процесс преобразования ConvertWord — четырехступенчатый. На первом этапе сценарий генерирует экземпляр приложения Word, как показано во фрагменте листинга 1 с меткой A. Часть исходного текста сценария предназначена для того, чтобы максимально уменьшить число диалоговых окон. Например, исходный текст с меткой B блокирует диалоговые окна, когда это возможно.

На втором этапе ConvertWord открывает каждый документ. Объект Word содержит набор Documents; при вызове метода Open этого набора (фрагмент с меткой A в листинге 2) документ извлекается. Если известно имя документа и нужно, чтобы Word автоматически определил его формат, можно вызвать метод, указав в качестве аргумента только имя документа.

Или же можно указать формат документа в качестве другого параметра для метода Open. К сожалению, в зависимости от версии Word, для метода Open требуется до 16 параметров. Поскольку управляющий форматом параметр расположен на десятом месте, необходимо указать девять предыдущих параметров. В результате получается длинная, громоздкая строка. Информацию о параметрах можно получить по адресу http://msdn.microsoft.com/library/default.asp?url=/library/ enus/dv_wrcore/html/wrconwordobjectmodeloverview.asp или в Справке Word.

Параметры ConvertWord — FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate и Format. Параметр FileName — имя файла документа Word. С помощью параметра ConfirmConversions можно вывести на экран диалоговое окно, когда Word преобразует открытый документ. В ConvertWord этому параметру всегда присваивается значение False, чтобы облегчить автоматизацию.

Параметр ReadOnly управляет процессом открытия документа только для чтения; ConvertWord всегда присваивает данному параметру значение True, чтобы исходный документ не изменился. AddToRecentFiles определяет, будет ли открытый документ внесен в список RecentFiles текущего пользователя. Документ может быть одним из десятков или даже сотен, поэтому добавлять его к списку не рекомендуется и параметру присваивается значение False.

PasswordDocument — пароль для открытия защищенных документов, а PasswordTemplate — пароль для шаблонов. Эти значения бесполезны для документов, отличных от Word, поэтому вместо любого параметра можно указать две двойные кавычки («»), обозначающие пустую строку. Параметр Revert определяет, вернется ли сценарий к текущей открытой версии документа, если преобразуемый документ уже открыт. ConvertWord присваивает данному параметру значение True, чтобы избежать потери изменений и активизировать только открытый экземпляр документа.

Параметры WritePasswordDocument и WritePasswordTemplate указывают пароли, необходимые для сохранения открытого документа или шаблона. Для целей данной статьи эти параметры не обязательны, так как ConvertWord не перезаписывает исходный документ; поэтому в сценарии задается «» для каждого из этих аргументов.

Наконец, параметр Format представляет собой число, указывающее на метод, который Word использует для определения формата открытого документа. Правильно указать число непросто, так как числа и представляемые ими методы зависят от установленной версии Word, дополнительных конвертеров документов и порядка установки. Предположим, нам нужно открыть и преобразовать документ RTF (Rich Text Format) с кодом открытия формата 3. Чтобы открыть пример документа с помощью стандартного конвертера RTF, используется следующая процедура:

Set doc = Word.Documents._

Open(«c:my.rtf», False, _

True, False, «», «», _

True, «», «», 3)

Некоторые строки исходного кода в данной статье разбиты на несколько строк из-за недостатка места. Список дополнительных конвертеров документов с соответствующими номерами и стандартными расширениями можно отыскать с помощью набора FileConverters объекта. В исходном тексте листинга 3 показан список этих конвертеров. В списке нет стандартных конвертеров Word. Список стандартных конвертеров Word можно найти в табл. 1 и в справке по Word.

Подпрограмма CreateFormatCollections сценария ConvertWord отображает список конвертеров Word. Хотя сценарий отчасти упрощает задачу определения форматов открытия и сохранения, формат, используемый для открытия или сохранения документа, зависит от версии Word и порядка установки конвертеров.

После открытия документа его новая версия сохраняется с использованием метода SaveAs (фрагмент с меткой A в листинге 4). Метод SaveAs принимает до 16 параметров, но нам нужны только два, так как необходимый параметр SaveFormat — второй. Как и в случае с параметрами OpenFormat, необходимо указать коды формата открываемого документа в параметре SaveFormat. Чтобы указать формат сохранения — например, сохранить документ в чисто текстовом файле C:my.txt, — следует ввести команду

doc.SaveAs «C:my.txt», 2

Сохранив документ, ConvertWord закрывает его с помощью метода Close (метка B листинга 4). Значение False указывает, что Word должен отменить изменения, если документ после сохранения был изменен. Когда сценарий последовательно откроет, сохранит и закроет все документы, последним шагом будет выход из Word через вызов метода Quit программы Word (листинг 5).

Применение ConvertWord

Перед первым запуском ConvertWord полезно ознакомиться с информацией о локальной версии Word, выполнив команду

convertword /version

Эта команда показывает важную информацию, в том числе номер установленной на машине версии Word. Компания Microsoft перестала указывать номер версии в имени продукта начиная с Office 95 (которая называлась бы Office 7), но внутренний номер версии увеличивается на 1 с выпуском каждой следующей существенно обновленной версии. Такая же схема нумерации используется и в Word как в компоненте комплекса Office. Внутренние номера версий — 8 (Word 97), 9 (Word 2000), 10 (Word 2002) и 11 (Word 2003).

По умолчанию ConvertWord автоматически открывает файлы, делая обоснованные предположения об их формате (например, Word, простой текст, WordPerfect, RTF) и сохраняет их в виде документов Word, давая им уникальные имена, состоящие из имени файла, символа подчеркивания и номера. В ConvertWord предусмотрено несколько способов назначения документам имен. Имя файла можно ввести в качестве аргумента следующей команды:

convertword unicode.txt plain.txt

otherdocscorel.wps

В результате такого подхода выходные файлы в формате Word сохраняются как unicode.doc, plain.doc и otherdocscorel.doc. Другой вариант — настроить ConvertWord на чтение файлов из стандартного источника, например:

convertword < convertthese.txt

Результаты команды, создающей список файлов, можно направить в ConvertWord следующим образом:

dir /s /b c:inbox*.txt

| convertword

Если входные данные не заданы, то ConvertWord просит указывать имена входных документов до тех пор, пока не будет дважды нажата комбинация клавиш Ctrl+C.

В ConvertWord реализован простой метод, который позволяет избежать перезаписи файлов, имеющих одинаковые имена. Предположим, требуется сохранить файл Word как текстовый файл с именем mylist.txt. Если файл с таким именем уже существует, то ConvertWord начинает перебирать последовательность производных имен — mylist_1.txt, mylist_2.txt и т. д. — до тех пор, пока не будет найдено неиспользованное имя. Затем это имя присваивается сохраняемому файлу. Как правило, на поиск имени файла уходит меньше времени, чем на открытие и сохранение документа вручную.

Изменение места хранения и имени файлов

ConvertWord сохраняет файлы в той же папке, в которой расположен исходный файл, с тем же базовым именем. Таким образом, при преобразовании файлов для многих пользователей или групп пользователей новые файлы будут размещаться рядом со старыми. Обычно пользователи знают «свои» файлы и помнят их имена.

Но каталог для записи преобразованных документов можно изменить. Для этого достаточно указать ключ /d с полным именем, которое может быть абсолютным или заданным относительно пути, указывающего на папку, в которой работает сценарий. ConvertWord расширяет путь до полного формата и создает соответствующий каталог, если он еще не существует.

Например, чтобы сохранить все файлы в каталоге C: empexports, следует запустить ConvertWord и указать каталог:

convertword /d:c: empexports

Изменить базовое имя (имя файла без расширения) можно с помощью ключа /b. Если ConvertWord обнаруживает несколько файлов с одинаковым именем, то ConvertWord изменяет имена файлов, как объяснялось выше. Можно также применить ключ /x, чтобы указать расширение файла, отличное от стандартного расширения экспортируемого типа файла.

Создание документов, отличных от Word

По умолчанию ConvertWord автоматически генерирует документы Word. Если нужно создать документ, отличный от Word, то можно задействовать параметр /sa утилиты ConvertWord, чтобы изменить стандартный формат сохранения. Форматы, в которых можно сохранять файлы, изменяются в зависимости от версии Word и дополнительных конвертеров, имеющихся в системе, в которой работает ConvertWord. Первый шаг при сохранении файла в определенном формате — запуск Word с ключом /cnv для просмотра установленных конвертеров; номер конвертера соответствует типу, в котором требуется сохранить новый файл. Если все файлы необходимо сохранить в определенном формате, например RTF (номер 6), то к аргументам ConvertWord следует добавить ключ /sa:6. Например, чтобы преобразовать все файлы WordPerfect в текущей папке в RTF, следует запустить команду

dir /s /b *.wpd

| convertword /sa:6

В зависимости от версии Word и установленных конвертеров, число доступных форматов может быть велико. Перед преобразованием файлов нужно всегда проверять типы, так как в разных машинах их номера будут разными. Единственное исключение из этого досадного правила составляют стандартные встроенные конвертеры Word. Word 97 и более поздние версии имеют одинаковые значения от 0 до 6, и номера стандартных типов увеличиваются с добавлением новых версий. Для Word 2003 номера от 0 до 11 будут на всех машинах одинаковыми. Исключение из стандартных значений — вывод с номером -1. Это значение не соответствует конвертеру Word, а используется в качестве команды ConvertWord для записи данных из файла документа на консоль. Его можно задать с помощью ключа /sa — /sa:-1 или /sa+.

Обработка ошибок

В ходе крупномасштабных операций преобразования могут возникнуть проблемы с некоторыми файлами. Необходим способ отслеживания документов, попытка преобразования которых закончилась неудачей. Если преобразовать файл не удается, то ConvertWord передает имя файла и описательную информацию в стандартный поток ошибок (standard error stream — StdErr); администратор может отслеживать отказы, наблюдая, как имена файлов прокручиваются на экране, или перенаправляя данные об ошибках в файл для последующего анализа, например:

convertword < c:filelist.txt 2 >

errors.txt

По умолчанию ConvertWord показывает ошибки, приводя только имя файла и номер ошибки:

c:demo.rtf FAILED: 2

С помощью ключа /v+ (verbose output) можно получить более подробную информацию об ошибке:

convertword < c:filelist.txt 2

/v+>errors.txt

Ключ /v- не выдает номеров ошибок; вместо этого имя файла просто пересылается в StdErr, чтобы облегчить последующую обработку.

Последняя ошибка, обнаруженная ConvertWord, всегда принимается в качестве окончательного уровня ошибки; после завершения работы сценария это значение доступно в командной среде и может быть прочитано другим сценарием, который определит, был ли вызов ConvertWord успешным или закончился неудачей.

Чтобы обнаружить потенциальные ошибки, не преобразуя документы, можно запустить ConvertWord с ключом /w (what if — что, если). Этот ключ заставляет ConvertWord открыть все документы, не сохраняя их. Если в каких-нибудь файлах происходят сбои, например искажаются внутренние данные, то будет выдано обычное сообщение об ошибке.

Решение проблемы паролей

Пароли доставляют особенно много проблем при групповой обработке, поскольку они могут быть для разных документов различными. По умолчанию ConvertWord использует символ «пробел» в качестве пароля, который открывает все документы, не имеющие паролей, а документы с паролями генерируют ошибку, которая не останавливает дальнейшую обработку.

Такое поведение можно изменить с помощью ключа /p (password). Если указать пустой аргумент (например, /p:»»), то Word просит ввести пароль для всех защищенных документов. С ключом /p можно указать конкретный пароль. Однако при этом открыть документы без пароля или с паролем, отличным от указанного, не удастся.

Практическое применение ConvertWord

Я провел приблизительно 30 тыс. преобразований с использованием ConvertWord и обнаружил несколько типичных проблем. Необычные сбои почти неизменно были вызваны ошибками автоматизации Word; номер ошибки и сообщение в большинстве случаев исходили от Word. Большинство ошибок (например, неверный пароль) нетрудно устранить или понять. Следующие три ошибки повторялись достаточно регулярно.

Первая из них — всплывающее диалоговое окно Word для документов, содержащих макрокоманды. По умолчанию ConvertWord блокирует макрокоманды в документах, чтобы защитить пользователя от опасного программного кода. Однако, когда Word открывает документы, содержащие макрокоманды, на экран выводится диалоговое окно с сообщением о блокировании макрокоманд. Единственный известный мне способ устранить это окно — разрешить выполнение макрокоманд. Сделать это можно, запустив ConvertWord и указав ключ /as (automation security — безопасная автоматизация) со значением 0 (/as:0). Это стандартное значение для программно открываемых документов Word. Перед использованием ключа /as необходимо убедиться, что открываемый документ не содержит опасного программного кода.

Вторая ошибка связана с некоторыми документами RTF, которые не удается успешно открыть, но которые тем не менее корректно отображаются в WordPad. Обычно они неверно отформатированы и не могут быть корректно открыты в Word. ConvertWord не в состоянии устранить данную проблему, поэтому для преобразования таких файлов ConvertWord применять нельзя.

Третья ошибка происходит потому, что Word идентифицирует текстовые документы Unicode по начальной отметке Byte Order Mark в файле. Если отметка отсутствует, то Word рассматривает документ как простой текст, и при открывании преобразованного документа пользователь увидит пустоты после каждого видимого символа (в действительности пустоты соответствуют нулевым символам). Единственный способ решить проблему — преобразовать файлы с ключом /oa (OpenAs), настроенным на текст Encoded или Unicode (/oa:5 для Word 97 и более поздних версий).

К счастью, такие ошибки происходят сравнительно нечасто. ConvertWord будет чрезвычайно полезен для обработки большого числа документов и поможет открыть и преобразовать документы Word без утомительной работы вручную.


Специалист по сетям, консультирующий в Индиане. Имеет сертификаты MCSE, MCP+I и MVP. alexangelopoulos@hotmail.com