Скорость рендеринга в Apache PDFBox

Существуют несколько способов как отобразить PDF-документ в браузере и один из часто встречающихся - отрендерить PDF на сервере и отправить в браузер.

Я использую для этих целей в том числе Apache PDFBox. При рендеринге больших книг становится актуальной задача ускорения рендеринга и для этого надо немного поисследовать скорость рендеринга.

Есть две тестовые книги

А) оцифрованная книга со страницами в формате jpeg 300 dpi, 92 стр. 150 МБ книга или 1.6 МБ одна страница.

Б) текстовый файл, 128 стр., 1 МБ, или 8 КБ страница.
Книга А
Книга Б

Рендерить можно двумя способами:

1) Сразу отрендерить всю книгу
2) Ленивый рендеринг, по факту обращения к конкретной странице

Если рендерить книгу сразу, то рендеринг книги в 1000 страниц может занять более часа времени для оцифрованной книги. Для оцифрованных книг лучше применять ленивый рендеринг.

В пользу ленивого рендеринга говорит еще и то, что он позволяет экономить место.

В ленивом рендеринге можно пойти тоже двумя путями: разбить файл PDF на отдельные страницы в виде PDF-файлов или не разбивать и рендерить из основного файла. В последнем случае надо будет вначале переместиться на нужную страницу и лишь потом рендерить.

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


Тип нагрузки Время загрузки PDDocument.load(pdfFile), сек Время рендеринга в bufferedImage, сек Время кодирования в jpeg и записи в файл, сек Общее время рендеринга всех страниц книги и среднее время рендеринга одной страницы в файл, сек
A, из оригинала 5.1 2.8 0.13 747 / 8.11
А, из отдельных страниц 0.05 2.5 0.13 240 / 2.6
Б, из оригинала 0.05 0.14 0.23 56 / 0.43
Б, из отдельных страниц 0.008 0.13 0.23 50 / 0.39

Для оцифрованной книги возможен и другой вариант: не рендерить страницу, а просто извлечь рисунок. В этом случае время на кодирование не тратится, но есть риск неверного определения того, что книга является оцифрованной копией и извлечь не тот рисунок или не с теми параметрами.
В этом случае для книги А загрузка из отдельны страниц не поменялась: 0.05 сек., время поиска рисунка 1.1 сек (что меньше времени рендеринга в 2.5 раза) и время записи 0.01 сек вместо 0.13 сек, что объясняется тем, что рисунок не перекодируется, а записывается как есть. Общее время уменьшилось с 240 сек до 109.

Выводы

Для оцифрованных книг с вложенными качественными изображениями оптимизация в виде разделения на несколько файлов дает стократный прирост в скорости загрузки: 5 сек против 50 мс. После выполнения этой оптимизации, следует заняться оптимизацией рендеринга PDF-файла. Заранее утверждать нельзя, но, похоже, следует потратить время на использование libjpeg-turbo для ускорения декодирования оцифрованного рисунка, т.к. длительное время рендеринга страницы (2.5 сек) видимо связано с декодированием большой картинки.

Для текстовых документов основное время занимает процесс кодирования рисунка в jpeg и сохранение на диске. Разбиение документа на файлы дает прирост рендеринга на уровне 40 мс, т.е. на фоне 130 мс на рендеринг и 230 на кодирование готового изображения, такое преимущество несущественно. Оптимизация дает выигрыш в скорости около 10%.

Комментарии

Популярные сообщения из этого блога

Обзор почтового клиента Pronto Pro!

Подключаем ZFS over iSCSI на Oracle Linux 8 (CentOS) в Proxmox

Архитектура катастрофоустойчивого сервиса