PDF библиотека оптимизатора потока страниц? - PullRequest
4 голосов
/ 11 ноября 2010

Кто-нибудь написал библиотеку (или просто программу), которая оптимизирует содержимое потоков страниц PDF?Я говорю о таких вещах, как «удалить q ... Q блоки, которые не имеют общего эффекта», «объединить смежные BT ... ET блоки», «отслеживать состояние графики и удалять операторы, которые устанавливаютчто-то к значению, которое у него уже есть, «возможно, даже», измените порядок операций рисования, чтобы минимизировать изменения состояния графики, когда это можно сделать без изменения внешнего вида страницы ».Я не придирчив к языку реализации, но открытый исходный код очень предпочтителен, так как мне, возможно, придется взломать его для моих конкретных нужд.

Вот небольшой фрагмент примера того, что я хотел бысделанный.Графика "сетки" R + его бэкэнд PDF генерирует смешное количество бессмысленных операций, как это:

1 J 1 j q
Q q
Q q
Q q
Q q
Q q
Q q
Q q
Q q
Q q
BT
0.000 0.000 0.000 rg
/F2 1 Tf 12.00 0.00 -0.00 12.00 168.43 14.40 Tm [(T) 120 (ask)] TJ
ET
Q q
BT
0.000 0.000 0.000 rg
/F2 1 Tf 0.00 12.00 -12.00 0.00 19.42 205.26 Tm 
[(Quer) -15 (ies per min) 10 (ute)] TJ
ET
Q q
Q q 23.02 489.60 26.53 0.00 re W n
Q q
Q q 23.02 489.60 26.53 0.00 re W n
Q q
Q q
Q q
[...]

Это может быть уменьшено до

1 J 1 j
BT
/F2 1 Tf
12 0 0 12 168.43 14.40 Tm [(T) 120 (ask)] TJ
0 12 -12 0 19.42 205.26 Tm [(Quer) -15 (ies per min) 10 (ute)] TJ
ET

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

Ответы [ 2 ]

0 голосов
/ 16 ноября 2010

Это выглядит как PDF-вывод интерфейса iText PdfGraphics2D в худшем, чем обычно, случае. Обычный случай не так жарко, но это не так уж плохо.

Если я прав, ответ по-прежнему нет, но вы можете написать его самостоятельно, поскольку у вас явно нет страха перед потоками контента:

ByteBuffer internalBuf = myPdfContentByte.getInternalBuffer();

String newContents = magic( internalBuf.toString() ); 

internalBuf.reset();
internalBuf.append( newContents );

magic() немного туманно, но написание кода для удаления пар "q Q" должно быть тривиальным. Смахивание областей отсечения с ничем внутри них (линия-линия-линия W n) не должно быть намного сложнее с небольшим количеством regEx.

Избавиться от настроек ограничения строки / соединения строки (j & J), когда они не используются, было бы сложнее. То же самое с объединением текстовых блоков или сбросом избыточных изменений в цвета заливки / обводки, шрифт и размер и т. Д.

«Изощренное использование текстовых операторов» скоро начнет выглядеть как оптимизация компилятора черной магии.

И если это действительно iText, мы все будем признательны, если вы поделитесь своим кодом. Уверяю вас, мы с радостью примем любую очистку вывода PdfGraphics2D.

0 голосов
/ 16 ноября 2010

Java «Multivalent Tools» имеет инструмент «сжатия», который будет делать это: http://multivalent.sourceforge.net/Tools/pdf/Compress.html

Инструмент Compress был удален из последней версии Multivalent jar, но вы можете загрузить более старую версию из следующихместоположение: http://code.google.com/p/pdfsizeopt/downloads/detail?name=Multivalent20060102.jar&can=2&q=

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...