Предыстория
Сегодня возникла эпическая задача заменить в нашем документе стиль с общедоступного (Tahoma/ Arial/ Times New Roman) на присланный Заказчиком некий ГОСТ-оподобный шрифт.
Начальник стал делать это по красоте: используя традиционный инструментарий MS Word для работы со стилями. Потратил на это 1,5 часа.
Я решил опробовать метод «грубого вмешательства», наверно это не лучшее решение!
Но думаю в ситуации когда у вас нет времени сделать «все красиво и стильно» и/или вы не знаете как это сделать средствами MS Word этот метод имеет право на жизнь…
Перед вмешательством обязательно сохраните резервную копию документа, на случай если что то пойдёт «не так»!!!
Пошаговая инструкция
В проводнике Windows мышью выделяем интересующий нас документ.
-
Щелкаем правой кнопкой мыши и в выпавшем конектсном меню выбираем архиватор 7-Zip, и в нем пункт меню Открыть архив.
-
В окне архиватора в проводнике архива открывем папку \word.
-
В этой папке находим файл styles.xml.
-
Выбрав файл, щелкаем правой кнопкой мыши и в контекстном меню выбираем верхний пункт Открыть.
-
Документ откроется в приложении Блокнот (Notepad.exe), нужно вызвать окно замены текста выбрав соответствующую команду в контекстном меню или нажав клавиши Ctrl+H.
-
В верхней строке пишем какой шрифт требуется заменить, в нижней на какой и нажимаем Заменить все.
-
Закрываем документ, нажав при этом кнопку Сохранить.
-
В появившемся окне архиватора, появляется предложение обновить файл styles.xml, нажимаем кнопку OK.
PROFIT!
На всё про все потратил 10 минут…
Оценка результатов манипуляций
После открытия отредактированного документа MS Word выяснилось, что целом все прошло все нормально. Единственное проблемное место - встречаются такие артефакты в подписях под рисунками и над таблицами. Обратите внимание, что шрифт до длинной черты-разделителя отличается от шрифта после нее.
Несмотря на то что с обоих сторон текст, показывается набранным одинаковым стилем (**Заг_рис) и шрифтом (GOST type B).
После вырезания разделителя и последующей вставки шрифт всей строки становится одинаковым! В принципе выход, но по тексту документа такие артефакты встречаются много раз.
Позднее я обнаружил, что проблема лечится заменой символа на самого же себя.
Нажимаем команду Заменить или комбинацию клавиш Ctrl+H.
В поле Найти вставляем символ "—".
В поле Заменить на также вставляем символ "—".
В завершение жмем кнопку Найти далее.
После этого шрифт в надписи слева и справа стал выглядеть одинаково.
Комментарии (28)
PuerteMuerte
09.06.2023 09:19Честно говоря, так и не понял, почему сменить шрифт заменой его в файле стилей занимает 10 минут, а сменить шрифт заменой его в окне стиля в ворде занимает полтора часа. Должно быть примерно одинаково :)
kryptograf
09.06.2023 09:19Возможно, потому что, в документе присутствуют и другие шрифты, которые менять не надо, как следствие если менять это руками в Word-e надо выделять только нужные куски текста. А при замене в стилях он заметил нужный шрифт одним разом. Вот и разница во времени выходит, не так ли?
PuerteMuerte
09.06.2023 09:19как следствие если менять это руками в Word-e надо выделять только нужные куски текста.
Там не нужно выделять куски текста, нужно открыть список стилей и поменять шрифт, например, для стиля "обычный", или какой там стиль используется для основного текста. И это то же самое, что поменять его в файле.
RussianAirBorn
09.06.2023 09:19Первый вариант легче автоматизировать
Surrogate Автор
09.06.2023 09:19У меня еще не было такого опыта. Буду рад почитать/посмотреть как это сделать…
Surrogate Автор
09.06.2023 09:19В первом комменте к вашему советуоставлю ссылки на последующие комментарии, которых описываюся нюансы этого конкретного случая и почему описанное в статье решение сработало быстрее (чтобы не тратить время на чтение всех-всех комментариев):https://habr.com/ru/articles/740570/comments/#comment_25629608
https://habr.com/ru/articles/740570/comments/#comment_25628982
https://habr.com/ru/articles/740570/comments/#comment_25632150
ivankudryavtsev
09.06.2023 09:19+2Еще автор путает что такое брут-форс.
Surrogate Автор
09.06.2023 09:19автор путает что такое брут-форс
Факт грубого вмешательства в этом кейсе присутствует? Думаю, да.
PS я готов, изменить заголовок если вы подскажете синоним)
ivankudryavtsev
09.06.2023 09:19+5Brute-force - характеристика переборных методов, когда решение подбирается перебором и сравнением с ожидаемым результатом. То что это на русский переводится как "грубая сила" не значит что любое вмешательство в подлежащие технологии можно называть brute force.
Surrogate Автор
09.06.2023 09:19+2Заменил в заголовке на "грубое вмешательство". В виду того, что вышеизложенный метод не относится к штатным способам для MS Word…
Спасибо, за то что указали на эту мою ошибку !
ap0stol
09.06.2023 09:19+2Брут-форс - это атака перебором, методом "грубой силы". У вас явно другое.
Если уж хочется "хакерского" сленга, то в вашем случае банальный термин "хакинг" и то ближе по смыслу.
p.s. хотя по сути штатное редактирование XML файла docx относить к хакерству вообще язык не поворачивается. Вот если бы после ваших замен Word выполнял произвольный код - это хакинг, а изменить шрифт - это просто "Смена шрифта в docx файле нештатным для MS Word способом"
Surrogate Автор
09.06.2023 09:19Я исправил заголовок статьи. Ещё хочу отметить, что она опубликована в хабе Подготовка технической документации поэтому не стоит ожидать в ней хакерских откровений :)
"Смена шрифта в docx файле нештатным для MS Word способом"
Согласен с вашей формулировкой! Опубликовал этот креатив здесь так как надеюсь, что кому-то из пользователей будет полезен этот опыт
YegorP
09.06.2023 09:19Вас заставляют какой-то фигнёй заниматься. Я бы ещё понял Times New Roman на более доступный аналог менять по каким-то правовым заморочкам. Но зачем вообще тратить время на то, что тут делается? Такой шрифт нужен только если документ рукописный - чтобы чужой почерк потом не разбирать. Но рукописные текстовые документы уже лет 25 никто не делает.
Surrogate Автор
09.06.2023 09:19+1Вас заставляют какой-то фигнёй заниматься.
Абсолютно с вами согласен! У нас разработано 3 варианта шаблонов MS Word для наших "ключевых Заказчиков". Например в любом техническом задании от Центрального Банка РФ всегда в конце документна идут требования к оформлению документации на 8 листах (но это не точно), где подробро прописано что/каким шрифтом (из общепринятых)/ с какими отступами должно и т.д. быть в документе написано.
Тут я понимаю, наша Контора подписалась что готовит документацию в соответствии с Требованиями Закачика четко прописанными в ТЗ!
А встречаются такие "затейники", присылают свои хотелки: вот хочу чтобы было написано шрифтом XYZ, что даже кушать не могу.
Самое смешное, чем меньше организация - тем больше у нее специфических пожеланий. Появляются эти пожелания частями и всегда когда документы уже разработаны…
Ни в одном из ГОСТ из серии СПДС, нет требований обязательно "чертёжного шрифта"!!! Особенно в текстовой документации, которая выполняется в MS Word…
Например в ГОСТ Р 21.101-2020 в пункте 5.1.5 при использовании ЭВМ при разработке документации не желательно использовать некие экзотические шрифты.
В ранней версии (ГОСТ Р 21.1101-2013) формулировалось так
Сторонники карго-культа "чертёжного шрифта", аппелируют к упоминанию ГОСТ 2.304-81 (Единая система конструкторской документации. Шрифты чертежные). Мол в этом ГОСТе ничего не сказано ни про Arial, ни Times New Roman. Этот ГОСТ был написан 40 лет назад, когда Arial и Times New Roman еще в помине не было :)
В те далекие времена допускалось выполнять документацию средствами вычислительной техники, на печатной машинке и вручную "чертёжным шрифтом". Достоинством ручного метода было, что можно было какие-то правки оперативно "дописать от руки".
Я в начале 80-ых был еще дошкольником, не знаю были ли в природе печатные машинки с ГОСТ-оподобными литерами ?
paranoya_prod
09.06.2023 09:19+2Извините, я не совсем понял в чём проблема и почему так много манипуляций? Если надо заменить один шрифт (так как указаны в статье только шрифты) в документе на другой, то это делается за минуту - выделяем весь текст и заменяем шрифт из окошка форматирования. Если надо заменить один стиль оформления на другой, то это делается так же за минуту обычным выбором стиля в документе. Если нужно сохранить старый и на его основе сделать новый с другим шрифтом, то обычное копирование стиля и замена в нём шрифта занимает две минуты.
aborouhin
09.06.2023 09:19+1Вот поэтому в шаблонах, рассчитанных на многократное применение, надо сразу делать всё по уму и не просто создавать кучу стилей, а делать их иерархию. Чтобы все стили текста наследовали гарнитуру шрифта от одного общего, все стили заголовков - от другого (если они отличаются). И тогда замена шрифта сводится к изменению ровно одного стиля. В общем, наследование и DRY как оно есть :)
P.S. Ну и в крайнем случае, набросать макрос на 5 строк, который проходит по всем стилям и меняет одну гарнитуру на другую, IMHO, проще, чем вот это всё.
Surrogate Автор
09.06.2023 09:19надо сразу делать всё по уму и не просто создавать кучу стилей, а делать их иерархию.
В данном примере "имеем, что имеем".
Чтобы все стили текста наследовали гарнитуру шрифта от одного общего
Если я правильно понимаю, выделенная маркером строка говорит, то то что стиль **Заг5-номер построен на базе стиля Normal
И тогда замена шрифта сводится к изменению ровно одного стиля
В нашем случае ожидаемого чуда не произошло, поэтому пришлось городить такое…
aborouhin
09.06.2023 09:19Есть стили абзаца, есть стили текста, там не самая очевидная иерархия, надо всё вместе смотреть. Удобно вывести стили в боковую панельку и тогда во всплывающих подсказках показывает полностью, на чём стиль основан и что у него переопределено по сравнению с родителем.
Хотя Word в этом плане, конечно, не самый удобный инструмент, согласен. Помнится, лет 15 назад пользовался Framemaker, там всё было гораздо логичнее.
Surrogate Автор
09.06.2023 09:19Есть стили абзаца, есть стили текста, там не самая очевидная иерархия.
Абсолютно точно !
Я уточнил у шефа, почему это заняло у него много времени. Оказалось не все стили наследовались от стиля Normal. Некоторые были основаны на самих себе (!)
Вот ему и пришлось выполнить кропотливый
анализ кто на ком стоялперебор стилей, если стиль основан на чем-то другом пришлось править его в т.н. "боковой панельке"aborouhin
09.06.2023 09:19+1Так я про это и написал, что хорошо бы изначально выстроить правильную иерархию. Вот бы ещё та самая боковая панелька умела стили в виде дерева показывать хотя бы, чтобы такой рефакторинг упростить... но увы.
aborouhin
09.06.2023 09:19+2P.P.S. Написано за 1 минуту, работает:
Sub replacefonts() Dim s As Style For Each s In ActiveDocument.Styles If s.Font.Name = "Calibri" Then s.Font.Name = "Arial" End If Next End Sub
Surrogate Автор
09.06.2023 09:19Конкретно в этом документе, было только 240 стилей которые нужны потенциально. куча встроенных, куча заблокированных, куча скрытых.
В ряде случаев замена не происходила по иерархии! Поэтому мой начальник сидел и просматривал все ли стили из желательных получили замену шрифта.
История с заменой случилась позавчера, удалось быстро реализовать эту нелепую блажь дорогого Заказчика!
Вчера мы подобными макросами пытались добиться замены, с некоторыми стилями приходилось прогонять код по несколько раз!
Подозреваю, что проблема с документом! Слишком там все сложно со стилями и безумно запутано.
В 99% случаев предложенный вами код отработал бы с блеском!
Спасибо!!!PS Удалось понять почему не менялось форматирование после длинной черты (—): в присланном Заказчиком шрифте не было такого символа. Этот символ находился в середине строки. Word похоже считал его концом строки, и добавлял соответствующий тэг, после удаления и вставки на место этого символа тэг конца строки не появлялся.
Kelv13
09.06.2023 09:19А просто в поиске Worda указать заменить шрифт1 на шрифт2 и не разбираться с артефактами?
Surrogate Автор
09.06.2023 09:19В документе более 200 стилей, далеко не все из них используются. Предложенный вами вариант может заменить шрифт в найденном тексте. А если завтра кто-то допишет пару строк и применит к ним стиль ранее не применявшийся.
Новый текст будет со старым шрифтом?
Surrogate Автор
В первом комменте к вашему советуоставлю ссылки на последующие комментарии, которых описываюся нюансы этого конкретного случая и почему описанное в статье решение сработало быстрее (чтобы не тратить время на чтение всех-всех комментариев):https://habr.com/ru/articles/740570/comments/#comment_25629608
https://habr.com/ru/articles/740570/comments/#comment_25628982
https://habr.com/ru/articles/740570/comments/#comment_25632150