2013-06-24 2 views
0

Я использую iText PDF 5.4 вместе с интерфейсом Java2D (холст java.awt.Graphics), и у меня есть серьезная проблема с градиентами.Проблема производительности с градиентами Java2D и iText PDF

Я рисую много прямоугольных форм, краска которых составляет LinearGradientPaint. Это приводит к большим файлам (например, 10 МБ) и пытается открыть результаты, например. Preview.app приводит компьютер в общую сумму. Кажется, проблема связана с использованием памяти, потому что первые десятки коробок окрашиваются довольно быстро, а затем производительность несколько замедляется несколько раз, что означает, что для типичной страницы требуется> 10 минут для открытия.

Adobe Acrobat также работает медленно, но, по крайней мере, это занимает около 4 или 5 секунд вместо нескольких минут.


Является ли это ошибкой iText? Есть ли настройка или tweak в iText, который управляет представлением градиентов? Я предполагаю, что он разлагает их на сотни отдельных команд рисования вместо использования компонента прямого градиента (если это существует - я знаю, что он существует в SVG, но PDF я не знаю).

Состояние в том, что я остаюсь в awt.Graphics, я не могу переписать мой код рендеринга, чтобы не использовать Java2D.

+0

При использовании функции «родной PDF» iText вы можете часто создавать сложный графический объект только в нескольких строках. При использовании 'java.awt.Graphics' iText должен подчиняться множеству инструкций, запускаемых классом« Graphics »в Java. Я бы не назвал это ошибкой iText; вы сделали архитектурный выбор, и теперь вы платите цену за этот выбор. –

+0

Итак, вы говорите, что нет возможности улучшить представление градиентов Java2D? Я полностью понимаю, что прямые объекты будут более эффективными, но обычно у меня есть Swing GUI и нет ресурсов для разработки каждой графической структуры в два раза. –

+0

Ну, если вы не можете изменить способ 'java.awt.Graphics2D', тогда единственным способом было бы полностью переконфигурировать« PdfGraphics2D »iText. Мы не собираемся это делать. Мы всегда советовали использовать собственный PDF-файл и прибегать к 'PdfGraphics2D', если родной PDF-файл невозможен. –

ответ

1

Альтернативной идеей было бы использовать Apache Batik и вместо этого выводить на SVG. Существует an example, в котором показано, как включить правильное перекодирование LinearGradientPaint в эквивалент SVG.

EDIT: Кажется, есть новая библиотека Java2D-to-SVG JFreeSVG. Недавние изменения показывают, что градиенты реализованы.