这里主要用到了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 {
-
-
-
-
-
-
-
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;
-
-
-
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);
- }
-
-
-
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);
- }
-
-
-
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 {
-
-
-
-
-
-
-
-
public static void createPDF(PaginationSupport list) throws Exception, DocumentException{
-
- List pdfList = list.getItems();
-
String picName = "";
-
String picNameDst = "";
-
String str = "";
-
String rootPath = ApplicationPath.getRootPath().replaceAll("\\\\","\\\\\\\\");
-
-
Document doc = new Document();
-
PdfWriter.getInstance(doc, new FileOutputStream("c:/hello.pdf"));
-
- doc.open();
-
- 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);
-
-
-
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);
-
-
-
-
-
PdfPTable table = new PdfPTable(1);
-
-
PdfPCell cell = new PdfPCell(jpg);
-
- table.addCell(cell);
-
-
PdfPCell cellText = new PdfPCell(tt);
-
- table.addCell(cellText);
-
- doc.add(table);
本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/554921,如需转载请自行联系原作者