Библиотеки для конвертирования PDF документа в картинку
«Клавиша Print Screen отлично справляется с поставленной задачей. Что может быть проще, чем сохранить документ как изображение?» — спросите вы. Долгое время я работал над задачами сохранения отчётов и форм в формате PDF. Но даже с простыми многостраничными таблицами цифр не все PDF генераторы справлялись одинаково успешно.
Не так давно, мне попался проект, заказчик которого хотел свои сохранённый в PDF маркетинговые шедевры конвертировать в один из графических форматов, например PNG. После долгих уговоров и приведения контраргументов, бюджет проекта позволял купить недорогой .NET компонент.
Оставалось выбрать самый подходящий под требования заказчика и, по-возможности, с хорошей англоговорящей, англо пишущей службой поддержки (не с полуострова Индостан):
Требования к PDF конвертерам- Простотой API, с том числе, для настройки шрифтов (помимо встроенных шрифтов, должна быть возможность добавить недостающий системный шрифт или ссылку на него)
- Возможность экспорта в TIFF, PNG, JPEG, BMP форматы
- Поддержка прозрачных картинок внутри PDF документа
- Поддержка цветовых масок
- Поддержка азиатских шрифтов
- Аннотации должны конвертироваться вместе с документом (возможность отключить эту опцию)
- Различные режимы смешивания цветов (blending modes)
- Различные шаблоны заливки (tiling patterns)
- Различные цветовые пространства RGB, CMYK, Gray, DeviceN
- Прозрачные группы для документов, созданных при помощи Adobe Illustrator
После нескольких запросов, поисковик выдал группу подходящих .NET компонентов: ABCpdf 6.1.1.5 Adobe Acrobat (Interop.Acrobat) Adobe Acrobat 10.0 Type Library Apitron.PDF.Rasterizer 3.0.1.0 O2S.Components.PDFRender4NET 4.5.1.0 PDFLibNET PDFSharp 1.31.1789.0 SautinSoft.PdfFocus 2.2.2.2 TallCоmponents.PDF.Rasterizer 3.0.91.0
Начало испытанийДля тестовых целей был выбран одностраничный PDF файл 3BigPreview.pdf (взят с официального сайта компании Adobe). Он включает в себя большое количество графических элементов, демонстрируя возможности визуализации компонентой графических объектов PDF и их свойств.
ABCPDFЗапустить пример для данной библиотеки на 64-разрядной машине удалось не сразу, лишь поменяв платформу с AnyCPU на x86 был получен результат. Проблема возникла с выставлением правильного разрешения картинки. Картинку правильного размера 612 x 792 пикселей удалось получить только явно выставив разрешение результирующей картинки в 72 точки на дюйм, что странно, так как другие компоненты выставляют 96dpi (для Win7). Правильное отображение иероглифов Kinsoku Shori порадовало. Некоторые буквы выглядят более яркими чем остальные, что говорит о не совсем честном использовании сглаживания (antialiasing). Результат хороший для тех кому не важно, что используется не 100% managed код, а мы идём дальше. Кусок кода для ABCpdf:
Adobe Acrobat 10.0 Type LibraryНетрудно понять, что нативная библиотека Adobe не может быть не в фаворитах. Но вызовы com объектов, это не совсем то, чего нам хотелось получить, тем более, что для этого нужна установленная Pro версия продукта. Кусок кода для Adobe:
Apitron.PDF.Rasterizer for .NETКомпонент хорошо справился с тестовым испытанием. Удобный API, есть возможность настраивать шрифты и отключаемое рисование аннотаций. Изображение выглядит чётким. Все элементы оригинального PDF документа нарисованы. Заметил, что при конвертировании документа все восемь ядер рабочей машины были задействованы, скорее всего это будет удобно для тех, кто хочет увеличить производительность приложения увеличением оперативной памяти и количества процессоров рабочей системы. Кусок кода для Apitron:
O2S.Components.PDFRender4NETРумынский компонент удовлетворительно справился с тестовым испытанием. Не все элементы документа сохраняются правильно. Как видно из результирующего файла все элементы спецификации поддерживаются. Есть явные проблемы с рисованием текста. Кусок кода для O2S:
xPDF Wrapper Library (PDFLibNET)Генерация тестового примера не удалась. Изображение выглядит размытым, текст не читается. При конвертировании тестового файла получили ошибки. Кусок кода для PDFLibNET:
PDFSharp (GhostScript и другие обёртки)PDFSharp, как и другие обёртки известного инструмента GhostScript (например gouda, GhostscriptSharp) работает специфично и не всегда предсказуемо. Потратив несколько часов времени получилось сделать только извлечение картинок, целиком документ сохранить в виде картинки не получилось. Отмечу как хорошую идею для новой статьи. Можно здесь же отметить, всеми любимый, iTextSharp. Удобный инструмент, но не для нашей задачи.
PdfFocus от SautinSoftВ мой обзор попался также отечественный компонент. Но, к сожалению, с испытаниями он не справился. На тестовом файле он выдал NRE ошибку. Зато, на других файлах он неплохо показал себя. (Автору: «Максим, я уверен, что у Вас отличный софт и эта мелочь будет быстро исправлена.») Кусок кода для SautinSoft:
TallCompоnents.PDF.RаsterizerНидерландский компонент хорошо справился с тестовым испытанием. Сложности специфичного API были компенсированы базовыми знаниями Graphics. Видны небольшие проблемы с рисованием текста. Кусок кода для TаllCоmponents: