这里主要用到了iText包,jar包在附件里面
由于iText目前不支持bmp格式的图片,所以在往pdf里面插入的时候要进行转换。
转换代码
package com.taiji.lbs.register.util; import java.awt.Image; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.awt.image.MemoryImageSource; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; public class BmpToJpg { /** * 图片格式转换 BMP -> JPG * @param file * @param dstFile */ public static void bmpTojpg(String file, String dstFile) { try { FileInputStream in = new FileInputStream(file); Image TheImage = read(in); int wideth = TheImage.getWidth(null); int height = TheImage.getHeight(null); BufferedImage tag = new BufferedImage(wideth, height,BufferedImage.TYPE_INT_RGB); tag.getGraphics().drawImage(TheImage, 0, 0, wideth, height, null); FileOutputStream out = new FileOutputStream(dstFile); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(tag); out.close(); } catch (Exception e) { System.out.println(e); } } public static int constructInt(byte[] in, int offset) { int ret = ((int) in[offset + 3] & 0xff); ret = (ret << 8) | ((int) in[offset + 2] & 0xff); ret = (ret << 8) | ((int) in[offset + 1] & 0xff); ret = (ret << 8) | ((int) in[offset + 0] & 0xff); return (ret); } public static int constructInt3(byte[] in, int offset) { int ret = 0xff; ret = (ret << 8) | ((int) in[offset + 2] & 0xff); ret = (ret << 8) | ((int) in[offset + 1] & 0xff); ret = (ret << 8) | ((int) in[offset + 0] & 0xff); return (ret); } public static long constructLong(byte[] in, int offset) { long ret = ((long) in[offset + 7] & 0xff); ret |= (ret << 8) | ((long) in[offset + 6] & 0xff); ret |= (ret << 8) | ((long) in[offset + 5] & 0xff); ret |= (ret << 8) | ((long) in[offset + 4] & 0xff); ret |= (ret << 8) | ((long) in[offset + 3] & 0xff); ret |= (ret << 8) | ((long) in[offset + 2] & 0xff); ret |= (ret << 8) | ((long) in[offset + 1] & 0xff); ret |= (ret << 8) | ((long) in[offset + 0] & 0xff); return (ret); } public static double constructDouble(byte[] in, int offset) { long ret = constructLong(in, offset); return (Double.longBitsToDouble(ret)); } public static short constructShort(byte[] in, int offset) { short ret = (short) ((short) in[offset + 1] & 0xff); ret = (short) ((ret << 8) | (short) ((short) in[offset + 0] & 0xff)); return (ret); } static class BitmapHeader { public int iSize, ibiSize, iWidth, iHeight, iPlanes, iBitcount, iCompression, iSizeimage, iXpm, iYpm, iClrused, iClrimp; // 读取bmp文件头信息 public void read(FileInputStream fs) throws IOException { final int bflen = 14; byte bf[] = new byte[bflen]; fs.read(bf, 0, bflen); final int bilen = 40; byte bi[] = new byte[bilen]; fs.read(bi, 0, bilen); iSize = constructInt(bf, 2); ibiSize = constructInt(bi, 2); iWidth = constructInt(bi, 4); iHeight = constructInt(bi, 8); iPlanes = constructShort(bi, 12); iBitcount = constructShort(bi, 14); iCompression = constructInt(bi, 16); iSizeimage = constructInt(bi, 20); iXpm = constructInt(bi, 24); iYpm = constructInt(bi, 28); iClrused = constructInt(bi, 32); iClrimp = constructInt(bi, 36); } } public static Image read(FileInputStream fs) { try { BitmapHeader bh = new BitmapHeader(); bh.read(fs); if (bh.iBitcount == 24) { return (readImage24(fs, bh)); } if (bh.iBitcount == 32) { return (readImage32(fs, bh)); } fs.close(); } catch (IOException e) { System.out.println(e); } return (null); } // 24位 protected static Image readImage24(FileInputStream fs, BitmapHeader bh) throws IOException { Image image; if (bh.iSizeimage == 0) { bh.iSizeimage = ((((bh.iWidth * bh.iBitcount) + 31) & ~31) >> 3); bh.iSizeimage *= bh.iHeight; } int npad = (bh.iSizeimage / bh.iHeight) - bh.iWidth * 3; int ndata[] = new int[bh.iHeight * bh.iWidth]; byte brgb[] = new byte[(bh.iWidth + npad) * 3 * bh.iHeight]; fs.read(brgb, 0, (bh.iWidth + npad) * 3 * bh.iHeight); int nindex = 0; for (int j = 0; j < bh.iHeight; j++) { for (int i = 0; i < bh.iWidth; i++) { ndata[bh.iWidth * (bh.iHeight - j - 1) + i] = constructInt3( brgb, nindex); nindex += 3; } nindex += npad; } image = Toolkit.getDefaultToolkit().createImage( new MemoryImageSource(bh.iWidth, bh.iHeight, ndata, 0, bh.iWidth)); fs.close(); return (image); } // 32位 protected static Image readImage32(FileInputStream fs, BitmapHeader bh) throws IOException { Image image; int ndata[] = new int[bh.iHeight * bh.iWidth]; byte brgb[] = new byte[bh.iWidth * 4 * bh.iHeight]; fs.read(brgb, 0, bh.iWidth * 4 * bh.iHeight); int nindex = 0; for (int j = 0; j < bh.iHeight; j++) { for (int i = 0; i < bh.iWidth; i++) { ndata[bh.iWidth * (bh.iHeight - j - 1) + i] = constructInt3( brgb, nindex); nindex += 4; } } image = Toolkit.getDefaultToolkit().createImage( new MemoryImageSource(bh.iWidth, bh.iHeight, ndata, 0, bh.iWidth)); fs.close(); return (image); } public static void main(String[] args) { String srcfile = "c:\\726.bmp"; String dstFile = "c:\\726.jpg"; bmpTojpg(srcfile, dstFile); } }
来看看插入代码
package com.taiji.lbs.register.util; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.List; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Image; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.PdfWriter; import com.taiji.core.util.ApplicationPath; import com.taiji.core.util.PaginationSupport; import com.taiji.lbs.register.hibernate.model.Picture; import com.taiji.lbs.register.hibernate.model.RegisterInfo; public class CreatePDF { /** * 创建pdf将用户信息放入其中 * 乔磊 * @param list * @throws DocumentException * @throws Exception */ public static void createPDF(PaginationSupport list) throws Exception, DocumentException{ //导出成pdf List pdfList = list.getItems(); String picName = ""; String picNameDst = "";//将bmp图片转换成jpg格式 String str = ""; String rootPath = ApplicationPath.getRootPath().replaceAll("\\\\","\\\\\\\\");// 获得绝对地址 服务器的 //建立一个文档对象 Document doc = new Document(); PdfWriter.getInstance(doc, new FileOutputStream("c:/hello.pdf")); // 打开文档对象 doc.open(); //根据经验,建议使用windos自带字体 BaseFont basefont; com.lowagie.text.Font FontChinese ; basefont = BaseFont.createFont("c:\\windows\\fonts\\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); FontChinese = new com.lowagie.text.Font(basefont); for (Object object : pdfList) { Picture pic = ((RegisterInfo)object).getPicture(); if (pic != null) { picName = String.valueOf(pic.getId() + ".bmp"); picNameDst = String.valueOf(pic.getId() + ".jpg"); File filePic = new File(rootPath + "\\photo\\" + picName); FileOutputStream output; output = new FileOutputStream(filePic); byte buffer[] = null; if (pic.getPhoto() != null) { buffer = pic.getPhoto(); InputStream in = new ByteArrayInputStream(buffer); int len; while ((len = in.read(buffer)) > 0) { output.write(buffer, 0, len); } output.close(); in.close(); } else { picName = null; } } BmpToJpg.bmpTojpg(rootPath + "\\photo\\" + picName, rootPath + "\\photo\\" + picNameDst); //加用户头像 Image jpg = Image.getInstance(rootPath + "\\photo\\" + picNameDst); jpg.setAlignment(Image.ALIGN_LEFT); doc.add(jpg); //加用户信息 str = ((RegisterInfo)object).getId()+":"+((RegisterInfo)object).getIdNum(); Paragraph tt = new Paragraph(str, FontChinese); tt.setAlignment(Paragraph.ALIGN_CENTER); doc.add(tt); } //释放文档对象 doc.close(); } }
这样就完成了图片格式转换和插入了。
===============================================================
先前的那个例子图片和文本容易分离,为了更美观一些将图片和文本放到一个表格里面,修改部分代码如下
BmpToJpg.bmpTojpg(rootPath + "\\photo\\" + picName, rootPath + "\\photo\\" + picNameDst); //加用户头像 Image jpg = Image.getInstance(rootPath + "\\photo\\" + picNameDst); jpg.setAlignment(Image.ALIGN_LEFT); //doc.add(jpg); //加用户信息 str = ((RegisterInfo)object).getChineseName()+" "+((RegisterInfo)object).getEnglishName()+" "+((RegisterInfo)object).getNationality()+" "+((RegisterInfo)object).getIdNum()+" "+((RegisterInfo)object).getDiplomaticTitle(); Paragraph tt = new Paragraph(str, FontChinese); tt.setAlignment(Paragraph.ALIGN_RIGHT); //doc.add(tt); //创建一个有1列的表格 PdfPTable table = new PdfPTable(1); //定义一个表格单元 PdfPCell cell = new PdfPCell(jpg); //把单元加到表格中 table.addCell(cell); //重新定义单元格 PdfPCell cellText = new PdfPCell(tt); //增加到表格上 table.addCell(cellText); //增加到文档中 doc.add(table);
本文出自 “” 博客,请务必保留此出处