How to print bufferedImage on pdf
Solution 1
You can simply create com.itextpdf.text.Image from java.awt.image.BufferedImage and then render it using standard iText methods:
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 Examples for more details.
Solution 2
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);
Related videos on Youtube
ajay partoti
Updated on September 19, 2022Comments
-
ajay partoti over 1 year
I am working on pdf report application. Using
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:-
Trying to write a bufferedImage on pdf if possible.
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)
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!
-
Gillis Van Ginderachter over 7 yearsInternet Archive has cached it. web.archive.org/web/20141222182518/http://stderr.org/doc/…