Как стать автором
Обновить

Комментарии 10

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

это был один из плагинов, для печати пдф документов. Если честно, почти профан в PDF формате, сильно не углублялся.

Вот с TIFF возникла проблемка когда тестеры подсунули (или клиент, ко мне уже приехала просьба решить проблему) большое изображение примерно на 300 мегапикселей... Хоть он и был в однобитном цвете (факс), но Java ImageIO разворачивает в RGBA модель, где каждый цвет это int, а int в java это 32 бита, те 4 байта... Все очень грустно оказалось с памятью.

Пришлось вспомнить старый добрый С и портировать декодер TIFF на Java, пытался вначале предлагать гетерогенные сервисы для конвертации (Polyglot кажется сейчас называется такой подход?), но клиенту обещали монолит на Java. Пришлось доставать напильник и делать из паровоза самолет, согласно чертежу...

TIFF в большинстве случаев (кроме Jpeg, a у клиента в основном были факсы, CCITT 4 формат) развертывается построчно, PNG тоже построчный - это хорошо ложится в потоковую обработку без необходимости разворачивать картинку в памяти.

Добавил масштабирование, с разными вариантами экстраполяции, и вуаля - конвертация TIFF 1 мегапиксель занимает 12 МБ heap memory, а 300 мегапикселей 16 МБ (с масштабированием в разрешение на клиенте)! Зависимость обратно квадратичная. С Jpeg так не получится, придется разворачивать в памяти чтобы создать PNG.

Пулл реквест-то прислали?

нет, там пара патчей висела в тикете уже, похоже интерес потерян у владельца проекта к этой проблеме.

Второе, в комменте ниже раскопки продолжил, похоже что это не текст в форме а аннотация которая скорее всего описывает геометрическую фигуру (карту, схему дома и тд) и по ошибке парсится как текстовая аннотация.

На досуге возможно еще покопаюсь. Проблема в том что не могу поделиться исходным pdf в тикет а воспроизвести похоже нужно постараться (не знаю как сделали оригинальный документ).

Спецификацию бы тагов pdf посмотреть, возможно парсер pdfbox неправильно разобрал документ. Версия 1.4:

%PDF-1.4

Часть аннотаций выглядит так:

/Type /Annot
/V (y \265w\312\274\277\345\341\

или так

/Type /Annot
>>
endobj

a pdf box создал что то непонятное (текст длиной в 100к) из аннотации начинающейся как

/Type /Annot
/V (y \265w\312\274\277\345\341\3 и далее что то похоже на unicode текст

получилось

/T (gendate)
/Type /Annot
/V (FNCNETklimqf1i54Swl и далее около 100К символов с окончанием TnEAB2NFXwjY9rhk=)

Похоже что изменен энкодинг.

Не могу сейчас сильно заглубляться в эту тему, так как ушел в совершенно другой проект, но похоже что проблема не просто в нарезке текста а в обработке не текстовой аннотации как текста. Не разбираюсь детально в pdf формате.

То есть, в защиту алгоритмов вам удалось нарыть в памяти 1 пример из реальной жизни, который к тому же не пригодился. Ну что ж, лучше чем ничего.

Примеров на практике масса, но приводить что я видел "где то там работая с индусами 20 лет назад или с пареньком из Колорадо который только колледж закончил", глупо. Новички со слабой подготовкой делают ошибки, руку не набили. Вот со свежим выпускником МГУ мехмата работал как то - тут уже я тормозил, отстал в некоторых темах

В опенсорсе обычно неэффективного кода меньше чем в in house разработке - как правило спонсируются университеты для работы с опенсорсом, там люди достаточно грамотные, их не торопят. Знакомый так пилил Apache web server, лет 20 назад - работал из дома, 120к на руки, папа профессор математики, поможет если что. Папа для Адобе халтурку сделал по быстрому декодированию raw photo image в 12 бит, вроде. Так его специализация была волновые процессы. Хорошо заработал, кстати. Вот она, польза знания алгоритмов.

Если вспоминать что видел с 2000 года, так можно всякого вспомнить, но это будут не примеры с open source.

Весь java ImageIO можно для диссертации использовать на тему "как использовать неэффективные алгоритмы при работе с графикой".

Лет 10 назад заглядывал в предыдущую версию pdfbox - не удержался, покопался около часа и ускорил парсинг в 2 раза... Потом на время не сталкивался с ней плотно. PDF box не был качественным проектом изначально. Вот глянешь иной проект и видно что рефакторинг просится - к примеру, Solr. Elastic намного лучше впечатление оставляет.

100к символов, это 50 листов формата а4. В строке а4 70 символов примерно.

То есть вы засунули примерно в полторы тысячи раз больше символов, чем рассчитано, этакий документ шириной 315 метров 14 шрифтом, и удивились, что сломалось?

Советую завести тикет в автоваз. Скажите что засунули в ладу 7500 человек, а она почему то не поехала.

Не я засунул а клиент такое дал.

Документ реальный, оформление сделки с недвижимостью. К сожалению, выложить его не могу в публичный доступ.

Стыдно признаться, сделал патч даже не разобравшись а что за текст. Механически. Pdf проверил - выглядит нормально, как исходный, а подумать а где и куда делись 100К символов, не догадался... Потогонка.

Более того, спутал вызовы (время прошло некоторое и память подвела), вызов был не при конвертации в png, а при склейке двух pdf.

Посмотрел в отладчике еще раз, глянул пдф структуру, это оказалась аннотация:

/Subtype /Widget
/T (gendate)
/Type /Annot
/V и далее текст длиной > 100К символов похожий на base64

Больше всего это похоже на то что pdfbox неправильно обрабатывает или не понимает формат аннотации. Обычно 100К символов это не текстовая аннотация а кодирование массива байт для полигона, карты и тд.

Скорее всего нужно покопаться дольше, причина не только в парсинге.

Но в любом случае, парсинг не валидировал длину строки и использует слишком простой алгоритм.

Хотя бы среднюю ширину символа можно было использовать чтобы получить ожидаемое количество символов (ширина стобца / средняя ширина символа) вместо перебора всех строчек.

и удивились, что сломалось?

Конечно, я бы тоже удивился. Даже отказ с адекватным сообщением об ошибке тут уместнее, чем потенциальная уязвимость для DOS-атаки.

Лада не поехала — это нормально. Лада выехала на трассу со скоростью «1» при удавленном акселераторе — нет.

Там полный суповой набор получился:

1 нет валидации входных данных. Для публичных интерфейсов это желательно. Помню, в одном из первых проектов, Zurich insurance тестеры пихали мне во все поля вводов во все формы "Войну и мир" - поле ввода имени пользователя? Получи туда десяток мегабайт!

2 алгоритм примитивный. Есть ширина столбца, есть средняя ширина символа - ну подели ты одно на другое и используй как стартовую точку с пошаговой проверкой. Тот же размер кода, даже клеточки головного мозга для решения использовать не нужно...

3 причина бед похоже в том что геометрическую аннотацию парсер принял за текстовую либо программа создавшая документ записала ее не так. Текст в 100к символов в документе не показывается, смысла не имеет (белиберда вида base64).

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

OSZAR »