Предыстория

Сегодня возникла эпическая задача заменить в нашем документе стиль с общедоступного (Tahoma/ Arial/ Times New Roman) на присланный Заказчиком некий ГОСТ-оподобный шрифт.

Начальник стал делать это по красоте: используя традиционный инструментарий MS Word для работы со стилями. Потратил на это 1,5 часа.

Я решил опробовать метод «грубого вмешательства», наверно это не лучшее решение! 

Но думаю в ситуации когда у вас нет времени сделать «все красиво и стильно» и/или вы не знаете как это сделать средствами MS Word этот метод имеет право на жизнь…

Перед вмешательством обязательно сохраните резервную копию документа, на случай если что то пойдёт «не так»!!!

Пошаговая инструкция

  1. В проводнике Windows мышью выделяем интересующий нас документ.

  2. Щелкаем правой кнопкой мыши и в выпавшем конектсном меню выбираем архиватор 7-Zip, и в нем пункт меню Открыть архив.

    Рис. 1 — Открыть файл docx архиватором
    Рис. 1 — Открыть файл docx архиватором
  3. В окне архиватора в проводнике архива открывем папку \word.

    Рис. 2 — Содержимое архива
    Рис. 2 — Содержимое архива
  4. ​В этой папке находим файл styles.xml.​

    Рис. 3 — Файл styles.xml внутри архива
    Рис. 3 — Файл styles.xml внутри архива
  5. Выбрав файл, щелкаем правой кнопкой мыши и в контекстном меню выбираем верхний пункт Открыть.

    Рис. 4 — Открытие styles.xml
    Рис. 4 — Открытие styles.xml
  6. Документ откроется в приложении Блокнот (Notepad.exe), нужно вызвать окно замены текста выбрав соответствующую команду в контекстном меню​ или нажав клавиши Ctrl+H. ​

    Рис. 5 — Вызов команды "Замена текста"
    Рис. 5 — Вызов команды "Замена текста"
  7. В верхней строке пишем какой шрифт требуется заменить, в нижней на какой и нажимаем Заменить все.

    Рис. 6 — Окно замены
    Рис. 6 — Окно замены
  8. Закрываем документ, нажав при этом кнопку Сохранить. ​

    Рис. 7 — Окно сохранения xml-файла в Блокноте
    Рис. 7 — Окно сохранения xml-файла в Блокноте
  9. В появившемся окне архиватора, появляется предложение обновить файл styles.xml, нажимаем кнопку OK.

    Рис. 8 — Обновление xml-файла в архиве
    Рис. 8 — Обновление xml-файла в архиве
  10. PROFIT!

На всё про все потратил 10 минут

Оценка результатов манипуляций

После открытия отредактированного документа MS Word выяснилось, что целом все прошло все нормально. Единственное проблемное место - встречаются такие артефакты в подписях под рисунками и над таблицами. Обратите внимание, что шрифт до длинной черты-разделителя отличается от шрифта после нее.

Рис. 9 — Артефакты в надписях
Рис. 9 — Артефакты в надписях

Несмотря на то что с обоих сторон текст, показывается набранным одинаковым стилем (**Заг_рис) и шрифтом (GOST type B).

После вырезания разделителя и последующей вставки шрифт всей строки становится одинаковым! В принципе выход, но по тексту документа такие артефакты встречаются много раз. 

Позднее я обнаружил, что проблема лечится заменой символа на самого же себя.

  1. Нажимаем команду Заменить или комбинацию клавиш Ctrl+H.

  2. В поле Найти вставляем символ "—".

  3. В поле Заменить на также вставляем символ "—".

  4. В завершение жмем кнопку Найти далее.​

Рис. 10 — Лечение заменой
Рис. 10 — Лечение заменой

После этого шрифт в надписи слева и справа стал выглядеть одинаково.

Комментарии (28)


  1. 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


  1. PuerteMuerte
    09.06.2023 09:19

    Честно говоря, так и не понял, почему сменить шрифт заменой его в файле стилей занимает 10 минут, а сменить шрифт заменой его в окне стиля в ворде занимает полтора часа. Должно быть примерно одинаково :)


    1. SergeyMax
      09.06.2023 09:19

      Возможно потому что автор путает трудозатраты со сроками.


    1. kryptograf
      09.06.2023 09:19

      Возможно, потому что, в документе присутствуют и другие шрифты, которые менять не надо, как следствие если менять это руками в Word-e надо выделять только нужные куски текста. А при замене в стилях он заметил нужный шрифт одним разом. Вот и разница во времени выходит, не так ли?


      1. PuerteMuerte
        09.06.2023 09:19

        как следствие если менять это руками в Word-e надо выделять только нужные куски текста.

        Там не нужно выделять куски текста, нужно открыть список стилей и поменять шрифт, например, для стиля "обычный", или какой там стиль используется для основного текста. И это то же самое, что поменять его в файле.


    1. RussianAirBorn
      09.06.2023 09:19

      Первый вариант легче автоматизировать


      1. Surrogate Автор
        09.06.2023 09:19

        У меня еще не было такого опыта. Буду рад почитать/посмотреть как это сделать…


    1. 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


  1. ivankudryavtsev
    09.06.2023 09:19
    +2

    Еще автор путает что такое брут-форс.


    1. Surrogate Автор
      09.06.2023 09:19

      автор путает что такое брут-форс

      Факт грубого вмешательства в этом кейсе присутствует? Думаю, да.

      PS я готов, изменить заголовок если вы подскажете синоним)


      1. ivankudryavtsev
        09.06.2023 09:19
        +5

        Brute-force - характеристика переборных методов, когда решение подбирается перебором и сравнением с ожидаемым результатом. То что это на русский переводится как "грубая сила" не значит что любое вмешательство в подлежащие технологии можно называть brute force.

        https://ru.wikipedia.org/wiki/Полный_перебор


        1. Surrogate Автор
          09.06.2023 09:19
          +2

          Заменил в заголовке на "грубое вмешательство". В виду того, что вышеизложенный метод не относится к штатным способам для MS Word

          Спасибо, за то что указали на эту мою ошибку !


      1. ap0stol
        09.06.2023 09:19
        +2

        Брут-форс - это атака перебором, методом "грубой силы". У вас явно другое.

        Если уж хочется "хакерского" сленга, то в вашем случае банальный термин "хакинг" и то ближе по смыслу.

        p.s. хотя по сути штатное редактирование XML файла docx относить к хакерству вообще язык не поворачивается. Вот если бы после ваших замен Word выполнял произвольный код - это хакинг, а изменить шрифт - это просто "Смена шрифта в docx файле нештатным для MS Word способом"


        1. Surrogate Автор
          09.06.2023 09:19

          Я исправил заголовок статьи. Ещё хочу отметить, что она опубликована в хабе Подготовка технической документации поэтому не стоит ожидать в ней хакерских откровений :)

          "Смена шрифта в docx файле нештатным для MS Word способом"

          Согласен с вашей формулировкой! Опубликовал этот креатив здесь так как надеюсь, что кому-то из пользователей будет полезен этот опыт


          1. ivankudryavtsev
            09.06.2023 09:19
            +2

            Сам по себе креатив вполне годный и можем кому-то сильно помочь.


  1. Vaitek
    09.06.2023 09:19
    +2

    Это же почти что sed программирование ????


  1. YegorP
    09.06.2023 09:19

    Вас заставляют какой-то фигнёй заниматься. Я бы ещё понял Times New Roman на более доступный аналог менять по каким-то правовым заморочкам. Но зачем вообще тратить время на то, что тут делается? Такой шрифт нужен только если документ рукописный - чтобы чужой почерк потом не разбирать. Но рукописные текстовые документы уже лет 25 никто не делает.


    1. ivankudryavtsev
      09.06.2023 09:19

      Просто мы все немного ностальгируем по чертежным шрифтам.


    1. 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-ых был еще дошкольником, не знаю были ли в природе печатные машинки с ГОСТ-оподобными литерами ?


  1. paranoya_prod
    09.06.2023 09:19
    +2

    Извините, я не совсем понял в чём проблема и почему так много манипуляций? Если надо заменить один шрифт (так как указаны в статье только шрифты) в документе на другой, то это делается за минуту - выделяем весь текст и заменяем шрифт из окошка форматирования. Если надо заменить один стиль оформления на другой, то это делается так же за минуту обычным выбором стиля в документе. Если нужно сохранить старый и на его основе сделать новый с другим шрифтом, то обычное копирование стиля и замена в нём шрифта занимает две минуты.


  1. aborouhin
    09.06.2023 09:19
    +1

    Вот поэтому в шаблонах, рассчитанных на многократное применение, надо сразу делать всё по уму и не просто создавать кучу стилей, а делать их иерархию. Чтобы все стили текста наследовали гарнитуру шрифта от одного общего, все стили заголовков - от другого (если они отличаются). И тогда замена шрифта сводится к изменению ровно одного стиля. В общем, наследование и DRY как оно есть :)

    P.S. Ну и в крайнем случае, набросать макрос на 5 строк, который проходит по всем стилям и меняет одну гарнитуру на другую, IMHO, проще, чем вот это всё.


    1. Surrogate Автор
      09.06.2023 09:19

      надо сразу делать всё по уму и не просто создавать кучу стилей, а делать их иерархию.

      В данном примере "имеем, что имеем".

      Чтобы все стили текста наследовали гарнитуру шрифта от одного общего

      Если я правильно понимаю, выделенная маркером строка говорит, то то что стиль **Заг5-номер построен на базе стиля Normal

      И тогда замена шрифта сводится к изменению ровно одного стиля

      В нашем случае ожидаемого чуда не произошло, поэтому пришлось городить такое…


      1. aborouhin
        09.06.2023 09:19

        Есть стили абзаца, есть стили текста, там не самая очевидная иерархия, надо всё вместе смотреть. Удобно вывести стили в боковую панельку и тогда во всплывающих подсказках показывает полностью, на чём стиль основан и что у него переопределено по сравнению с родителем.

        Хотя Word в этом плане, конечно, не самый удобный инструмент, согласен. Помнится, лет 15 назад пользовался Framemaker, там всё было гораздо логичнее.


        1. Surrogate Автор
          09.06.2023 09:19

          Есть стили абзаца, есть стили текста, там не самая очевидная иерархия.

          Абсолютно точно !

          Я уточнил у шефа, почему это заняло у него много времени. Оказалось не все стили наследовались от стиля Normal. Некоторые были основаны на самих себе (!)

          Вот ему и пришлось выполнить кропотливый анализ кто на ком стоял перебор стилей, если стиль основан на чем-то другом пришлось править его в т.н. "боковой панельке"


          1. aborouhin
            09.06.2023 09:19
            +1

            Так я про это и написал, что хорошо бы изначально выстроить правильную иерархию. Вот бы ещё та самая боковая панелька умела стили в виде дерева показывать хотя бы, чтобы такой рефакторинг упростить... но увы.


          1. aborouhin
            09.06.2023 09:19
            +2

            P.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


            1. Surrogate Автор
              09.06.2023 09:19

              Конкретно в этом документе, было только 240 стилей которые нужны потенциально. куча встроенных, куча заблокированных, куча скрытых.

              В ряде случаев замена не происходила по иерархии! Поэтому мой начальник сидел и просматривал все ли стили из желательных получили замену шрифта.

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

              Вчера мы подобными макросами пытались добиться замены, с некоторыми стилями приходилось прогонять код по несколько раз!

              Подозреваю, что проблема с документом! Слишком там все сложно со стилями и безумно запутано.

              В 99% случаев предложенный вами код отработал бы с блеском!
              Спасибо!!!

              PS Удалось понять почему не менялось форматирование после длинной черты (—): в присланном Заказчиком шрифте не было такого символа. Этот символ находился в середине строки. Word похоже считал его концом строки, и добавлял соответствующий тэг, после удаления и вставки на место этого символа тэг конца строки не появлялся.


  1. Kelv13
    09.06.2023 09:19

    А просто в поиске Worda указать заменить шрифт1 на шрифт2 и не разбираться с артефактами?


  1. Surrogate Автор
    09.06.2023 09:19

    В документе более 200 стилей, далеко не все из них используются. Предложенный вами вариант может заменить шрифт в найденном тексте. А если завтра кто-то допишет пару строк и применит к ним стиль ранее не применявшийся.

    Новый текст будет со старым шрифтом?