Определение расположения текстовых блоков на странице

Автор Gismolik, 17 марта 2018, 08:15

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

Gismolik

Возможно ли каким либо способом программно, исследуя xml файлы пакета документа, вычислить в текстовом документе координаты и размеры абзацев на страницах. На данный момент есть преобразование odt->pdf->odg. При таком преобразовании  тексты в абзацах (частями) помещаются в текстовые блоки, и там уже можно определить их положение. Ну при применении больее сложных стилей форматирования идет сильное искажение документа. Можно как то решить эту задачу другим способом?

mikekaganski

Возможно. Этот алгоритм реализован в OOo/AOO/LO. Достаточно реализовать его снова на основе стандарта ODF.
С уважением,
Михаил Каганский

economist

Gismolik - опишите общую задачу, не совсем понятна цель, особенно последний формат ODG, и возможно есть более простой путь. Writer, на мой взгляд, обеспечивает за счет своих внутренних механизмов: разделов, условного и скрытого текста, врезок (+стили, конечно же) - ВСЕ мыслимые потребности по автоперепозиционированию текстовых блоков. Нужное должно быть получено до преобразований. Есть -headless режим запуска Офиса, то же что и GUI, но консоль. Есть UNO+Python, работающий со всей объектной моделью  и работающий очень быстро. Макросы нужны только в самом конце, и то для доп. плюшек типа записать в БД строку об успешном формировании документа. Синдром "недоизученности" программ - опасная шутка в среде айтишников, я сам от него страдаю :-)    

Глубокая, 100% реализация хотелок и красивостей - это ловушка, из которой можно не выбраться годами. Даже такие монстры как SAP, 1С и тд - плюнули на красоту и советуют пользователям "есть" их отчеты "как есть". При этом они стали монополистами и иконами стиля в мире ПО, 9 из 10 заработанных в РФ рублей - учитываются в этих программах. Это я к чему: большой договор или отчет, сделанный в CrystalReport или 1С - видно сразу, со всеми его огрехами, недопустимыми, скажем, в подарочном издании. Writer позволяет всё это сделать намного красивее, но для этого нужно использовать его интерактивно.

Прямая правка ODT/XML 100% показана при замене, скажем реквизита небольшой длины - ООО "Ромашка" на ООО "Березка". Если же захочется большего (обновления оглавлений, ссылок, переверстки итп) - этот путь тупиковый, быстро упрётесь в ограничения.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Gismolik

#3
Спасибо большое попробую на задачу посмотреть с помощью ваших вариантов)

Суть задачи очень так-то простая: отследить перекрытие каких либо объектов (будь то картинка или обычный текст). В графических элементах все определяется графическими блоками(вроде все) определенных координатами и размерами блока + все это легко и понятно разделено постранично = легко найти наложения. Также в электронных таблицах перекрытие ячеек вполне можно программно подсчитать: есть атрибуты высот строк и ширин столбцов + таблицы также просто разделены постранично = тоже вполне реализуемо) А вот в текстовых документах программное определение координат абзацев видится мне очень проблемным. Поэтому и искались альтернативы. Один из вариантов был как раз преобразование ODT в ODG - так те самые абзацы (точнее составные части абзацев) были помещены в те самые графические блоки (у которых определяются координаты и размеры). Но вот чуть большее форматирование (например фоновое изображение абзаца - превращалось в абракадабру в документе ODG, что не есть хорошо)

mikekaganski

Неясно, что за задача в общем, и какими средствами она решается. Если нужно, можно использовать функционал, который применён в debug-билдах и юниттестах, где есть возможность сделать дамп layout в XML (можно написать вывод и в любой другой формат, или подключить колбэки и обрабатывать на ходу). Но это - задача для разработчика, и если желаете двигаться в этом направлении, добро пожаловать на https://wiki.documentfoundation.org/Development и #libreoffice-dev на FreeNode.
С уважением,
Михаил Каганский

tagezi

Цитата: Gismolik от 21 марта 2018, 10:55в электронных таблицах перекрытие ячеек
о_О что реально там есть перекрытие ячеек?
(x86_64) Kubuntu 16.04.3 - LibreOffice 6.0.2 / 6.1 alpha

mikekaganski

Вероятно, OP считает перекрытие между листами...
С уважением,
Михаил Каганский

economist

Gismolik - в текстовых документах простое нажатие Enter создает новый абзац, который подчиняется еще и стилям. Даже ввод одной буквы может переверстать весь документ (увеличить число страниц, переместить разделы итд). Будут проанализированы все привязки объектов. Это не графика и не таблицы, так что определять границы абзацев без открытия документа в основном приложении - мне кажется бесполезно.

Задачи компоновки уже "готовых" текстовых блоков решают специальные программы - верстальные DTP, CMS. И вы пытаетесь повторить их функционал. Рендер Writer-а непрерывно решает сложную задачу отображения текстовых блоков без наложений (иное просто не имеет смысла), и только врезки немного вклиниваются в этот процесс.

Если финальный результат собирается в DTP/CMS - вашу задачу стоит решать там, в рендере, а не в ODT-файле. А чтобы не работать на уровне plain-text - используйте имеющиеся наработки. Хороший пример - плагин-форматтер MediaWiki в LO. Или расширение odt2dokuwiki (PHP). 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...