如何使图形的大小适应pdf页面java的大小

时间:2015-03-23 12:09:02

标签: java pdf graphics itext

我正在尝试使用以下代码在pdf文件中保存图形:

if (jRadioButton1.isSelected()) {
    Document document = new Document(PageSize.A4, 50, 50, 50, 50);
    PdfWriter writer = null;

    try {
        writer = PdfWriter.getInstance(document, new FileOutputStream("C:\\Simulation_Report.pdf"));
    } catch (FileNotFoundException | DocumentException ex) {
        Logger.getLogger(Reports.class.getName()).log(Level.SEVERE, null, ex);
    }

    document.open();

    try {
        document.add(new Paragraph("Simulation Report"));
    } catch (DocumentException ex) {
        Logger.getLogger(Reports.class.getName()).log(Level.SEVERE, null, ex);
    }

    document.newPage();

    try {
        document.add(new Paragraph("Simulation"));

        PdfContentByte cb = writer.getDirectContent();

        cb.saveState();

        PdfTemplate pdfTemplate = cb.createTemplate(750,750);
        Graphics2D g2 = pdfTemplate.createGraphics(750, 750);

        Drawer drawer = new Drawer();
        drawer.setSource(new File(jTextField1.getText()));
        drawer.paintComponent(g2);

        cb.addTemplate(pdfTemplate, 10, 10);
        g2.dispose();
        cb.restoreState();

    } catch (DocumentException ex) {
        Logger.getLogger(Reports.class.getName()).log(Level.SEVERE, null, ex);
    }

    document.close();

但是当我打开保存的文件(pdf文件)时,我看不到整个图形,我只看到大约60%的图形,所以如何使图形的大小与pdf页面的大小相适应A4 我该如何解决这个问题?!

1 个答案:

答案 0 :(得分:0)

您的代码中存在矛盾。

我明白了:

Document document = new Document(PageSize.A4, 50, 50, 50, 50);

这意味着您正在创建一个大小为595 x 842个用户单位的文档(默认情况下,1个用户单位= 1个点)。

但是,我也看到你创建一个{x}来衡量750 x 750个用户单位:

PdfTemplate

您添加此模板的偏移量为10个用户单位:

PdfTemplate pdfTemplate = cb.createTemplate(750,750);

如何解决这个矛盾?您有两种选择:

选项1:使页面适应您的图形:

我假设您希望每边都有10个用户单位的边距,因此页面的尺寸应该至少为770 x 770个用户单位(750以容纳图像加上10倍两边的边距) 。 在这种情况下,您应该像这样创建文档:

cb.addTemplate(pdfTemplate, 10, 10);

现在,您正在创建一个文档,其中的页面与您要添加的图形大小相对应。

选项2:根据页面大小调整图片大小:

丢掉这段代码:

Document document = new Document(new Rectangle(770, 770));

将其替换为:

cb.saveState();
PdfTemplate pdfTemplate = cb.createTemplate(750,750);
Graphics2D g2 = pdfTemplate.createGraphics(750, 750);
Drawer drawer = new Drawer();
drawer.setSource(new File(jTextField1.getText()));
drawer.paintComponent(g2);
cb.addTemplate(pdfTemplate, 10, 10);
g2.dispose();
cb.restoreState();

如您所见,我们缩放图像,使其测量宽度(和高度)小于页面的20个用户单位。这是因为您的代码表明您希望图像的边距为10个用户单位。现在我们确信图像适合页面(甚至留下至少10个点的边距)。

我们定义PdfTemplate pdfTemplate = cb.createTemplate(750,750); Graphics2D g2 = pdfTemplate.createGraphics(750, 750); Drawer drawer = new Drawer(); drawer.setSource(new File(jTextField1.getText())); drawer.paintComponent(g2); g2.dispose(); Image img = Image.getInstance(pdfTemplate); img.scaleToFit(575, 822); img.setAbsolutePosition(10, 10); document.add(img); 处的绝对位置,这是您在(10, 10)方法中使用的坐标,我们将图像添加到文档中。

不用担心:在addTemplate()对象中包裹PdfTemplate不会栅格化图像。如果模板包含矢量数据,则将保留矢量数据。

相关问题