告诉Flying Saucer或BIRT将HTML缩放以适应单个PDF页面。

4

我的应用程序生成HTML报告。用户希望报告适合单个PDF页面,不需要考虑缩放程度。

目前他们在Internet Explorer 8中渲染页面,并手动在打印预览窗口中定义自定义缩放级别,然后将页面打印到PDF。我需要自动执行此操作。如何实现?

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

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

我看到类似于abcPDF(.NET)和CF8(请参见下面)的问题,但我需要基于Java的解决方案,并且我无法使用Flying Saucer或BIRT使用相同的技术。

告诉abcPdf将html缩放到适合单个pdf页面

缩放PDF为单个页面

3个回答

3
我们已经为Flying Saucer项目添加了一个拉取请求,以修补"itextrenderer适合页面宽度"
所提议的修补程序的想法是,我们将使页面尽可能宽(以避免截断),然后您可以在打印时使用PDF阅读器来适应页面。

1

这是我基于飞碟/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();

-1

首先,我没有使用Flying Saucer。

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

如果您正在使用Java BIRT Engine并自己设置渲染选项,则可以应用:

[PAGE_OVERFLOW = FIT_TO_PAGE_SIZE]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接