java生成pdf表格,調用itext創建的實例
昨天花瞭很長的時間去找pdf生成表格的代碼,發現網上大傢寫的代碼太多瞭,而且又沒有註釋,讓我一個小白是完全看不懂,這就很過分瞭,所以秉著我們代碼界共享的原則,我要把我昨天的收獲分享給大傢,好瞭廢話不多說,貼代碼瞭。
1.第一步 導包
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.4.3</version> </dependency>
2.第二步看代碼
import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; public class PDFXXX { public static void main(String[] args) throws Exception, DocumentException { List<String> ponum = new ArrayList<String>(); add(ponum, 26); List<String> line = new ArrayList<String>(); add(line, 26); List<String> part = new ArrayList<String>(); add(part, 26); List<String> description = new ArrayList<String>(); add(description, 26); List<String> origin = new ArrayList<String>(); add(origin, 26); //Create Document Instance Document document = new Document(); //add Chinese font BaseFont bfChinese = BaseFont.createFont("d:\\pdf\\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); //Font headfont=new Font(bfChinese,10,Font.BOLD); Font keyfont = new Font(bfChinese, 8, Font.BOLD); Font textfont = new Font(bfChinese, 8, Font.NORMAL); //Create Writer associated with document PdfWriter.getInstance(document, new FileOutputStream(new File("D:\\POReceiveReport.pdf"))); document.open(); //Seperate Page controller int recordPerPage = 10; int fullPageRequired = ponum.size() / recordPerPage; int remainPage = ponum.size() % recordPerPage > 1 ? 1 : 0; int totalPage = 1; for (int j = 0; j < totalPage; j++) { document.newPage(); String company = "等待"; //record header field PdfPTable t = new PdfPTable(5); float[] widths = {1.5f, 1f, 1f, 1.5f, 1f}; t.setWidths(widths); t.setTotalWidth(100); t.getDefaultCell().setBorder(PdfPCell.NO_BORDER); PdfPCell c1 = new PdfPCell(new Paragraph("PO#", keyfont)); t.addCell(c1); c1 = new PdfPCell(new Paragraph("Line", keyfont)); t.addCell(c1); c1 = new PdfPCell(new Paragraph("Part#", keyfont)); t.addCell(c1); c1 = new PdfPCell(new Paragraph("Description", keyfont)); t.addCell(c1); c1 = new PdfPCell(new Paragraph("Origin", keyfont)); t.addCell(c1); //calculate the real records within a page ,to calculate the last record number of every page int maxRecordInPage = j + 1 == totalPage ? (remainPage == 0 ? recordPerPage : (ponum.size() % recordPerPage)) : recordPerPage; for (int i = j * recordPerPage; i < ((j * recordPerPage) + maxRecordInPage); i++) { PdfPCell c2 = new PdfPCell(new Paragraph(ponum.get(i), textfont)); t.addCell(c2); c2 = new PdfPCell(new Paragraph(line.get(i), textfont)); t.addCell(c2); c2 = new PdfPCell(new Paragraph(part.get(i), textfont)); t.addCell(c2); c2 = new PdfPCell(new Paragraph(description.get(i), textfont)); t.addCell(c2); c2 = new PdfPCell(new Paragraph(origin.get(i), textfont)); t.addCell(c2); } document.add(t); } document.close(); } public static String leftPad(String str, int i) { int addSpaceNo = i - str.length(); String space = ""; for (int k = 0; k < addSpaceNo; k++) { space = " " + space; } ; String result = space + str; return result; } public static String printBlank(int tmp) { String space = ""; for (int m = 0; m < tmp; m++) { space = space + " "; } return space; } public static void add(List<String> list, int num) { for (int i = 0; i < num; i++) { list.add("test老葛-" + i); } } }
3.註意事項:
simhei.ttf 這是字體,對中文有效的;然後如果導瞭com.lowagie包可能在引包的時候會出現問題,所以看我代碼上的import導的什麼包就行瞭。
補充:java生成PDF表格的一次優化
在優化一個pdf的發票打印的時候如果發票的發票明細超過1000行的時候就會變得很慢.需要20分鐘才能把數據加載出來.之後就開始查詢耗時的原因,在打印瞭每個方法的執行時間之後,發現在打印方法執行的時候sql取數據的時候很快,那麼就是itext的轉換PDF的時候導致很慢.
最後找到原因是因為發票明細行中的行合並導致效率低下,比如一個合同下有1000條明細數據,那麼合同名稱這一列就需要合同1000行,這個合並會導致打印效率低下(cell.setColspan(colspan);)方法;
優化思路:
因為每個發票隻有一個合同我們可以把整個明細行看成一個整體.(思路如下圖)
這樣在調一下樣式就可以瞭
相關的方法:
float[] widths = {110, 110, 330}; PdfPTable contractTable = new PdfPTable(widths);//這個表格三列的長度 contractTable.setTotalWidth(width);//這個屬性要加上 contractTable.setLockedWidth(true);//這個屬性要加上 cellDetail.setPadding(0f); cellDetail.setBorderWidth(0f);//去除表格的邊框
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- 使用itextpdf解決PDF合並的問題
- Java使用iTextPDF生成PDF文件的實現方法
- java 畫pdf用itext調整表格寬度、自定義各個列寬的方法
- java 後端生成pdf模板合並單元格表格的案例
- java 用itext設置pdf紙張大小操作