Скорость рендеринга в Apache PDFBox
Существуют несколько способов как отобразить PDF-документ в браузере и один из часто встречающихся - отрендерить PDF на сервере и отправить в браузер.
Я использую для этих целей в том числе Apache PDFBox. При рендеринге больших книг становится актуальной задача ускорения рендеринга и для этого надо немного поисследовать скорость рендеринга.
Есть две тестовые книги
А) оцифрованная книга со страницами в формате jpeg 300 dpi, 92 стр. 150 МБ книга или 1.6 МБ одна страница.
Б) текстовый файл, 128 стр., 1 МБ, или 8 КБ страница.
Рендерить можно двумя способами:
1) Сразу отрендерить всю книгу
2) Ленивый рендеринг, по факту обращения к конкретной странице
Если рендерить книгу сразу, то рендеринг книги в 1000 страниц может занять более часа времени для оцифрованной книги. Для оцифрованных книг лучше применять ленивый рендеринг.
В пользу ленивого рендеринга говорит еще и то, что он позволяет экономить место.
В ленивом рендеринге можно пойти тоже двумя путями: разбить файл 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%.
Комментарии
Отправить комментарий