告诉Flying Saucer或BIRT扩展html以适应单个pdf页面

时间:2011-09-15 14:50:28

标签: html pdf zoom birt flying-saucer

我的应用程序生成HTML报告。用户希望报告适合单个PDF页面 - 无论您需要多少缩放。

目前,他们在Internet Explorer 8中呈现页面,并在“打印预览”窗口中手动定义自定义缩放级别,然后将页面打印为PDF。我需要自动执行此操作。怎么做到这一点?

报告实际上是由BIRT创建的,因此基于BIRT的解决方案也很好。使用BIRT缩放选项缩放文档以适合高度,但它不适合宽度(因为它首先渲染HTML然后应用缩放)。

现在我正在尝试使用Flying Saucer将BIRT生成的HTML转换为PDF。

我看到了与abcPDF(.NET)和CF8(见下文)相关的类似问题,但我需要一个基于Java的解决方案,而且我无法使用与Flying Saucer或BIRT相同的技术。

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

scale PDF to single page

3 个答案:

答案 0 :(得分:3)

我们已向Flying Saucer项目添加了一个拉取请求,以获取允许"itextrenderer fitting to page width"的补丁。

建议补丁的想法是,我们将使页面尽可能宽(以避免截断),然后您可以使用PDF阅读器在打印时适合页面。

答案 1 :(得分:1)

这是我找到的解决方案,基于Flying Saucer / 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();

答案 2 :(得分:-1)

首先,我没有使用飞碟。

然而,也许其他人可能正在阅读您的问题并需要一个不同的解决方案。

如果您使用 Java BIRT引擎并自行设置渲染选项,则可以申请:

[PAGE_OVERFLOW = FIT_TO_PAGE_SIZE]