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 缩放为单页

4

3 回答 3

3

我们已向 Flying Saucer 项目添加了一个拉取请求,以获取一个补丁以允许“itextrenderer 适合页面宽度”

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

于 2013-10-01T04:12:00.057 回答
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();
于 2011-09-23T16:10:41.970 回答
-1

首先,我没有使用过飞碟。

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

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

[PAGE_OVERFLOW = FIT_TO_PAGE_SIZE]

于 2017-03-08T03:17:07.273 回答