|
Сравнение колонтитулов
|
|||
---|---|---|---|
#18+
Приветствую всех! Столкнулся с не совсем понятным для меня поведением Word. Пишу набор инструментов для обработки документов. В частности одна из задач: на вход поступет несколько документов, на выходе это все склеивается в один. Делается это вручную, но после склейки хочется провести некоторую пост обработку, в частности убрать лишние разделы, так как авторы отдельных документов не специалисты в оформленни текстов и зачастую вставляют вообще ненужные разрывы разделов. Написал цикл, бегущий по разделам и сравнивающий параметры текущего и предыдущего разделов: размер и ориентация страниц, количество колонок и колонтитулы. Если все параметры совпадают - разделы объединяются. Для начала как проверяю идентичность колонтитулов: отдельно headers и footers, если в разделе отдельные колонтитулы чет/нечет или первой страницы, то их отдельно. Проверяю три параметра: текст, поля (fields) по количеству/типу/формуле поля и shapes по тексту и полям (fields). Это все связано с тем, что при оформлении документа в колонтитулах часто присутствуют shape с текстом, номерами страниц и т.д. Функции сравнения передаю range (CompareRanges(s.Headers(wdHeaderFooterPrimary).Range, s_.Headers(wdHeaderFooterPrimary).Range) CompareRanges сравнивает текст (там все понятно: If (VBA.StrComp(r1.Text, r2.Text, vbBinaryCompare) <> 0) и передает эти range функциям сравнения полей и рамок. Сравнение полей просто попарно по списку сравниваются тип и, при совпадении, f.code. Фигуры загоняются в коллекции и двумя вложенными циклами ищутся совпадения по тексту и полям, и, при совпадении, удаляются из коллекций. Если в конце коллекции пусты - значит наборы совпадают. Такая сложность из-за того, что порядок рамок может быть изменен в разных разделах. И вроде все хорошо, все прекрасно отработало на тестовом документе, но случайно напал на очень неприятную и непонятную мне вещь. В тестовом документе (с порядка 40 разделами) сделал в четырех разделах рамки с текстом. Затем поставил курсор в один из этих разделов и сделал запрос в immediate: ?selection.Sections(1).Headers(wdHeaderFooterPrimary).Shapes.Count К моему удивлению вернулось значение 4. И в каком бы разделе я это не делал, результат был тот же самый. Перебор текстов показал, что в Headers хранятся все рамки всех разделов! Мало того, в колонтитуле четных, который вообще не задействован ни в одном разделе, и в footers, тоже не используемом, тот же самый список! То есть, получается, все танцы с бубнами с проверкой списка рамок в моей программе работает неправильно, список фигур всегда один и тот же во всех разделах и тест всегда будет выдавать положительный результат проверки! Вопрос: как мне получить рамки только текущего раздела? И, может быть, правильнее задать такой вопрос: как ПРАВИЛЬНО сравнить на полное совпадение два колонтитула разных разделов одного документа, учитывая возможное наличие текстов с полями (fields) в рамках? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2020, 00:25 |
|
|
start [/forum/topic.php?fid=61&fpage=5&tid=2171847]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
others: | 285ms |
total: | 426ms |
0 / 0 |