Извлечение картинок из doc-файлов Афанасьев Владимир Верстальщик. Ведущий проекта http://www.spiker.ru Окончил Московский Полиграфический институт (инженер-механик). В полиграфии с 1980 г. Иногда случается, что заказчики приносят информацию, подготовленную ими в редакторе Microsoft Word. И, хотя в любом препресс-бюро на таких смотрят волком, выгонять заказчика не всегда представляется возможным. Приходится объяснять и... переверстывать (за счет заказчика, естественно). И тут мы сталкиваемся с задачей извлечения файлов картинок из этого продукта всеми нами "любимой" фирмы. Описанная ниже методика позволяет сделать это без какой-либо потери качества. Впрочем, подобное годится и для других файлов MS Office 97, включая почтовые форматы Outlook. Для начала нам необходимо иметь какой-либо шестнадцатиричный редактор, лучше всего – HIEW.EXE для DOS (или UltraEdit для Windows). Пользуясь им, открываем файл DOC, и переключаемся в 16-ричный режим. Далее делаем следующее (все примеры даны в расчете на hiew.exe): 1. Если нужный нам файл был помещен в виде JPG, то сразу можем начинать искать начало внедренного JPG-файла. А поскольку хранится он в исходном виде, то искать надо последовательность байт FF D8 FF при помощи волшебной клавиши F7. Есть, конечно, вариант – искать текстовую сигнатуру "JFIF", а затем отсчитывать от нее назад 6 байт. Главное - найти начало. Затем устанавливаем маркер на первый FF из FF D8 FF и нажимаем еще одну клавишу: * ("звездочку") на правой цифровой клавиатуре для начала пометки. После этого еще раз нажимаем F7 и задаем другую маску для поиска - FF D9 A0. Эта комбинация определяет конец файла JPEG. Но только в том случае, если это не последний JPEG, внедренный в .DOC-файл. Если же вдруг HIEW не смогла найти указанную комбинацию, значит, вы пытаетесь извлечь последний JPEG. Тогда надо задавать для поиска немного другой набор байт: FF D9 00 00. Обнаружив первый или второй вариант окончания файла, следует установить маркер на байт D9 и нажать еще раз "звездочку". Будет цветом выделен блок, в котором, собственно, и содержится файл JPEG. Возможно, это и не тот, что вам нужен, но определить это можно будет после сохранения его на диск и просмотра. Сохранить его можно нажатием кнопки F2. В открывшемся меню остается задать имя файла и подтвердить сохранение. Отменить пометку нажатием "звездочки". Все. Если нужно извлечь несколько файлов, то указанные процедуры надо последовательно повторить несколько раз, не забывая отменять пометку блока клавишей *. 2. Если же дело касается документа, помещенного в документ Word в виде файла TIFF или BMP, то все выглядит примерно так же, как для JPEG, только сигнатуры будут другие. Ведь Word-97 при внедрении TIFF и BMP преобразует их в формат PNG. Значит, после открытия документа редактором HIEW, следует задавать поиск (F7) начала файла по сигнатуре ЙPNG (89 50 4E 47). Затем – пометка начала по буковке "Й" (89) с помощью клавиши "звездочка" на правой цифровой клавиатуре, еще раз F7 – и задание маски для поиска конца файла в виде "42 60 82". После обнаружения – установить маркер на код 82 и, еще раз нажав клавишу "звездочка", фиксируем пометку блока. Затем сохраняем выделенный блок в файл при помощи F2. При необходимости сконвертировать полученный PNG-файл в любой другой формат можно практически любой программой, работающей с изображениями (PV.EXE, ALCHEMY.EXE, IrfanView.EXE, PhotoShop и т.д.), поскольку PNG довольно распространенный формат. 3. В том случае, когда файл встроен в документ непосредственно в формате .BMP (например, какой-нибудь из почтовых форматов, или PPT из PowerPoint), то больших проблем тоже нет. Первым делом ищем сигнатуру "BM". Обычно перед этой сигнатурой имеются нули. Установив маркер на букву "B", начинаем пометку блока (cерая "звездочка"). Затем берем 4 байта после "BM" и изучаем их. Они представляют собой размер встроенного файла. Только согласно системе представления данных в компьютерах PC размер записан "наоборот". То есть, если мы имеем, например, последовательность АС 1A 02 00, то, прочитав байты в обратном порядке, получим значение 00021AAC. Это значение нужно при помощи 16-ричного калькулятора сложить с адресом, по которому расположено начало найденной сигнатуры "BM". Затем, нажав F5, вызываем задание адреса перехода, вводим полученный в результате вычислений адрес, и, оказавшись в необходимом нам месте, заканчиваем пометку блока "звездочкой" и сохраняем выделенный блок при помощи F2 в файл BMP. 4. Для извлечения файлов типа GIF нужно, открыв исходный файл редактором HIEW, задать по F7 маску поиска "GIF8". После обнаружения, установки маркера на начало сигнатуры и начала выделения серой "звездочкой", задать поиск по сигнатуре конца файла 00 3B. Дальше как обычно: завершение пометки "звездочкой" и сохранение файла клавишей F2. По материалам сайта ua3xco Источник: http://www.marketer.ru/ -------------------------------------------------------- JPEG FF D8 'FF E0 00 10 4A 46 49 46 (яШяа JFIF) FF D9 (яЩ) ? -------------------------------------------------------- GIF 47 49 46 38 (GIF8) 00 3B ( ? -------------------------------------------------------- PNG 89 50 4E 47 0D 0A 1A 0A (‰PNG) ‰PNG 49 45 4E 44 AE 42 60 82 (B`‚) IEND®B`‚ -------------------------------------------------------- BMP 42 4D (BM) длина вычисляется в 4 байтах с 3 позиции от начала -------------------------------------------------------- WMF D7 CD C6 9A длина вычисляется в 4 байтах с 29 позиции от начала -------------------------------------------------------- ICO 00 00 01 00 XX 00 XX XX XX 00 00 00 00 00 длина вычисляется в 8 байтах с (6+16*Nрис) позиции от начала -------------------------------------------------------- CUR 00 00 02 00 XX 00 XX XX XX 00 XX 00 XX 00 длина вычисляется в 8 байтах с (6+16*Nрис) позиции от начала -------------------------------------------------------- -------------------------------------------------------- TIFF - не доработан 49 49 2A (II* ) ? или 4D 4D 2A 00 00 00 00 00 00 ( ) ? --------------------------------------------------------
Ответить
|