天天看點

将圖檔和文字寫到pdf檔案中

這裡主要用到了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,如需轉載請自行聯系原作者