将图片和文字写到pdf文件中

简介:

这里主要用到了iText包,jar包在附件里面

由于iText目前不支持bmp格式的图片,所以在往pdf里面插入的时候要进行转换。

转换代码

 

 
  1. package com.taiji.lbs.register.util;  
  2.  
  3. import java.awt.Image;  
  4. import java.awt.Toolkit;  
  5. import java.awt.image.BufferedImage;  
  6. import java.awt.image.MemoryImageSource;  
  7. import java.io.FileInputStream;  
  8. import java.io.FileOutputStream;  
  9. import java.io.IOException;  
  10. import com.sun.image.codec.jpeg.JPEGCodec;  
  11. import com.sun.image.codec.jpeg.JPEGImageEncoder;  
  12.  
  13. public class BmpToJpg {  
  14.  
  15.     /**  
  16.      * 图片格式转换 BMP -> JPG  
  17.      * @param file  
  18.      * @param dstFile  
  19.      */ 
  20.     public static void bmpTojpg(String file, String dstFile) {  
  21.         try {  
  22.             FileInputStream in = new FileInputStream(file);  
  23.             Image TheImage = read(in);  
  24.             int wideth = TheImage.getWidth(null);  
  25.             int height = TheImage.getHeight(null);  
  26.             BufferedImage tag = new BufferedImage(wideth, height,BufferedImage.TYPE_INT_RGB);  
  27.             tag.getGraphics().drawImage(TheImage, 00, wideth, height, null);  
  28.             FileOutputStream out = new FileOutputStream(dstFile);  
  29.             JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  
  30.             encoder.encode(tag);  
  31.             out.close();  
  32.         } catch (Exception e) {  
  33.             System.out.println(e);  
  34.         }  
  35.     }  
  36.  
  37.     public static int constructInt(byte[] in, int offset) {  
  38.         int ret = ((int) in[offset + 3] & 0xff);  
  39.         ret = (ret << 8) | ((int) in[offset + 2] & 0xff);  
  40.         ret = (ret << 8) | ((int) in[offset + 1] & 0xff);  
  41.         ret = (ret << 8) | ((int) in[offset + 0] & 0xff);  
  42.         return (ret);  
  43.     }  
  44.  
  45.     public static int constructInt3(byte[] in, int offset) {  
  46.         int ret = 0xff;  
  47.         ret = (ret << 8) | ((int) in[offset + 2] & 0xff);  
  48.         ret = (ret << 8) | ((int) in[offset + 1] & 0xff);  
  49.         ret = (ret << 8) | ((int) in[offset + 0] & 0xff);  
  50.         return (ret);  
  51.     }  
  52.  
  53.     public static long constructLong(byte[] in, int offset) {  
  54.         long ret = ((long) in[offset + 7] & 0xff);  
  55.         ret |= (ret << 8) | ((long) in[offset + 6] & 0xff);  
  56.         ret |= (ret << 8) | ((long) in[offset + 5] & 0xff);  
  57.         ret |= (ret << 8) | ((long) in[offset + 4] & 0xff);  
  58.         ret |= (ret << 8) | ((long) in[offset + 3] & 0xff);  
  59.         ret |= (ret << 8) | ((long) in[offset + 2] & 0xff);  
  60.         ret |= (ret << 8) | ((long) in[offset + 1] & 0xff);  
  61.         ret |= (ret << 8) | ((long) in[offset + 0] & 0xff);  
  62.         return (ret);  
  63.     }  
  64.  
  65.     public static double constructDouble(byte[] in, int offset) {  
  66.         long ret = constructLong(in, offset);  
  67.         return (Double.longBitsToDouble(ret));  
  68.     }  
  69.  
  70.     public static short constructShort(byte[] in, int offset) {  
  71.         short ret = (short) ((short) in[offset + 1] & 0xff);  
  72.         ret = (short) ((ret << 8) | (short) ((short) in[offset + 0] & 0xff));  
  73.         return (ret);  
  74.     }  
  75.  
  76.     static class BitmapHeader {  
  77.         public int iSize, ibiSize, iWidth, iHeight, iPlanes, iBitcount,  
  78.                 iCompression, iSizeimage, iXpm, iYpm, iClrused, iClrimp;  
  79.  
  80.         // 读取bmp文件头信息  
  81.         public void read(FileInputStream fs) throws IOException {  
  82.             final int bflen = 14;  
  83.             byte bf[] = new byte[bflen];  
  84.             fs.read(bf, 0, bflen);  
  85.             final int bilen = 40;  
  86.             byte bi[] = new byte[bilen];  
  87.             fs.read(bi, 0, bilen);  
  88.             iSize = constructInt(bf, 2);  
  89.             ibiSize = constructInt(bi, 2);  
  90.             iWidth = constructInt(bi, 4);  
  91.             iHeight = constructInt(bi, 8);  
  92.             iPlanes = constructShort(bi, 12);  
  93.             iBitcount = constructShort(bi, 14);  
  94.             iCompression = constructInt(bi, 16);  
  95.             iSizeimage = constructInt(bi, 20);  
  96.             iXpm = constructInt(bi, 24);  
  97.             iYpm = constructInt(bi, 28);  
  98.             iClrused = constructInt(bi, 32);  
  99.             iClrimp = constructInt(bi, 36);  
  100.         }  
  101.     }  
  102.  
  103.     public static Image read(FileInputStream fs) {  
  104.         try {  
  105.             BitmapHeader bh = new BitmapHeader();  
  106.             bh.read(fs);  
  107.             if (bh.iBitcount == 24) {  
  108.                 return (readImage24(fs, bh));  
  109.             }  
  110.             if (bh.iBitcount == 32) {  
  111.                 return (readImage32(fs, bh));  
  112.             }  
  113.             fs.close();  
  114.         } catch (IOException e) {  
  115.             System.out.println(e);  
  116.         }  
  117.         return (null);  
  118.     }  
  119.  
  120.     // 24位  
  121.     protected static Image readImage24(FileInputStream fs, BitmapHeader bh)  
  122.             throws IOException {  
  123.         Image image;  
  124.         if (bh.iSizeimage == 0) {  
  125.             bh.iSizeimage = ((((bh.iWidth * bh.iBitcount) + 31) & ~31) >> 3);  
  126.             bh.iSizeimage *= bh.iHeight;  
  127.         }  
  128.         int npad = (bh.iSizeimage / bh.iHeight) - bh.iWidth * 3;  
  129.         int ndata[] = new int[bh.iHeight * bh.iWidth];  
  130.         byte brgb[] = new byte[(bh.iWidth + npad) * 3 * bh.iHeight];  
  131.         fs.read(brgb, 0, (bh.iWidth + npad) * 3 * bh.iHeight);  
  132.         int nindex = 0;  
  133.         for (int j = 0; j < bh.iHeight; j++) {  
  134.             for (int i = 0; i < bh.iWidth; i++) {  
  135.                 ndata[bh.iWidth * (bh.iHeight - j - 1) + i] = constructInt3(  
  136.                         brgb, nindex);  
  137.                 nindex += 3;  
  138.             }  
  139.             nindex += npad;  
  140.         }  
  141.         image = Toolkit.getDefaultToolkit().createImage(  
  142.                 new MemoryImageSource(bh.iWidth, bh.iHeight, ndata, 0,  
  143.                         bh.iWidth));  
  144.         fs.close();  
  145.         return (image);  
  146.     }  
  147.  
  148.     // 32位  
  149.     protected static Image readImage32(FileInputStream fs, BitmapHeader bh)  
  150.             throws IOException {  
  151.         Image image;  
  152.         int ndata[] = new int[bh.iHeight * bh.iWidth];  
  153.         byte brgb[] = new byte[bh.iWidth * 4 * bh.iHeight];  
  154.         fs.read(brgb, 0, bh.iWidth * 4 * bh.iHeight);  
  155.         int nindex = 0;  
  156.         for (int j = 0; j < bh.iHeight; j++) {  
  157.             for (int i = 0; i < bh.iWidth; i++) {  
  158.                 ndata[bh.iWidth * (bh.iHeight - j - 1) + i] = constructInt3(  
  159.                         brgb, nindex);  
  160.                 nindex += 4;  
  161.             }  
  162.         }  
  163.         image = Toolkit.getDefaultToolkit().createImage(  
  164.                 new MemoryImageSource(bh.iWidth, bh.iHeight, ndata, 0,  
  165.                         bh.iWidth));  
  166.         fs.close();  
  167.         return (image);  
  168.     }  
  169.  
  170.     public static void main(String[] args) {  
  171.         String srcfile = "c:\\726.bmp";  
  172.         String dstFile = "c:\\726.jpg";  
  173.         bmpTojpg(srcfile, dstFile);  
  174.     }  
  175.  
  176. }  

来看看插入代码

 

 
  1. package com.taiji.lbs.register.util;  
  2.  
  3. import java.io.ByteArrayInputStream;  
  4. import java.io.File;  
  5. import java.io.FileOutputStream;  
  6. import java.io.InputStream;  
  7. import java.util.List;  
  8.  
  9. import com.lowagie.text.Document;  
  10. import com.lowagie.text.DocumentException;  
  11. import com.lowagie.text.Image;  
  12. import com.lowagie.text.Paragraph;  
  13. import com.lowagie.text.pdf.BaseFont;  
  14. import com.lowagie.text.pdf.PdfWriter;  
  15. import com.taiji.core.util.ApplicationPath;  
  16. import com.taiji.core.util.PaginationSupport;  
  17. import com.taiji.lbs.register.hibernate.model.Picture;  
  18. import com.taiji.lbs.register.hibernate.model.RegisterInfo;  
  19.  
  20. public class CreatePDF {  
  21.     /**  
  22.      * 创建pdf将用户信息放入其中  
  23.      * 乔磊  
  24.      * @param list  
  25.      * @throws DocumentException   
  26.      * @throws Exception   
  27.      */ 
  28.     public static void createPDF(PaginationSupport list) throws Exception, DocumentException{  
  29.         //导出成pdf  
  30.         List pdfList = list.getItems();  
  31.         String picName = "";  
  32.         String picNameDst = "";//将bmp图片转换成jpg格式  
  33.         String str = "";  
  34.         String rootPath = ApplicationPath.getRootPath().replaceAll("\\\\","\\\\\\\\");// 获得绝对地址 服务器的  
  35.         //建立一个文档对象  
  36.          Document doc = new Document();  
  37.          PdfWriter.getInstance(doc, new FileOutputStream("c:/hello.pdf"));  
  38.         // 打开文档对象  
  39.         doc.open();  
  40.         //根据经验,建议使用windos自带字体  
  41.         BaseFont basefont;  
  42.         com.lowagie.text.Font   FontChinese ;  
  43.         basefont = BaseFont.createFont("c:\\windows\\fonts\\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);  
  44.         FontChinese   =   new   com.lowagie.text.Font(basefont);     
  45.         for (Object object : pdfList) {  
  46.             Picture pic = ((RegisterInfo)object).getPicture();  
  47.             if (pic != null) {  
  48.                 picName = String.valueOf(pic.getId() + ".bmp");  
  49.                 picNameDst = String.valueOf(pic.getId() + ".jpg");  
  50.                 File filePic = new File(rootPath + "\\photo\\" + picName);  
  51.                 FileOutputStream output;  
  52.                 output = new FileOutputStream(filePic);  
  53.                 byte buffer[] = null;  
  54.                 if (pic.getPhoto() != null) {  
  55.                     buffer = pic.getPhoto();  
  56.                     InputStream in = new ByteArrayInputStream(buffer);  
  57.                     int len;  
  58.                     while ((len = in.read(buffer)) > 0) {  
  59.                         output.write(buffer, 0, len);  
  60.                     }  
  61.                     output.close();  
  62.                     in.close();  
  63.                 } else {  
  64.                     picName = null;  
  65.                 }  
  66.             }  
  67.             BmpToJpg.bmpTojpg(rootPath + "\\photo\\" + picName, rootPath + "\\photo\\" + picNameDst);  
  68.             //加用户头像  
  69.             Image jpg = Image.getInstance(rootPath + "\\photo\\" + picNameDst);  
  70.             jpg.setAlignment(Image.ALIGN_LEFT);  
  71.             doc.add(jpg);  
  72.             //加用户信息  
  73.             str = ((RegisterInfo)object).getId()+":"+((RegisterInfo)object).getIdNum();  
  74.             Paragraph tt = new Paragraph(str, FontChinese);  
  75.             tt.setAlignment(Paragraph.ALIGN_CENTER);  
  76.             doc.add(tt);  
  77.         }  
  78.         //释放文档对象     
  79.         doc.close();  
  80.     }  
  81. }  

这样就完成了图片格式转换和插入了。

===============================================================

先前的那个例子图片和文本容易分离,为了更美观一些将图片和文本放到一个表格里面,修改部分代码如下

 
  1. BmpToJpg.bmpTojpg(rootPath + "\\photo\\" + picName, rootPath + "\\photo\\" + picNameDst);  
  2.             //加用户头像  
  3.             Image jpg = Image.getInstance(rootPath + "\\photo\\" + picNameDst);  
  4.             jpg.setAlignment(Image.ALIGN_LEFT);  
  5.             //doc.add(jpg);  
  6.             //加用户信息  
  7.             str = ((RegisterInfo)object).getChineseName()+" "+((RegisterInfo)object).getEnglishName()+" "+((RegisterInfo)object).getNationality()+" "+((RegisterInfo)object).getIdNum()+" "+((RegisterInfo)object).getDiplomaticTitle();  
  8.             Paragraph tt = new Paragraph(str, FontChinese);  
  9.             tt.setAlignment(Paragraph.ALIGN_RIGHT);  
  10.             //doc.add(tt);  
  11.               
  12.               
  13.             //创建一个有1列的表格  
  14.             PdfPTable table = new PdfPTable(1);  
  15.             //定义一个表格单元  
  16.             PdfPCell cell = new PdfPCell(jpg);  
  17.             //把单元加到表格中  
  18.             table.addCell(cell);  
  19.             //重新定义单元格  
  20.             PdfPCell cellText = new PdfPCell(tt);  
  21.             //增加到表格上  
  22.             table.addCell(cellText);  
  23.             //增加到文档中  
  24.             doc.add(table); 

 本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/554921,如需转载请自行联系原作者

相关文章
|
12小时前
|
前端开发 Python
我们从`reportlab.pdfgen`模块中导入了`canvas`。这个模块提供了创建PDF文件所需的基本功能。
我们从`reportlab.pdfgen`模块中导入了`canvas`。这个模块提供了创建PDF文件所需的基本功能。
5 0
|
16天前
|
移动开发 JavaScript 前端开发
必知的技术知识:JqueryMedia插件使用,解决在线预览及打开PDF文件
必知的技术知识:JqueryMedia插件使用,解决在线预览及打开PDF文件
|
16天前
|
IDE Java 编译器
使用Java分割PDF文件
使用Java分割PDF文件
23 1
|
17天前
在线免费压缩pdf文件
在线免费压缩pdf文件
18 0
|
20天前
|
XML Java 数据格式
Java用xpdf库获取pdf文件的指定范围文本内容
Java用xpdf库获取pdf文件的指定范围文本内容
24 1
|
1月前
|
编解码 文字识别
印刷文字识别操作报错合集之在尝试将PDF文件转换为图片时出现了问题,具体的错误代码是415,该怎么处理
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
1月前
|
文字识别 开发工具 数据安全/隐私保护
印刷文字识别产品使用合集之可以识别一张电子发票有多页(多张图片,或者一个PDF文件)的这种发票吗
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
分享:批量多目录图片如何转换PDF,一次性转换多级目录批量的PDF的转换,合并,输出另存等问题,图片转PDF文件,批量图片转PDF文件,多级目录的图片转PDF文件,并且保存到不同的地方,全部搞定
本文介绍了如何高效地将图片转换为PDF,包括单张、多张及多级目录下的图片转换和合并。提供了软件下载链接(百度网盘、腾讯云盘),软件操作简便,支持保存原目录或自定义新目录。转换选项包括单个文件、多个文件夹单独转换以及合并转换。用户可通过双击路径访问源图片和转换结果。该工具特别解决了多级目录图片批量转换的难题,实现保存地址的自由设定,满足不同业务需求。
|
2月前
|
Windows
推荐:如何批量根据PDF文件名批量查找PDF文件,复制到指定地方保存,通过文件名批量复制文件,按照文件名批量复制文件,根据文件名批量提取文件
该文介绍了一个批量查找PDF文件(不限于找PDF)的工具,用于在多级文件夹中快速查找并复制特定文件。通过下载提供的软件,用户可以加载PDF库,输入文件名列表,设置操作参数(如保存路径、复制或删除)及搜索模式。软件能高效执行,例如在1.1秒内完成对数千文件中的37个目标文件的复制,显著提升了工作效率,避免了手动逐个查找和复制的繁琐。
|
2月前
|
Java Apache
Java将word、excel文件转成pdf文件
【5月更文挑战第26天】Java将word、excel文件转成pdf文件
305 1