2010-03-24 2 views
11

BIRT에서 배경 이미지가 주어지면 PDF 생성 루틴은 한 번 모든 페이지의 배경 이미지로 참조되는 대신 PDF 내부의 이미지 정보를 반복합니다 (이 시점에서이 문제에 대한 우리의 이해입니다). PDF의BIRT 생성 된 PDF의 배경 이미지로 크기를 줄이는 방법은 무엇입니까?

이로 인해 BIRT 생성 PDF가 너무 커집니다. BIRT가 PDF 내에서 이미지를 한 번만 저장하고 PDF의 각 페이지에서 배경 이미지로 유지하면서 파일 크기를보다 합리적으로 유지할 수있는 방법이 있습니까?

+0

+1 흥미로운 질문입니다. 이 사실을 결코 알지 못했습니다 ... – ChristopheD

답변

7

예, BIRT는 각 페이지에 대해 동일한 배경 이미지의 새로운 화신을 만듭니다. 안타깝게도이 부분은 org/eclipse/birt/report/engine/emitter/pdf/PDFPage.java에 너무 깊숙이 묻혀있어서 쉽게 해킹 할 수 있으며 구성 할 수 없습니다.

하지만 절망하지 마라! iText (BIRT에서 내부적으로 사용하는 것과 동일한 iText)을 사용하여 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과 동일합니다. BIRT가 사용하는 iText JAR을 패치하고 다시 빌드하거나, Javassist을 사용하여 재 컴파일 할 필요없이 런타임에 코드 삽입을 수행 할 수 있습니다.

+1

감사합니다 블라드, PdfSmartCopy는 우리에게 잘 작동하는 해결 방법이었습니다. – Yishai

관련 문제