popkov
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Цитата: Вообще-то эту "тайну" знает любой программист, печатающий из своей программы на принтер из-под Windows. Ведь все программы создают EMF файлы перед выводом на печать. | Сам факт создания метафайлов при выводе на печать, конечно, известен каждому программисту (однако является настоящим открытием даже для продвинутого пользователя!). Но вот как извлечь метафайл из спул-файла - до Vipin Aravind это было закрыто. Это было "сакральное знание" и доступ к нему имели только программисты Microsoft, поскольку все важнейшие функции, которые использовал Vipin Aravind в своей программе - недокументированные! И он впервые документировал эти функции в двух своих статьях, сделав это знание достоянием всего Интернет-сообщества: Даже и сейчас, когда уже больше 3-х лет прошло после публикации этих статей, исходники PrintMirror остаются, похоже, единственным открытым примером по использованию этих недокументированных функций. Понятно, что крупным корпорациям такого рода сведения всегда были доступны, поскольку они могут себе позволить брать платные консультации у специалистов из компании Microsoft. Может быть, и до Vipin Aravind кто-то разбирался с этим, но не опубликовал результаты своих исследований. А Vipin Aravind не только всё опубликовал вместе с исходными кодами, но и создал классный инструмент, позволяющий с лёгкостью обходить целый ряд искусственных ограничений, навязанных компаниями-монополистами, форматы которых совершенно несовместимы друг с другом и несовместимы с Office, что является большой подставой для продвинутого пользователя! Даже компания Microsoft, создавшая этот формат, ставит подножки на пути грамотного пользователя к работе с ним! Например, в Office XP наконец-то появилась возможность поворачивать векторные EMF-рисунки на произвольный угол, что зачастую бывает очень ценно при создании качественно оформленного документа Word. И что же? Поворот метафайла на произвольный угол Если делать поворот метафайла в Word, то весь текст в EMF-рисунке перестаёт отображаться, а при выводе на печать на не-PostScript-принтер (например, при конвертации в PDF бесплатными программами для его создания) или не печатается вообще или на его месте получается какая-то белиберда. Кроме того, такой файл оказывается несовместим с более ранними версиями Office, поскольку там поворот рисунков не поддерживается. Если делать поворот в PowerPoint, то ситуация кажется обнадёживающей: текст отображается, но почему-то с низким качеством. Повёрнутый рисунок можно даже сохранить в повёрнутом виде из PowerPoint - но при этом получается рисунок страшного размера (96-килобайтная таблица в формате EMF, которую я приготовил, чтобы вставить в повёрнутом виде в свою публикацию, приобрела размер аж 1.4 Мб). Этот рисунок при выводе на печать из Word почему-то печатается без текста (только границы таблицы). Как ни станно, этот метафайл содержит одновременно растровый и векторный рисунок. Причём только EMFExplorer может отобразить его векторное содержимое (да и то только если выбрать максимальный масштаб отображения) - остальные программы (WMFView, и даже Word, PowerPoint) отображают и печатают только чудовищно низкокачественный растровый рисунок, который и занимает, видимо, столько места (1.4 Мб). Перепробововав все возможные варианты (в т.ч. и другие программы Microsoft, предназначенные, казалось бы, как раз для решения подобных задач: Microsoft Visio и Microsoft Publisher), я обнаружил, что средствами программ компании Microsoft такое простое действие, как поворот векторного рисунка на произвольный угол, выполнить невозможно! Причём импортировать EMF-рисунок в такие пакеты, как CorelDraw и Illustrator в большинстве случаев также невозможно - они не испортируют подавляющее большинство метафайлов (хоть и заявлена такая возможность), а те, которые импортируют - искажают настолько, что невозможно работать. CorelDraw не может импортировать даже те EMF-файлы, которые он сам создаёт при экспорте! То же относится к Illustrator. Что касается тех случаев, когда можно вставить в CorelDraw векторный рисунок через Paste Special (например, из Word или PowerPoint) - результат тоже не радует: последовательности символов переразбиваются на группы произвольным образом, в результате чего некоторые слова оказываются разорваны пробелом - и это в лучшем случае! К сожалению, внедрённые объекты CorelDraw также не умеет поворачивать. Единственный путь для импорта метафайлов в CorelDraw и Illustartor с более-менее приемлемым качеством я уже описывал выше: вставить метафайл в Word, с помощью плагина от Adobe сгенерировать PDF, затем импортировать в CorelDraw 13 или Illustrator. (Искажения при импорте такого PDF в CorelDraw, в основном, связаны с неправильной обработкой коротких и длинных тире.) Полученный векторный рисунок можно повернуть в этих программах на произвольный угол, но корректно экспортировать полученный рисунок обратно в EMF не удаётся. А если внедрить в Word объект CorelDraw - тоже ничего хорошего: рисунок сильно искажён при отображении в Word и печати из Word. Казалось бы, ситуация полностью безнадёжна, и надо просто смириться с тем, что программы Microsoft этого делать не умеют, а программы сторонних разработчиков импорт метафайлов не поддерживают. Непонятно, правда, почему такой элементарной вещи Microsoft не смог сделать: ведь главным преимуществом векторной графики над растровой как раз и является возможность масштабировать, вращать, искажать её разнообразными способами совершенно без потери качества! И поворот векторного рисунка должен быть куда более простой задачей, чем поворот растрового: надо просто пересчитать координаты объектов на рисунке и задать для каждого из них соответствующий угол поворота (и текст не является камнем преткновения - это тоже векторный объект, который Word прекрасно умеет поворачивать). В чём же проблема? Может, в том, что Microsoft просто не хочет дать в руки простому пользователю такой инструмент, который уже давным-давно полностью реализован? Действительно, повёрнутый в PowerPoint и экспортированный в EMF векторный рисунок каким-то чудом отображается в EMFExplorer именно в векторном виде и без потери качества, но Word "видит" и выводит на печать только его растровую часть. Странный парадокс, не правда ли? Программа стороннего разработчика работает с родным форматом Office лучше, чем Office! Кроме того, теперь очевидно, что программы Microsoft всё же умеют нормально работать с EMF (поворачивать на произвольный угол), но это почему-то заблокировано, недоступно пользователю! Всё уже давным-давно реализовано, но в угоду корпоративным интересам тщательно прикрыто, причём даже с издёвкой: вместо крохотного высококачественного векторного рисунка пользователь получает внедрённый в EMF-файл чёрно-белый растровый невероятно низкого качества (гораздо худшего, чем должно быть при его размере 1232 x 1009 пикселей в моём случае), причём он ещё сохранён в 8-битовом BMP-формате, и поэтому занимает чудовищное количество места! Получается, что Microsoft блокирует грамотному пользователю возможность нормальной работы с векторной графикой высокого качества, несмотря на то, что все необходимые функции полностью реализованы давным-давно! С помощью PrintMirror можно поворачивать метафайлы на 90 градусов, используя для поворота программу BlueSquirrel ClickBook. Можно из приложения печатать на ClickBook, а из последней перенаправлять на PrintMirror в повёрнутом виде. Неудобно, но зато получается идеальный векторный рисунок: крохотный и высочайшего качества. Что касается поворота на произвольный угол, то с использованием PrintMirror можно отследить интересные закономерности: если в PowerPoint повернуть векторный рисунок на произвольный угол, что текст перестаёт отображаться, а при печати на PrintMirror извлекается крохотный метафайл, содержащий повёрнутый векторный рисунок. Однако, как ни странно, текст внутри полученного метафайла (правда, не полностью) отображается опять же только в EMFExplorer - но зато уже при любом масштабе (при включённой опции использовать GDI+). В WMFView текст тоже можно увидеть (полностью), но только если задать большой масштаб отображения векторного рисунка (так же как и в EMFExplorer при отключенной опции использовать GDI+)! Что касается Word, то он отображает текст только в тех участках рисунка, которые только что были перерисованы: например, выехали из-за края страницы. В остальной части рисунка текст не отображается и не выводится на печать. Ценность PrintMirror ещё в том, что извлекаемый им метафайл не содержит никакой расширенной спецификации, и потому заведомо лучше совместим с более ранними версиями Windows (Win98 не поддерживает метафайлы с расширенной спецификацией, как я понял) и Office. Кроме того, есть подозрение, что создаваемые PowerPoint метафайлы могут требовать для просмотра установленного Office, чего заведомо не требуется для просмотра метафайла, генерируемого PrintMirror (и ePrint): эти метафайлы предназначены для обработки драйвером принтера, и поэтому заведомо не могут содержать внутри себя никакой расширенной спецификации. P.S. Насколько я могу судить, программистам информация на тему вращения метафайлов также недоступна: даже недокументированную функцию поворота на 90 градусов только сравнительно недавно документировал автор EMFExplorer (хотя сам EMFExplorer не может корректно сохранить полученный метафайл), а поворот на произвольный угол - до сих пор полностью недокументированная возможность, о самом существовании которой можно только догадываться!  | Всего записей: 1860 | Зарегистр. 22-03-2003 | Отправлено: 20:52 08-06-2007 | Исправлено: popkov, 01:11 26-11-2007 |
|