Как извлечь текст из документов Word (.doc и .docx) в 1С без использования COM?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Встала задача извлечь текстовое содержимое из Word-файлов для дальнейшей обработки, например, для передачи в нейросеть. Часто перед этим требуется выполнить анализ изображений с помощью ИИ">анализ изображений с помощью ИИ, если в документе содержатся графические данные. При этом стоит важное ограничение — не использовать технологию COM для подключения к Microsoft Office. Это связано с тем, что COM-соединение может быть нестабильным, медленным и требует установленного MS Office на сервере, что не всегда возможно или желательно. Давайте разберем, какие существуют подходы для решения этой задачи, от нативных средств платформы 1С до использования внешних утилит.

Проанализируем ситуацию: у нас есть два формата файлов — современный .docx и устаревший бинарный .doc. Подходы к ним будут различаться.

Способ 1: Работа с форматом DOCX как с архивом (нативный метод 1С)

Современный формат .docx — это, по сути, обычный ZIP-архив. Внутри него находится структура папок и XML-файлов, которые описывают содержимое документа: текст, стили, изображения и т.д. Основной текст документа хранится в файле word/document.xml. Это открывает нам путь к извлечению текста с помощью стандартных объектов 1С — подход, лежащий в основе работы с документами Word (docx) без установленного MS Office (Native). Для низкоуровневой работы с такими структурами может пригодиться специализированный распаковщик и запаковщик файлов">распаковщик и запаковщик файлов, написанный на чистом языке 1С.

Рассмотрим алгоритм по шагам:

  1. Открыть архив. Используем объект ЧтениеZipФайла, чтобы получить доступ к содержимому .docx файла.
  2. Найти нужный файл. Внутри архива ищем файл с путем word/document.xml.
  3. Извлечь XML. С помощью метода Извлечь() получаем содержимое этого файла.
  4. Распарсить XML. Теперь у нас есть XML-строка, которую нужно проанализировать. Для этого можно использовать объекты ЧтениеXML и ПостроительDOM. Текст документа находится внутри тегов <w:t>. Нам нужно обойти все узлы документа и собрать содержимое этих тегов. Такой алгоритм позволяет выполнять парсинг файлов docx (Word) на сервере без установленного офиса.

Преимущества этого метода:

Недостатки:

Если вы не хотите писать всё с нуля, существуют готовые решения для работы с файлами Word (docx) без использования COM и MS Office. Примерный концепт кода может выглядеть так:


Процедура ИзвлечьТекстИзDocx(ИмяФайла)
    
    Попытка
        ЧтениеZip = Новый ЧтениеZipФайла(ИмяФайла);
    Исключение
        Сообщить("Не удалось открыть файл как ZIP-архив.");
        Возврат;
    КонецПопытки;
    
    // Ищем файл с текстом документа
    ФайлXML = ЧтениеZip.Найти("word/document.xml");
    
    Если ФайлXML = Неопределено Тогда
        Сообщить("В архиве не найден файл document.xml. Возможно, это невалидный DOCX.");
        ЧтениеZip.Закрыть();
        Возврат;
    КонецЕсли;
    
    // Извлекаем его в двоичные данные, а затем в строку
    ДвоичныеДанныеXML = ФайлXML.ПолучитьДанные();
    СтрокаXML = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанныеXML, КодировкаТекста.UTF8); // Нужна вспомогательная функция
    
    ЧтениеZip.Закрыть();
    
    // Далее следует сложная часть с парсингом XML
    // Используем ЧтениеXML для последовательного чтения или ПостроительDOM для построения дерева
    // Цель - найти все узлы с именем "w:t" и собрать их текстовое содержимое.
    
    // ... код парсинга XML ...
    
КонецПроцедуры

Способ 2: Использование встроенного объекта "ИзвлечениеТекста"

В платформе 1С есть специальный объект ИзвлечениеТекста, предназначенный для получения текстового содержимого из файлов различных форматов. Он используется, в частности, механизмом полнотекстового поиска. Это самый простой способ с точки зрения кода в 1С, особенно когда вам требуется универсальное чтение текста, штрих-кодов, QR из PDF и картинок">чтение текста из PDF и картинок или документов Word.

Как это работает? Механизм опирается на технологию IFilter, которая встроена в Windows. IFilter — это драйвер, который "умеет" читать определенный формат файла и выдавать его текстовое содержимое. Для файлов .doc и .docx такой драйвер поставляется вместе с Microsoft Office или специальным пакетом Microsoft Office Filter Pack.

Порядок действий:

  1. Убедитесь, что на сервере 1С (или на клиенте, где будет выполняться код) установлен Microsoft Office или Microsoft Office Filter Pack. Без этого ничего не сработает.
  2. В коде 1С создайте объект ИзвлечениеТекста и передайте ему путь к файлу.
  3. Вызовите метод ПолучитьТекст().

// Путь к вашему файлу Word
ПутьКФайлу = "C:\Temp\МойДокумент.docx";

// Создаем объект для извлечения текста
Извлекатель = Новый ИзвлечениеТекста(ПутьКФайлу);

// Получаем текст
ТекстовоеСодержимое = Извлекатель.ПолучитьТекст();

Если ТекстовоеСодержимое <> Неопределено Тогда
    Сообщить(ТекстовоеСодержимое.Получить());
Иначе
    Сообщить("Не удалось извлечь текст. Проверьте наличие iFilter для данного типа файла.");
КонецЕсли;

Преимущества:

Недостатки:

Способ 3: Автоматическая конвертация DOC в DOCX с помощью внешних утилит

Основная головная боль — это старый формат .doc. Поскольку работать с его бинарной структурой напрямую очень сложно, самый рациональный подход — конвертировать его в понятный нам .docx. Сделать это можно автоматически, вызывая из 1С утилиты командной строки. Если же файл является сканом, то поможет распознавание текста и сравнение документов">распознавание текста и сравнение документов с использованием OCR-технологий.

Использование LibreOffice или OpenOffice

Офисные пакеты с открытым исходным кодом, такие как LibreOffice, можно запускать в "headless" режиме, то есть без графического интерфейса, для выполнения различных задач, включая конвертацию файлов. Технические детали и примеры скриптов описаны в статье про использование LibreOffice для конвертации документов.

Команда для конвертации выглядит так:

"C:\Program Files\LibreOffice\program\soffice.exe" --headless --convert-to docx "путь\к\файлу.doc" --outdir "путь\к\папке\результата"

В 1С это можно вызвать с помощью объекта ЗапуститьПриложение(). После выполнения команды в указанной папке появится файл с расширением .docx, который уже можно разобрать Способом 1.

Плюс: бесплатно, надежно, кроссплатформенно. Минус: требует установки довольно большого офисного пакета (около 500 МБ).

Использование конвертера Microsoft Office (wordconv.exe)

Если на машине все же установлен MS Office, можно использовать его собственный консольный конвертер, не прибегая к COM. В составе Office есть утилита wordconv.exe.

Пример команды для конвертации одного файла:

"C:\Program Files\Microsoft Office\Office12\wordconv.exe" -oice -nme "C:\input\file.doc" "C:\output\file.docx"

Для массовой конвертации можно использовать цикл в командном файле (.bat).

Плюс: использует "родной" конвертер от Microsoft. Минус: требует установленного MS Office, путь к утилите может отличаться в разных версиях.

Использование Pandoc

Pandoc — это универсальный конвертер документов, настоящий "швейцарский нож" для работы с файлами. Он поддерживает огромное количество форматов, в том числе и преобразование из .doc в .docx. Это легковесная утилита, которую легко установить.

Команда очень проста:

pandoc "C:\input\file.doc" -o "C:\output\file.docx"

Плюс: легкий, быстрый, мощный. Минус: еще одна внешняя зависимость, которую нужно разворачивать на сервере. Для обработки полученных данных может быть полезна портативная обработка чтения файла в таблицу">портативная обработка чтения файла в таблицу.

Способ 4: Прямое извлечение текста из DOC с помощью Antiword

Если вам не нужно сохранять структуру и форматирование, а нужен только "голый" текст из .doc файла, можно воспользоваться утилитой Antiword. Это старая, но проверенная временем программа для командной строки, которая делает ровно одну вещь: вытягивает текст из .doc.

Пример вызова:

antiword "C:\input\file.doc" > "C:\output\file.txt"

После этого вы можете просто прочитать текстовый файл средствами 1С.

Плюс: очень быстрый и простой способ получить чистый текст. Минус: работает только с .doc, теряется все форматирование.

Продвинутые методы: внешние библиотеки и сервисы

Для более сложных или масштабируемых систем можно рассмотреть и другие варианты:

Подведем итог: выбор метода зависит от ваших ограничений и требований. Если нужно кроссплатформенное и полностью нативное решение для .docx — разбирайте его как ZIP-архив. Если у вас Windows-сервер с MS Office, самый простой путь — ИзвлечениеТекста. Если нужно работать со старыми .doc файлами, лучший вариант — настроить автоматическую конвертацию с помощью внешних утилит, таких как LibreOffice или Pandoc.

← На главную