Как программно вставить изображение печати в фигуру прямоугольник при работе с LibreOffice Writer из 1С?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

При автоматизации формирования документов с использованием LibreOffice Writer из 1С, часто возникает задача вставки графических элементов, таких как сканированная печать, в заранее подготовленные шаблоны. Ситуация осложняется, когда место для печати обозначено графическим примитивом (фигурой). Разберем, почему стандартные методы могут не срабатывать и какие альтернативные пути решения существуют.

Почему не работает прямая заливка через FillStyle?

В большинстве случаев, когда мы пытаемся обратиться к объекту CustomShape, используя свойство FillStyle = BITMAP, мы сталкиваемся с тем, что LibreOffice не отображает изображение. Причина кроется в архитектурных особенностях API LibreOffice:

  1. Объекты типа CustomShape (автофигуры) не всегда корректно поддерживают растровую заливку через программное изменение свойств.
  2. Свойство FillBitmapURL требует строгого формата пути. Путь должен быть в формате file:/// с использованием прямых слэшей. Даже если документ открывается успешно, передача некорректного URL в свойства графического объекта может приводить к «тихой» ошибке.
  3. Отсутствие команды на принудительную перерисовку объекта. После изменения свойств FillStyle, FillBitmapMode и FillBitmapURL, объект может не обновить свое визуальное состояние до тех пор, пока не изменится его геометрия или не будет вызвано обновление страницы.

Метод записи макроса для анализа

Если вы не уверены, какие именно методы API LibreOffice вызывают нужное действие, воспользуйтесь встроенной системой записи макросов. Несмотря на то что работа с мышью не всегда записывается корректно, сам процесс создания макроса позволяет увидеть, к каким объектам и свойствам обращается сам LibreOffice при изменении заливки фигуры.

Разберем, как это реализовать:

Использование GraphicObjectShape вместо заливки фигуры

Более надежным методом, признанным в профессиональном сообществе, является отказ от использования автофигуры как контейнера для заливки. Вместо этого мы предлагаем рассмотреть использование GraphicObjectShape. Суть метода заключается в создании полноценного графического объекта прямо поверх метки-прямоугольника.

Разберем алгоритм действий:

  1. Найдем фигуру-прямоугольник в документе, используя перебор коллекции DrawPages.
  2. Получим координаты (Position) и размеры (Size) найденного прямоугольника.
  3. Создадим новый объект типа GraphicObjectShape.
  4. Присвоим созданному объекту те же координаты и размеры, что и у прямоугольника.
  5. Удалим исходный прямоугольник методом dispose(), чтобы он не мешал отображению печати.

Посмотрим на примерный принцип реализации логики в коде 1С:


// Предположим, что oItem — это найденная фигура "ПечатьОрганизации"
// Получаем параметры исходной фигуры
Позиция = oItem.Position;
Размер = oItem.Size;

// Создаем новый графический объект
GraphicShape = Document.createInstance("com.sun.star.drawing.GraphicObjectShape");
// Добавляем на страницу
Document.DrawPages.getByIndex(0).add(GraphicShape);

// Устанавливаем параметры
GraphicShape.Position = Позиция;
GraphicShape.Size = Размер;
GraphicShape.GraphicURL = ПривестиФайлКУРЛ("C:\К.png");

// Удаляем метку
oItem.dispose();

Важные советы по отладке

Проанализируем ситуацию, если изображение все еще не отображается:

Использование GraphicObjectShape является наиболее предпочтительным, так как этот подход имитирует стандартную вставку изображения пользователем, что делает его максимально устойчивым к различным версиям LibreOffice и OpenOffice.

← На главную