PDF Creator Pilot: Значительные улучшения в emf2pdf конвертере

Многие компании при составлении документов используют в колонтитулах свои логотипы в виде изображений. Такие логотипы, как правило, помещают на каждой странице документа. Когда же возникает необходимость сконвертировать документ в формат PDF, то встает задача уменьшение размера PDF файла за счет ссылок на изображения, вместо встраивания одинаковых изображений на каждую страницу. Благо, PDF формат позволяет это сделать. Аналогичная задача возникает и в тех случаях, когда на странице (-ах) используется несколько одинаковых изображений. В этом случае тоже можно обойтись встраиванием одного изображения в документ, а в остальных местах сделать ссылки на это изображение. За счет этого размер выходного файла будет значительно уменьшен.

Именно таким образом нам удалось оптимизировать работу нашего emf2pdf конвертера в PDF библиотеке. И как следствие размер генерируемого PDF файла уменьшился пропорционально количеству одинаковых изображений, содержащихся в emf файлах. Приведем сравнительные данные, которые были получены в ходе тестирования на реальных emf файлах, присланных нашими пользователями. В присланном документе было 12 страниц. Каждая картинка занимала 160 Кб. До оптимизации работы конвертера получаемый PDF документ имел размер 2,9 Мб, после оптимизации – 0,9 Мб. Таким образом, в результате исключения одинаковых изображений размер файла уменьшился более чем в 3 раза. Так же рекомендуем не забывать ставить сжатие для PDF документы для уменьшения размера файла с помощью свойства Compression. В некоторых случаях это может уменьшить размер файла в 2 и более раз.

Последняя версия библиотеки для загрузки находится здесь.

Всегда актуальная онлайн документация находится по этому адресу.

Примеры использования библиотеки можно посмотреть здесь.

Артём Голубиченко,
Два Пилота
http://www.colorpilot.ru

Изменение размеров страниц в PDF файлах

В библиотеку для создания PDF документов PDF Creator Pilot была добавлена возможность для конвертирования PDF документов с размером страниц А4 в PDF документы с размером страниц А3. После трансформации на новой странице размером А3 помещаются две страницы размера А4 из исходного документа. Чтобы воспользоваться этой функциональностью, необходимо вызвать метод ConvertToA3. Здесь можно загрузить примеры PDF файлов до и после применения этой функции.

Так же для преобразования размеров и ориентации страниц в PDF библиотеке доступны следующие методы:

  • PageHeight – свойство для чтения/установки высоты текущей страницы;
  • PageOrientation – свойство для чтения/установки ориентации текущей страницы;
  • PageResolution – свойство для чтения/установки разрешения (в DPI) текущей страницы;
  • PageRotate – метод, который поворачивает страницу;
  • PageSize – свойство для чтения/установки размера текущей страницы;
  • PageWidth – свойство для чтения/установки ширины текущей страницы.

Артём Голубниченко

Последствия округления

Лучше всего сразу начать с иллюстрации того, что было ДО неточного округления чисел с плавающей точкой и как это стало выглядеть ПОСЛЕ того, как ошибка была исправлена.

comparing

Проблема проявилась при конвертировании EMF в PDF (или при рисовании на HDC, полученном из PDF). Проблема была с функциями Polyline(To). На вход функции поступал массив точек, координаты которых не значительно отличались друг от друга. И далее для того, чтобы нарисовать набор линий в PDF, необходимо было преобразовать координаты из HDC в координаты для PDF. Для этой цели мы используем функцию LPtoDP. Но функция возвращает целые значения координат, поэтому, например, для двух координат из EMF (160, 74) и (159, 60) функция преобразует их в (1, 1) и (1, 2). В результате чего набор прямых приобретет вид, который представлен на скриншоте слева. Поэтому в данном случае мы перестали использовать эту функцию и получили правильный результат работы функций Polyline(To).

Артём Голубниченко

Как получить путь к системным папкам

Когда ваше приложение нуждается в том, чтобы сохранить/загрузить/скопировать какой-нибудь файл в системной папке ни в коем случае не нужно использовать жёстко прописанные пути вроде "C:\Documents and Settings\All Users\Application Data". Во-первых, этот путь может быть изменён в следующих версиях Windows. Во-вторых, пользователь может просто установить ОС на другой диск. 🙂

Избежать эти неприятности нам поможет WinAPI-функция SHGetFolderPath.

Можно почитать про нее в MSDN.

Кратко: Возвращает путь к определённой системной директории, тип которой указан в идентификаторе CSIDL.

HRESULT SHGetFolderPath( HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPTSTR pszPath );

Все константы CSIDL можно найти здесь.

С помощью SHGetFolderPath можно найти почти все необходимые папки.

Но среди констант CSIDL вы не найдете папку Tmp юзера. В XP по умолчанию "Documents and Settings\USERNAME\Local Settings\Temp", в Windows 7 – "Users\USERNAME\AppData\Local\Temp".

SHGetFolderPath тут ничем не поможет. Пути в разных версиях Windows сильно отличаются.

Найти путь к этой папке можно в ключе реестра HKEY_CURRENT_USER\Environment. Там есть 2 значения TEMP и TMP (теоретически должны совпадать) – путь к этой самой папке.

Всё очень просто 🙂

Олег Медведев

Улучшена конвертация EMF2PDF в PDF Creator Pilot.

Недавно в библиотеке PDF Creator Pilot был исправлен баг с заливкой полигонов. В присланном документе фигуры выводились с помощью функции Polygon. Но после вывода они закрашивались неверным цветом – черным. Как оказалось это было связано с тем, что для заливки использовалась кисть со стилем BS_PATTERN. А в свойствах этой кисти поле  lbColor, содержащее цвет кисти, игнорировалось, и цвет заливки нужно было брать из функции SetBkColor. После того, как проблема стала понятной, мы незамедлительно её исправили. В результате получили правильную конвертацию emf2pdf. Чтобы оценить результат исправления, ниже представлена сравнительная картинка (до и после исправления проблемы)

Before and after fixing the problem
Before and after fixing the problem

Так же ниже можно скачать оригинальные pdf и emf файлы:

PDF файл до исправления, PDF файл после исправлени, EMF файл.

Артём Голубниченко

Недокументированные возможности вывода текста в EMF

До недавнего времени в нашей PDF библиотеке “PDF Creator Pilot” была нерешенная проблема с выводом вертикального текста в EMF файлах. В большей степени это было связано с тем, что EMF-record, выводящая этот текст была недокументированной. Впрочем, сейчас Microsoft выпустила полную документацию по формату EMF, но ещё раньше это появилась на ресурсе www.undocprint.org. Все это вместе и помогло разрешить проблему.

Проблема изначально заключалась в том, что текст по вертикали выводился не совсем корректно. Он очень сильно сжимался, и буквы накладывались друг на друга.  Поэтому изначально было подозрение, что граничный прямоугольник (rclBounds) для вывода текста рассчитывается неверно. Как в последствии оказалось,  в этом и заключалась проблема. Опишу немного технических деталей, которые выяснились при вскрытии проблемы.

Во-первых, из формата  EMF нами была получена необходимая информация по записи EMR_SMALLTEXTOUT (сам текст, rclBounds и т.д.).

Во-вторых, как выяснилось, размеры rclBounds рассчитывались верно. Но загвоздка заключалась в том, что он не был повернут на 90′. Почему на 90′? Потому что когда текст выводится по вертикали, то в структуре LOGFONT, отражающей настройки шрифта,  – это  фиксируется в полях lfEscapement и lfOrientation. И поэтому после того, как это было определено, необходимо ещё и rclBounds также повернуть на 90′. И тогда текст стал выводиться верно.

Резюмируя, скажу, что проблема была в том, что из EMF передается не повернутый на 90′ rclBounds. Поэтому для корректного вывода текста оставалось его только повернуть на нужный угол. Ниже попытаюсь показать это на рисунках (специально выделю rclBounds, чтобы было нагляднее).

Граничные прямоугольники
Граничные прямоугольники

Исправленную версию PDF библиотеки можно загрузить здесь.

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

Артем Голубниченко
Руководитель проекта Виртуальный Принтер

Layers (Optional Content Groups)

Слои (наслоения), или более формальное их название – группы с выборочным содержимым, представляют собой совокупность графических элементов, которые пользователь может динамически сделать видимыми или невидимыми при просмотре документа. (Такая возможность является полезной в таких случаях, как CAD рисование, карты или многоязычные документы) С появлением версии PDF 1.5. такая возможность стала доступна и в PDF. Формы, картинки и аннотации так же могут входить в группы с выборочным содержимым.

Continue reading “Layers (Optional Content Groups)”

Создаем свой первый инсталлятор на Windows Installer XML (WiX) v3.0 в Visual Studio.

Как создать WiX – проект в Visual Studio

После установки необходимых компонентов для работы WiX в Visual Studio, можно приступать к созданию WiX – проекта.

  1. Выберите в меню File, затем New, затем Project…

  2. В дереве типов проектов выберите WiX, затем WiX Project и назовите его “FirstWixProject”.

В результате получите проект FirstWixProject и файл Product.wxs, который содержит начальный вариант кода установки.

Пример:

Continue reading “Создаем свой первый инсталлятор на Windows Installer XML (WiX) v3.0 в Visual Studio.”

COM в быту: первые шаги.

Я буду описывать процесс создания COM компонента на примере Visual Studio 2008 с использованием ATL, язык С++.

Для начала создаем проект Visual C++/ATL как показано на картинке:


Continue reading “COM в быту: первые шаги.”

PDF Creator – о проекте и процессе разработки

Привет всем!

В этой статье я хочу рассказать об устройстве проекта PDF Creator Pilot, а также о тех средствах, которые мы используем в его разработке и продвижении.

Continue reading “PDF Creator – о проекте и процессе разработки”