Это кажется (по крайней мере, который является нашим пониманием проблемы в этой точке), что, учитывая фоновое изображение в BIRT, стандартная программа поколения PDF повторяет данные изображения в PDF вместо того, чтобы иметь его когда-то ссылаемый как фоновое изображение всех страниц PDF.
Это заставляет сгенерированный PDFs нашего BIRT быть слишком большим. Существует ли способ заставить BIRT только хранить изображение однажды в PDF и иметь его быть фоновым изображением на каждой странице PDF при сохранении размера файла более разумным?
Да, 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
в прошлом. Вы можете исправить и перестроить iText JAR, используемый BIRT, или использовать Javassist для внедрения кода во время выполнения без необходимости перекомпиляции.