itext做PDF導出

項目要做PDF導出數據,還要實現點擊在瀏覽器上下載的效果!於是去網上找有沒有什麼前人寫好的工具包拿過來用,一看果然還是有的!我這邊就直接貼我的實現代碼吧,反正都是百度的!

導入依賴:

		<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.5.13</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itext-asian</artifactId>
			<version>5.2.0</version>
		</dependency>

工具類:

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.jeecg.wx.entity.WxDeliveryRecordEntity;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.List;

public class PdfReportUtils {
    public static void exportPdf(HttpServletResponse response,List<WxDeliveryRecordEntity> list) {
        //1,創建文檔對象
        Document document = new Document(PageSize.A2);
        //2,監聽輸出流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        OutputStream out = null;
        try {
            PdfWriter.getInstance(document, baos);
            //3,打開文檔
            document.open();
            //4,添加文本
            Paragraph paragraph = new Paragraph();
//            document.add(new Paragraph("pdf渲染好的文本",fontChinese));
            paragraph.setAlignment(1); //設置文字居中 0靠左   1,居中     2,靠右
            paragraph.setIndentationLeft(12); //設置左縮進
            paragraph.setIndentationRight(12); //設置右縮進
            paragraph.setFirstLineIndent(24); //設置首行縮進
            paragraph.setLeading(20f); //行間距
            paragraph.setSpacingBefore(5f); //設置段落上空白
            paragraph.setSpacingAfter(10f); //設置段落下空白

            // 表格
            PdfPTable table = createTable(new float[]{60, 40, 40, 40, 50, 60, 60, 120, 40});
            table.addCell(createCell("商品名稱", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品單價", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品數量", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品總價", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品優惠價", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品優惠後總價", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品支付金額", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("交易時間", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("交易狀態", keyfont, Element.ALIGN_CENTER));
            for (WxDeliveryRecordEntity entity : list) {
                table.addCell(createCell(entity.getShopName(), textfont));
                table.addCell(createCell(entity.getShopPrice().toString(), textfont));
                table.addCell(createCell(entity.getShopNum().toString(), textfont));
                table.addCell(createCell(entity.getShopTotalPrice().toString(), textfont));
                table.addCell(createCell(entity.getShopDiscountPrice().toString(), textfont));
                table.addCell(createCell(entity.getShopNewPrice().toString(), textfont));
                table.addCell(createCell(entity.getShopPayPrice().toString(), textfont));
                table.addCell(createCell(entity.getShopDeliveryTime().toString(), textfont));
                switch (entity.getShopDeliveryFlag()) {
                    case 1:
                        table.addCell(createCell("交易正常", textfont));
                        break;
                    case 2:
                        table.addCell(createCell("退單", textfont));
                        break;
                    case 3:
                        table.addCell(createCell("交易異常", textfont));
                        break;
                }
            }
//            paragraph.add(table);
            document.add(paragraph);
            document.add(table);
//            PdfReportUtils.generatePDF(document, list);
            //5,關閉文檔
            document.close();
            //6,設置請求返回類型
            response.setContentType("application/pdf");
            response.setHeader("Content-Disposition", "attachment; filename=shopRecord.pdf");
            response.setContentLength(baos.size());
            out = response.getOutputStream();
            baos.writeTo(out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        } /*finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }*/
    }

    // 定義全局的字體靜態變量
    private static Font titlefont;
    private static Font headfont;
    private static Font keyfont;
    private static Font textfont;
    // 最大寬度
    private static int maxWidth = 650;
    static {
        try {
            // 不同字體(這裏定義爲同一種字體:包含不同字號、不同style)
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            titlefont = new Font(bfChinese, 16, Font.BOLD);
            headfont = new Font(bfChinese, 14, Font.BOLD);
            keyfont = new Font(bfChinese, 10, Font.BOLD);
            textfont = new Font(bfChinese, 10, Font.NORMAL);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static PdfPCell createCell(String value, Font font) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setPhrase(new Phrase(value, font));
        return cell;
    }

    /**
     * 創建單元格(指定字體、水平..)
     *
     * @param value
     * @param font
     * @param align
     * @return
     */
    public static PdfPCell createCell(String value, Font font, int align) {
        PdfPCell cell = new PdfPCell();
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(align);
        cell.setPhrase(new Phrase(value, font));
        return cell;
    }

    /**
     * 創建默認列寬,指定列數、水平(居中、右、左)的表格
     *
     * @param colNumber
     * @param align
     * @return
     */
    public PdfPTable createTable(int colNumber, int align) {
        PdfPTable table = new PdfPTable(colNumber);
        try {
            table.setTotalWidth(maxWidth);
            table.setLockedWidth(true);
            table.setHorizontalAlignment(align);
            table.getDefaultCell().setBorder(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return table;
    }

    /**
     * 創建指定列寬、列數的表格
     *
     * @param widths
     * @return
     */
    public static PdfPTable createTable(float[] widths) {
        PdfPTable table = new PdfPTable(widths);
        try {
            table.setTotalWidth(maxWidth);
            table.setLockedWidth(true);
            table.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.getDefaultCell().setBorder(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return table;
    }
}

總結一下,我是抄了兩篇博客再加上我自己以前用poi做Excel導出的一些思想邏輯!首先我是要做類似於表格那樣的導出,但是客戶需求要導出成PDF的。所以要先畫表格!

PdfPTable table = createTable(new float[]{60, 40, 40, 40, 50, 60, 60, 120, 40});
            table.addCell(createCell("商品名稱", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品單價", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品數量", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品總價", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品優惠價", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品優惠後總價", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("商品支付金額", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("交易時間", keyfont, Element.ALIGN_CENTER));
            table.addCell(createCell("交易狀態", keyfont, Element.ALIGN_CENTER));

createTable是自定義的一個方法

    /**
     * 創建指定列寬、列數的表格
     *
     * @param widths
     * @return
     */
    public static PdfPTable createTable(float[] widths) {
        PdfPTable table = new PdfPTable(widths);
        try {
            table.setTotalWidth(maxWidth);
            table.setLockedWidth(true);
            table.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.getDefaultCell().setBorder(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return table;
    }

可以看到這是定義一個數組,裏面放着表格的寬度,要注意總寬度不要大於最大寬度!

控制層:

	/**
	 * 獲取頁面數據,並且把數據導出到pdf裏
	 * @param entity
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(params = "exportPdf")
	@ResponseBody
	public List<WxDeliveryRecordEntity> getDeliveryRecordList(WxDeliveryRecordEntity entity,HttpServletResponse response) throws Exception {
		List<WxDeliveryRecordEntity> list = wxDeliveryRecordService.getDeliveryRecordList(entity);
		PdfReportUtils.exportPdf(response,list);
		return list;
	}

我這個用的持久層是hibernate,總是你把數據封裝到集合裏然後傳到工具類裏面,然後去瀏覽器訪問你寫的接口,他就會下載了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章