java 如何在pdf上打印bufferedImage

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12956844/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 10:57:53  来源:igfitidea点击:

How to print bufferedImage on pdf

javaswingpdfgraphicsitext

提问by ajay partoti

I am working on pdf report application. Using

我正在处理 pdf 报告应用程序。使用

itext 5.3.3.jar jdk 1.6

itext 5.3.3.jar jdk 1.6

I am trying to print JTable on the pdf. I got the JTable image correctly, but unable to get the image on pdf. Is their anyway I can print the BufferedImage on the pdf. I used the below code for it:-

我正在尝试在 pdf 上打印 JTable。我正确获得了 JTable 图像,但无法获得 pdf 格式的图像。无论如何我可以在pdf上打印BufferedImage。我使用了以下代码:-

Trying to write a bufferedImage on pdf if possible.

如果可能,尝试在 pdf 上写一个 bufferedImage。

private static void print(BufferedImage bi,JTable table) { 
    Document document = new Document(PageSize.A4.rotate()); 
    try { 
      PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("F:/jTable.pdf")); 

      document.open(); 
      PdfContentByte cb = writer.getDirectContent(); 
      PdfTemplate pdfTemplate = cb.createTemplate(table.getWidth(), table.getHeight()); 
      Image image = Image.getInstance(bi , null); 
      image.scaleToFit(table.getWidth(), table.getHeight()); 
      table.addNotify();
      table.validate();
      Graphics2D g2 = pdfTemplate.createGraphics(table.getWidth(), table.getHeight()); 
      table.print(g2);
      pdfTemplate.addImage(image); 
      /*g2.setColor(Color.BLACK); 
      g2.drawRect(x-2, y-2, table.getWidth()+2, table.getHeight()+2);*/ 
      //table.print(g2); 

      cb.addTemplate(pdfTemplate, 0,20); 



    } catch (Exception e) { 
      System.err.println(e.getMessage()); 
    } 
    document.close(); 
  } 

But it shows me something like below:-

但它向我展示了如下内容:-

The image must have absolute positioning. Exception in thread "main" com.itextpdf.text.exceptions.IllegalPdfSyntaxException: Unbalanced save/restore state operators. at com.itextpdf.text.pdf.PdfContentByte.sanityCheck(PdfContentByte.java:3083) at com.itextpdf.text.pdf.PdfContentByte.toPdf(PdfContentByte.java:248) at com.itextpdf.text.pdf.PdfFormXObject.(PdfFormXObject.java:88) at com.itextpdf.text.pdf.PdfTemplate.getFormXObject(PdfTemplate.java:247) at com.itextpdf.text.pdf.PdfWriter.addXFormsToBody(PdfWriter.java:1293) at com.itextpdf.text.pdf.PdfWriter.addSharedObjectsToBody(PdfWriter.java:1304) at com.itextpdf.text.pdf.PdfWriter.close(PdfWriter.java:1209) at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:768) at com.itextpdf.text.Document.close(Document.java:398) at com.swing.data.TableImage.print(TableImage.java:102) at com.swing.data.TableImage.main(TableImage.java:52)

图像必须具有绝对定位。线程“main”com.itextpdf.text.exceptions.IllegalPdfSyntaxException 中的异常:不平衡的保存/恢复状态运算符。在 com.itextpdf.text.pdf.PdfContentByte.sanityCheck(PdfContentByte.java:3083) 在 com.itextpdf.text.pdf.PdfContentByte.toPdf(PdfContentByte.java:248) 在 com.itextpdf.text.pdf.PdfFormXObject.( PdfFormXObject.java:88) 在 com.itextpdf.text.pdf.PdfTemplate.getFormXObject(PdfTemplate.java:247) 在 com.itextpdf.text.pdf.PdfWriter.addXFormsToBody(PdfWriter.java:1293) 在 com.itextpdf.text .pdf.PdfWriter.addSharedObjectsToBody(PdfWriter.java:1304) at com.itextpdf.text.pdf.PdfWriter.close(PdfWriter.java:1209) at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:768) ) 在 com.itextpdf.text.Document.close(Document.java:398) 在 com.swing.data。

Following is the code for testing:-

以下是测试代码:-

package com.swing.data;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.JTableHeader;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;



class TableImage {
    BufferedImage bi = null;
    public static void main(String[] args) throws Exception {
        Object[][] data = {
            {"Hari", new Integer(23), new Double(78.23), (true)},
            {"James", new Integer(23), new Double(47.64), (false)},
            {"Sally", new Integer(22), new Double(84.81), (true)}
        };
        String[] columns = {"Name", "Age", "GPA", "Pass"};
        JTable table = new JTable(data, columns);
        JScrollPane scroll = new JScrollPane(table);
        JPanel p = new JPanel(new BorderLayout());
        p.add(scroll, BorderLayout.CENTER);
        JOptionPane.showMessageDialog(null, p);
        JTableHeader h = table.getTableHeader();
        int x = table.getWidth();
        int y = table.getHeight();
        table.setIntercellSpacing(new Dimension(0,0));
        table.setDefaultRenderer(Object.class, new ColumnAlignmentRenderer(table.getDefaultRenderer(Object.class)));
        BufferedImage bi = new BufferedImage(
                x, y, BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.createGraphics();
        Graphics2D g2 = (Graphics2D) g;
        table.paint(g2);
        JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(bi)));
        print(bi,table);
        //createPdf(true,table);
    }
   private static void print(BufferedImage bi,JTable table) { 
        Document document = new Document(PageSize.A4.rotate()); 
        try { 
          PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("F:/jTable.pdf")); 

          document.open(); 
          PdfContentByte cb = writer.getDirectContent(); 
          PdfTemplate pdfTemplate = cb.createTemplate(table.getWidth(), table.getHeight()); 
          Image image = Image.getInstance(bi , null); 
          image.scaleToFit(table.getWidth(), table.getHeight()); 
          table.addNotify();
          table.validate();
          Graphics2D g2 = pdfTemplate.createGraphics(table.getWidth(), table.getHeight()); 
          table.print(g2);
          pdfTemplate.addImage(image); 
          /*g2.setColor(Color.BLACK); 
          g2.drawRect(x-2, y-2, table.getWidth()+2, table.getHeight()+2);*/ 
          //table.print(g2); 

          cb.addTemplate(pdfTemplate, 0,20); 



        } catch (Exception e) { 
          System.err.println(e.getMessage()); 
        } 
        document.close(); 
      } 
     private TableImage() {
    }
}

Thanks!

谢谢!

回答by lu_ko

You can simply create com.itextpdf.text.Imagefrom java.awt.image.BufferedImageand then render it using standard iText methods:

您可以简单地从java.awt.image.BufferedImage创建com.itextpdf.text.Image,然后使用标准的 iText 方法渲染它:

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import javax.imageio.ImageIO;
import com.itextpdf.text.Image;

BufferedImage bufferedImage = ...
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", baos);
Image iTextImage = Image.getInstance(baos.toByteArray());

See iText Image Examplesfor more details.

有关更多详细信息,请参阅iText 图像示例

回答by Mike_NotGuilty

I found a solution:

我找到了一个解决方案:

        Document document = new Document();

        PdfWriter writer = PdfWriter.getInstance(document,
                               new FileOutputStream("Image.pdf"));
        document.open();

        PdfContentByte pdfCB = new PdfContentByte(writer);
        Image image = Image.getInstance(pdfCB, bufferedImage, 1);

回答by CodeChimp

I found this. Seems to explain how to do Absolute Positioning. I would guess that you would need to do that.

我找到了这个。似乎解释了如何进行绝对定位。我猜你需要这样做。