2011-09-15 71 views
4

我的應用程序生成HTML報告。用戶希望報告適合單個PDF頁面 - 與您需要多少變焦無關。告訴飛碟或BIRT縮放HTML以適合單個pdf頁面

目前他們在Internet Explorer 8中呈現頁面,並在「打印預覽」窗口中手動定義自定義縮放級別,然後將頁面打印爲PDF。我需要自動執行此操作。如何實現這一目標?

這些報告實際上是由BIRT創建的,所以基於BIRT的解決方案也很好。使用BIRT縮放選項縮放文檔以適合高度,但不適合寬度(因爲它首先呈現HTML然後應用縮放)。

現在我正在嘗試使用Flying Saucer將PDF轉換爲BIRT生成的HTML。

我已經看到了相關abcPDF(.NET)和CF8(參見下文),類似的問題,但我需要一個基於Java的解決方案,我不能夠使用帶有飛碟或BIRT相同的技術。

Tell abcPdf to scale the html to fit on a single pdf page

scale PDF to single page

回答

1

這是我找到了解決辦法的基礎上,飛碟/ iText的:

// A4 paper size = 297x210 mm 
int PAGE_WIDTH = 2100; 
int PAGE_LENGTH = 2970; 
float MARGIN = 19.05f; // 0.75 inch 

int width = PAGE_WIDTH; 

// Java2DRenderer.NO_HEIGHT = -1 (it's private) 
// if used the required height is computed 
Java2DRenderer renderer = new Java2DRenderer(dom, width, -1); 
BufferedImage img = renderer.getImage(); 

// Adjusts width based on required height 
int height = img.getHeight(); 
width = (int) Math.round(height * PAGE_WIDTH/PAGE_LENGTH); 

// Render same document again, now with the right dimensions 
renderer = new Java2DRenderer(dom, width, height); 
img = renderer.getImage(); 

com.lowagie.text.Document pdf = new com.lowagie.text.Document(PageSize.A4); 
pdf.setMargins(MARGIN,MARGIN,MARGIN,MARGIN); 
PdfWriter.getInstance(pdf, new FileOutputStream(args[0]+".pdf")); 
pdf.open(); 
com.lowagie.text.Image pdfImage = com.lowagie.text.Image.getInstance(img,Color.WHITE); 
Rectangle ps = pdf.getPageSize(); 
pdfImage.scaleAbsolute(
    ps.getWidth()-pdf.leftMargin()-pdf.rightMargin(), 
    ps.getHeight()-pdf.topMargin()-pdf.bottomMargin() 
); 
pdf.add(pdfImage); 
pdf.close(); 
3

我們增加了一個拉請求飛碟項目的補丁,允許"itextrenderer fitting to page width"

建議的補丁的想法是,我們將使頁面儘可能地寬(避免截斷),然後您可以使用PDF閱讀器在打印時適合頁面。

-1

首先,我沒有使用飛碟。

但是,也許其他人可能正在閱讀你的問題,並需要一個不同的解決方案。

如果您使用的是Java的BIRT引擎並設置自己的渲染選項,你可以申請:

[PAGE_OVERFLOW = FIT_TO_PAGE_SIZE]