博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
将图片和文字写到pdf文件中
阅读量:6388 次
发布时间:2019-06-23

本文共 8376 字,大约阅读时间需要 27 分钟。

  hot3.png

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

 

本文出自 “” 博客,请务必保留此出处

转载于:https://my.oschina.net/sucre/blog/296131

你可能感兴趣的文章
NSRunLoop Internals
查看>>
Hadoop2.4.1分布式安装
查看>>
PHP利用socket来实现POST数据
查看>>
Connection is read-only问题的产生原因与解决方法
查看>>
Proxmox VE 部署维护
查看>>
Linux软件包安装与卸载
查看>>
centos5.x安装sphinx
查看>>
3分钟搭建Ant Design Pro前端开发环境( MyClouds的前端选型)
查看>>
Scala各种用法
查看>>
Linux系统常用命令(二)
查看>>
简单的工厂模式学习
查看>>
温习如何画E-R图
查看>>
eclispe注释模板
查看>>
Thymeleaf教程 (三) 创建一个多语言的首页
查看>>
OSChina 周六乱弹 ——你们猜狗的舌头有多长
查看>>
OSChina 周日乱弹 —— 爱丽丝爱吃京酱肉丝
查看>>
2018.11月微信小程序优质开源项目
查看>>
IOS 未来几年的认知
查看>>
解决中文乱码--加密
查看>>
浅析全民社交创业梦
查看>>