Вставить картинку по координатам на конкретной странице (writer).

Автор lutermaks, 16 августа 2024, 07:49

0 Пользователи и 1 гость просматривают эту тему.

mikekaganski

Я проверил код Python (правда, на текущем мастере - почему-то у меня выдаёт ошибку загрузки pyuno на релизных версиях) - тоже работает.

"С:\lo\build\instdir\program\python.exe" C:\D\Downloads\ins_to_p3.py -pathDocument C:\D\Downloads\p3.odt -pathImage C:\D\Downloads\tdf162259.png -page 5 -X 1000 -Y 2000
Надо сказать, что без -page, -X и -Y тоже ошибки (там нет для них дефолтных значений).
С уважением,
Михаил Каганский

mikekaganski

Цитата: lutermaks от 19 августа 2024, 15:10Можете еще подсказать как определить размеры текущей страницы?

Сразу записываю, что делал, чтобы получить ответ (чтобы предупредить вопросы типа "где нашли информацию").

Я знаю, что страницы в Writer - это не первичные объекты, а артефакт процесса размещения текста в соответствии с правилами, заданными в самом тексте, с использованием определения форматирования и стилей (форматирования абзаца, где задаётся имя стиля страницы, и стиля страницы, где задаётся геометрия). Насколько я помню, у нас нет UNO-объектов, напрямую предоставляющих доступ к layout-информации. Есть доступ к свойству имени стиля страницы. Отсюда и пляшем.

Чтобы вспомнить имя свойства, я создал документ Writer, открыл Development Tools, активировал Current Selection, и в свойствах нашёл PageStyleName.

Документ предоставляет доступ к семействам стилей, используя getStyleFamilies. Поскольку я не помнил, как именно получить эти семейства (через метод-геттер или через свойство в XPropertySet), я открыл https://api.libreoffice.org/, там IDL Reference, и ввёл style в поле Search. В выпадающем списке нашёл StyleFamilies, и на соответствующей странице (описывающей сервис) посмотрел раздел DetailedDescription, который содержит ссылку на Developers Guide, где есть информация, что документ реализует интерфейс XFamiliesSupplier, где как раз и упомянут метод-геттер.

Соответственно, я набросал в IDE Basic код для получения стиля:

sub getPageDimensions
 selection = ThisComponent.getCurrentController().getSelection()
 end_pos = selection.getByIndex(selection.getCount() - 1).getEnd()
 pageStyleName = end_pos.PageStyleName
 pageStyles = ThisComponent.getStyleFamilies().getByName("PageStyles")
 pageStyle = pageStyles.getByName(pageStyleName)
end sub

Ну и в процессе я, естественно, каждый раз тестировал каждую строчку, ставя останов на конец кода, запуская его и просматривая значения переменных в окне Watch. Там я вижу, что объект pageStyle имеет свойство Size.

Нет, больше я не буду тратить в несколько раз больше времени на описание процесса. Помогать - это одно, но туториалы буду писать, когда выйду на пенсию.
С уважением,
Михаил Каганский

lutermaks

Цитата: mikekaganski от 20 августа 2024, 16:44Вы пробовали код Basic? Если что-то не работает, первый шаг - проверить точно так, как предложено. Потом уже можно по шагам проверять, на каком изменении сломается. (Я проверил: на 7.5 под Windows работает.)

Тесты проводил на формате docx, в формате odt все работает.
Видимо libreOffice ограниченно работает с docx и, видимо, прочими форматами microsoft office

lutermaks

Цитата: mikekaganski от 21 августа 2024, 07:48
Цитата: lutermaks от 19 августа 2024, 15:10Можете еще подсказать как определить размеры текущей страницы?

Сразу записываю, что делал, чтобы получить ответ (чтобы предупредить вопросы типа "где нашли информацию").

Я знаю, что страницы в Writer - это не первичные объекты, а артефакт процесса размещения текста в соответствии с правилами, заданными в самом тексте, с использованием определения форматирования и стилей (форматирования абзаца, где задаётся имя стиля страницы, и стиля страницы, где задаётся геометрия). Насколько я помню, у нас нет UNO-объектов, напрямую предоставляющих доступ к layout-информации. Есть доступ к свойству имени стиля страницы. Отсюда и пляшем.

Чтобы вспомнить имя свойства, я создал документ Writer, открыл Development Tools, активировал Current Selection, и в свойствах нашёл PageStyleName.

Документ предоставляет доступ к семействам стилей, используя getStyleFamilies. Поскольку я не помнил, как именно получить эти семейства (через метод-геттер или через свойство в XPropertySet), я открыл https://api.libreoffice.org/, там IDL Reference, и ввёл style в поле Search. В выпадающем списке нашёл StyleFamilies, и на соответствующей странице (описывающей сервис) посмотрел раздел DetailedDescription, который содержит ссылку на Developers Guide, где есть информация, что документ реализует интерфейс XFamiliesSupplier, где как раз и упомянут метод-геттер.

Соответственно, я набросал в IDE Basic код для получения стиля:

sub getPageDimensions
 selection = ThisComponent.getCurrentController().getSelection()
 end_pos = selection.getByIndex(selection.getCount() - 1).getEnd()
 pageStyleName = end_pos.PageStyleName
 pageStyles = ThisComponent.getStyleFamilies().getByName("PageStyles")
 pageStyle = pageStyles.getByName(pageStyleName)
end sub

Ну и в процессе я, естественно, каждый раз тестировал каждую строчку, ставя останов на конец кода, запуская его и просматривая значения переменных в окне Watch. Там я вижу, что объект pageStyle имеет свойство Size.

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

Спасибо огромное, Вы очень сильно помогли!