Картинки в doc-файле: снижение веса хирургическим путём

  • Tutorial
Жил-был на свете один перевод (как процесс, а не как результат). Существовал он таким образом: из pdf-ки с оригинальным текстом вырезались кусочки, вставлялись прямо в Word и снизу посредством значительных мысленных усилий появлялся русский текст, и, как правило, пара-другая сносок. А если в оригинале были сноски, то в сносках тоже появлялись картинки. Перевод шёл, и файл разрастался — в 16-страничном файле было 51 изображение, и Word стал работать так медленно, что перевод никак не мог стать результатом.
Встроенная функция компрессии изображений почему-то совсем не помогала, поэтому было решено произвести вмешательство хирургическим путём.

Файл выглядит вот так (узкие колонки — не текст, а картинки):


Во внутренности doc-файла залезть тоже можно, но гораздо проще сделать это в .docx. Пересохраняем. Видим, что само по себе пересохранение ничего не дало — как весил файл 12 мегабайт, так и весит.


Как известно, .docx-файл представляет собой zip-архив с особой внутренней структурой — поэтому без всякого труда заглянуть ему в кишки, а там…

в распакованном виде директория word весила бы почти семьсот мегабайт! Неудивительно, что Word отказывается работать…
Конечно, главный виновник — изображения, каждое из которых занимает порядка десяти мегабайт:


Интересно, почему явно растровые изображения Word хранит в EMF — векторном формате? Вероятно, этому есть какое-то глубинное объяснение, которое будет задействовать аргумент о PDF-источнике («ведь PDF — тоже векторный формат!»), но сейчас нас волнует не это. Чтобы не заморчиваться редактированием файла document.xml при изменении формата рисунков, мы ограничимся всего лишь уменьшением их размера. К счастью, IrfanView среди всех прочих полезных функций умеет писать EMF (Photoshop, например, не умеет из коробки). А ещё он может уменьшать изображения пачками — этой функцией мы и воспользуемся. 800 пикселов по длинной стороне вполне достаточно.

(на картинке сверху справа виден фрагмент буквы g — и это ещё уменьшенная по ширине экрана оригинальная версия).

После этого можно запаковать обратно изменённые файлы — весить они будут значительно меньше (в 15 раз):
.

Word совершенно спокойно съел этот файл. Правда, при сохранении обратно в .doc он несколько потолстел, но всё же совсем не настолько:


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

UPD:
Обсуждение в комментариях, по какой именно причине Word вставляет рисунки в EMF
Поделиться публикацией

Комментарии 39

    +1
    Как дополнение, было бы интересно узнать, можно ли всё-таки заставить Word сохранять эти изображения в другом формате без такого шаманства.
      0
        0
        Если не ошибаюсь, то при вставке через меню картинка вставляется именно в том формате, каком её подсунули. Кстати, достаю я обычно картинки из ворда сохраняя документ в виде html страницы.
          0
          Не забывайте только перекрывающиеся картинки отделять друг от друга. В противном случае получите об'единённую картинку, а не оригиналы.
        +2
        Word хранит картинки ровно в том формате, в котором вы их туда засунули. Даже если пересохранять *.doc в *.docx. Подтверждено многолетним опытом и сегодняшними (для полной уверенности) экспериментами.
          0
          А есть особенность поведения при вставке из буфера обмена? Попробовал, 2 раза png получалось. Всегда ли так?
            0
            Выделить файл изображения, Ctrl+C, перейти в документ, Ctrl+V. Формат сохраняется оригинальный. Word 2010.
              0
              Про файл-то понятно. Вопрос именно про графику из буфера обмена.
                0
                Покопался немного с буфером. Насколько я понял, графика в буфер отправляется в формате Windows Clipboard Image (*.clp). Соответственно информация о первоначальном формате теряется и программа-получатель вправе самостоятельно решать, в какой из общеупотребительных форматов эту графику конвертировать при вставке.
                  0
                  Это я понимаю. Вопрос другой был:
                  >А есть особенность поведения при вставке из буфера обмена? Попробовал, 2 раза png получалось. Всегда ли так?
                  Т.е. что именно Word решает? Всегда ли png будет?
                    +1
                    Исходя из всего вышеизложенного, я считаю, что да, при вставке из буфера всегда будет *.png. Только с одной поправкой. Т.к. это все наверняка недокументировано, то от версии к версии формат может меняться.
                    +4
                    *.clp — не формат изображения, а формат-контейнер содержимого буфера обмена. Данные в нём хранятся в виде множества записей вида {тип данных, название типа данных, данные как набор байтов}. Никаких специальных возможностей для хранения именно графики на уровне формата не предусмотрено.

                    Формат, в котором графическое изображение (и вообще, любые данные) будет помещено в буфер всецело зависит от программы, которая туда эти данные помещает.

                    Данные об исходном формате файла-источника данных в общем случае теряются при копировании.

                    Есть энное количество стандартных форматов данных: текст в unicode и OEM (однобайтной) кодировках, растровое изображение (bitmap), векторное изображение (EMF) и несметное количество форматов, специфичных для конкретных программ.

                    Многие программы помещают данные в буфер сразу в нескольких форматах и вот из них-то, как правило, и идёт выбор при вставке.

                    Корректно написанная программа старается взять данные из буфера обмена в формате с максимально богатыми возможностями из числа поддерживаемых.

                    Здесь и кроется причина, по которой в файле из топика изображения хранились в EMF, а не в виде растровых изображений: Acrobat Reader при копировании помещает изображение в буфер обмена и в виде Bitmap и в виде EMF. А так как векторный формат богаче по возможностям, то его-то и выбирает при вставке MS Word.

                    P.S. В MS Word, насколько я помню, можно явно выбрать желаемый формат из числа доступных вставляя данные комбинацией клавиш Ctrl-Alt-V вместо Ctrl-V.
                      0
                      Проверил, что выдаёт акробат с помощью EnumClipboardFormats():
                      CF_DIB (8)
                      CF_BITMAP (2)
                      CF_MAX (17) — не совсем понимаю, что это, но, похоже, граница системных форматов
                      CF_ENHMETAFILE (14)
                      CF_METAFILEPICT (3)
                      Некий формат с описание «ASEL» (50178), похоже, внутренний адобовский.

                      Система сама выполняет преобразование CF_DIB <-> CF_BITMAP и CF_ENHMETAFILE <-> CF_METAFILEPICT

                      Word предлагает три формата на выбор: Bitmat («Точечный рисунок»), DIB («Аппаратно-независимый рисунок») и EMF («Метафайл Windows»). DIB и Bitmap хранятся в PNG, а EMF — в EMF, разумеется. При одинаковом сжатом размере (т.е. docx-файла в данном случае) EMF внутри куда больше — и вставляется дольше.
                        0
                        CF_MAX (17) — не совсем понимаю, что это, но, похоже, граница системных форматов
                        Судя по MSDN код 17 соответствует разновидности растрового изображения.
                          0
                          И точно. Я, видимо, в устаревший winuser.h посмотрел.
            +4
            Пока не появился формат docx, я вытаскивал картинки из doc через «Сохранить как...» в формате html (в этом случае все картинки в исходном формате сохранялись в отдельный подкаталог).
              0
              Ага. Но таким способом сам док-файл не уменьшить…
                0
                Согласен.)
              +1
              Уменьшить ширину векторного изображения? Это как?

              Может IrfanView снижает детализацию?
                0
                По сути изображение растровое.
                Вектора бы столько не весили.
                –1
                а не проще файнаРидером???
                  +1
                  Файнридер по меньшей мере поставит везде f вместо ſ (это старинное альтернативное начертание s). Ну и все прочие прелести распознавания источника конца восемнадцатого века.
                    +1
                    5 минут режим обучения, и он помнит и буквы и язык и правила
                    но работать и читать векторный текст, и не зависеть от качества исходника.
                    оно того стоит
                  +2
                  Если мне не изменяет память, в Word есть функция подготовить документ для веб. В которой вы указываете до какого разрешения ужать графику. Пользовался ей давно, еще в 2003, так что в версиях с лентой, похоже придется поискать.
                    +1
                    Не поленился, нашел: Кликаем на изображение: Работа с рисунками → Формат → Сжать рисунки.
                    96 ppi это разрешение экрана — т.е. достаточное для отображения на экране.
                      0
                      Причем любое приложение из пакета МС Оффис старше 2007 поддерживает данную функцию — Image-> Compress-> 96dpi.
                      И да, оффис сжимает по умолчанию данные в своих контейнерхах(docx, xlsx, pptx, пр), но сохраняет изображение в том формате, в котором они были туда вставлены.
                        0
                        Пробовал неоднократно — не помогло.
                    0
                    На учёбе был любопытный случай. Дали учебные пособия, которые видимо такие же студенты набирали. Внутри пособий множество принципиальных схем чёрным цветом на белом фоне. Одно из пособий весило около 24 мегабайт в doc. Поскольку я тогда ещё пользовался OpenOffice.org я просто попробовал пересохранить документ в odt. Каково же было моё удивление, когда документ похудел до 600 килобайт. Вроде бы там картинки были в BMP.
                      0
                      bmp на ура архивируется)
                        0
                        Собственно я хотел показать, что формат хранения документа может очень повлиять на его размер. В моём случае сохрание в odt означало упаковку всего документа в zip-архив. Нечто похожее произойдёт при сохранении в docx. НО! Незабываем, что можно ещё было сохранить изображение в более оптимальном формате (bmp явно самый неотптимальный вариант для чёрно-белого изображения о очень предсказуемой структурой, напоминаю, у меня там были в основном принципиальные схемы, которые состоялии из линий и окружностей), тогда бы и в doc документ получился заметно меньше.
                          0
                          Если это именно чёрно-белое (не градации серого), то скорее всего меньше bmp никто не сделает. Чёрно-белый bmp одним байтом 8 пикселей покрывает.
                            0
                            Я что-то глубоко сомневаюсь, что при всей чёрно-белости рисунка использовался бит на пиксель. Скорее какой-то «стандартный» формат от 8 до 24 бит на пиксель.
                              0
                              Вот первое попавшееся описание bmp.
                              Number of bits per pixel – Может принимать следующие значения: 1 (черно-белое изображение); 4 (16 цветов); 8 (256 цветов); 24 (16.7 миллиона цветов).
                              Не факт, конечно, что word внутри себя придержится этого формата, но в принципе ничто не мешает ему.
                              0
                              bmp в любом случае формат без сжатия. Он вам что белый лист 2000 на 2000 в 4 mb сделает. Что полноценную графику. Вы его c png путаете
                                0
                                сам по себе bmp больщой, но если там нет полутонов, то он должен хорощо сжиматся архиватором. А docx или odt это же zip архивы.
                          0
                          Ну, вообще сохранение в OpenOffice или в docx — это неплохой способ достать оригиналы изображений из файла. По крайней мере в том качестве, как они туда были вставлены.
                          Оно же (по крайней мере OpenOffice) — неплохой способ разглядеть формулы в защищённом экселевском файле.
                            0
                            Проще сохранить в html, о чём я писал выше :) И сделать это можно даже в самом Word 2003.
                              0
                              А вот не всегда!
                              В своё время работал в газете — и порой приносили ворды со вставленными tiff-ами.
                              Да, его можно сохранить в html — но и tiff при этом автоматом превратится в jpeg.
                              А цель была — достать оригинал, как из некоего «архива».
                          +1
                          Можете скинуть исходный файл? (:

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое