Как уменьшить размер BIRT сгенерированного PDF с фоновым изображением?

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

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

Ответ 1

Да, 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();

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