這裡主要用到了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;
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);
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));
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) {
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) {
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)
byte brgb[] = new byte[bh.iWidth * 4 * bh.iHeight];
fs.read(brgb, 0, bh.iWidth * 4 * bh.iHeight);
nindex += 4;
public static void main(String[] args) {
String srcfile = "c:\\726.bmp";
String dstFile = "c:\\726.jpg";
bmpTojpg(srcfile, dstFile);
}
來看看插入代碼
import java.io.ByteArrayInputStream;
import java.io.File;
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);
//doc.add(jpg);
str = ((RegisterInfo)object).getChineseName()+" "+((RegisterInfo)object).getEnglishName()+" "+((RegisterInfo)object).getNationality()+" "+((RegisterInfo)object).getIdNum()+" "+((RegisterInfo)object).getDiplomaticTitle();
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);
本文轉自sucre03 51CTO部落格,原文連結:http://blog.51cto.com/sucre/554921,如需轉載請自行聯系原作者