这里主要用到了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);