我的应用程序生成HTML报告。用户希望报告适合单个PDF页面 - 无论您需要多少缩放。
目前,他们在Internet Explorer 8中呈现页面,并在“打印预览”窗口中手动定义自定义缩放级别,然后将页面打印为PDF。我需要自动执行此操作。怎么做到这一点?
报告实际上是由BIRT创建的,因此基于BIRT的解决方案也很好。使用BIRT缩放选项缩放文档以适合高度,但它不适合宽度(因为它首先渲染HTML然后应用缩放)。
现在我正在尝试使用Flying Saucer将BIRT生成的HTML转换为PDF。
我看到了与abcPDF(.NET)和CF8(见下文)相关的类似问题,但我需要一个基于Java的解决方案,而且我无法使用与Flying Saucer或BIRT相同的技术。
答案 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]