Pull to refresh

Pdf.js прошёл первый пиксельный тест

Reading time3 min
Views3.9K
В июне Андреас Гал (Andreas Gal) с коллегами из Mozilla представили движок pdf.js для отображения PDF средствами HTML5/JavaScript. В первоначальной версии он работал неидеально, но разработчики всерьёз взялись за дело и буквально каждый день добавляли функционал: рендеринг графики, GUI и др. Но самое главное, что реализована динамическая загрузка шрифтов TrueType и кардинально улучшена загрузка шрифтов PostScript Type 1.

В итоге, сейчас Андреас Гал решил, что первый тест пройден и pdf.js попиксельно точно* отображает тестовый документ (демо).

Теперь pdf.js присвоен номер версии 0.2 и поставлена новая задача: отрендерить официальные спецификации PDF 1.7 (документ содержит 1310 страниц, файл 31 МБ).

*На самом деле «идеальный» рендеринг достигается только в сборке Firefox Nightly под Windows 7 (c рендерингом шрифтов через Direct2D и DirectWrite), в остальных — близкий к идеалу или не очень близкий, в зависимости от браузера и ОС.

На каждой паре скриншотов показано сравнение предыдущей версии pdf.js (вверху) и pdf.js v0.2.



Андреас Гал говорит, что разница в скриншотах вверху должна была быть гораздо заметнее, но они не решались выкатить первоначальную версию pdf.js, пока не сделают нормальную загрузку PostScript Type 1 для основного шрифта документа, чтобы потом сосредоточиться на остальных проблемах. Динамическая загрузка Type 1 оказалась крайне непростой задачей. Сложно переоценить, насколько важна данная фича для pdf.js.



На второй паре скриншотов видны некоторые улучшения в pdf.js. Самое явное — надписи на объектах рисунка появились благодаря тому, что v0.2 правильно загружает шрифты TrueType. Тени за элементами распознаются и отображаются как фоновые изображения. Пунктирные линии рендерятся с помощью новых API, которые добавлены в обработку элемента canvas браузером Firefox, сейчас они находятся в процессе стандартизации.



Скриншот с моноширинным шрифтом — ещё одно доказательство, как важно было сделать максимально точное измерение и загрузку шрифтов Type 1.



Цветные графики на диаграмме рендерятся отдельными функциями JS, которые потом передают значения пикселей в canvas. Данные конкретные столбцы обсчитываются функцией линейных градиентов. Текст в подписи к диаграмме тоже стал выглядеть лучше — как уже говорилось, pdf.js научился распознавать и загружать разные шрифты.



На сравнении вверху показана парочка новых функций v0.2. Подписи на диаграмме появились благодаря загрузке шрифтов TrueType, а штриховая заливка столбцов — благодаря реализации функции для соответствующих паттернов.



Ну и на последнем сравнении показаны улучшения в GUI, в том числе классная функция предварительного просмотра — панель выскакивает при наведении мышью. Кроме того, на нижнем скриншоте виден кусочек второй страницы, тогда как раньше pdf.js мог показывать лишь по одной странице за раз.

Андреас Гал благодарит всех независимых разработчиков, которые присоединились к проекту и помогают команде Mozilla. Например, новый UI с функцией предпросмотра реализовал justindarc. Другие сделали поддержку зашифрованных PDF, встроенных JPEG'ов, бэкенда Web Workers и прочего, что войдёт в функционал следующей версии pdf.js. В частности, при рендеринге 1310-страничных спецификаций понадобится Web Workers для параллелизации процессов и возможности приостановить со стороны клиента вычисления в основном треде (отзывчивость UI).

Разработчики считают, что в течении двух-трёх месяцев смогут довести pdf.js до такого уровня, что он сможет хорошо отображать большинство PDF-документов в Сети. В будущем можно ожидать, что pdf.js станет нативной частью браузера Firefox (сначала выпустят расширение).

Авторы проекта также надеются, что другие браузеры последуют их примеру и внедрят у себя поддержку pdf.js, код которого опубликован под свободной лицензией (модифицированная BSD). В будущем он сможет одинаково хорошо работать в любом браузере с поддержкой HTML5.

Сейчас это не так: практически на каждом сочетании браузера/ОС получаются разные результаты. Такова судьба каждого проекта, который делается на острие технологий в области неутверждённых стандартов. По словам Андреаса Гала, сейчас pdf.js выходит на тот этап, когда существенная часть вопросов в реальности являются багами-движка-рендеринга-браузера или недостающими фичами, но эти дыры постепенно заполняются.
Tags:
Hubs:
+83
Comments39

Articles