Как уменьшить размер BIRT PDF с фоновым изображением? - PullRequest
11 голосов
/ 25 марта 2010

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

Это приводит к тому, что сгенерированные BIRT PDF-файлы становятся слишком большими. Есть ли способ заставить BIRT хранить изображение только один раз в PDF, и оно должно быть фоновым изображением на каждой странице PDF, при этом сохраняя размер файла более разумным?

1 Ответ

7 голосов
/ 28 марта 2010

Да, BIRT создаст новое воплощение того же фонового изображения для каждой страницы. К сожалению, это слишком глубоко скрыто в org/eclipse/birt/report/engine/emitter/pdf/PDFPage.java, чтобы его можно было легко взломать, и, скорее всего, его нельзя настроить.

Но отчаяния нет! Вы можете использовать iText (тот же самый iText, который используется внутри BIRT), чтобы исключить дублирующиеся объекты с PdfSmartCopy. Что-то вроде:

PdfReader reader  = new PdfReader(PDF_IN_FROM_BIRT);
Document document = new Document();
PdfSmartCopy copy = new PdfSmartCopy(document,
  new FileOutputStream(PDF_OUT_NO_DUPLICATES));
document.open();
for (int page = 1; page <= reader.getNumberOfPages(); page++) {
  copy.addPage(copy.getImportedPage(reader, page));
}
document.close();

Если вышеприведенное неприемлемо, тогда вы можете исправить com.itextpdf.text.Image.getInstance(URL), чтобы вести себя как синглтон , возвращая существующий объект com.itextpdf.text.Image, если изображение уже было получено из того же URL в прошлом. Вы можете исправить и перестроить JAR iText, используемый BIRT, или использовать Javassist для выполнения внедрения кода во время выполнения без необходимости перекомпиляции.

...