java生成pdf表格,調(diào)用itext創(chuàng)建的實(shí)例
昨天花了很長的時(shí)間去找pdf生成表格的代碼,發(fā)現(xiàn)網(wǎng)上大家寫的代碼太多了,而且又沒有注釋,讓我一個(gè)小白是完全看不懂,這就很過分了,所以秉著我們代碼界共享的原則,我要把我昨天的收獲分享給大家,好了廢話不多說,貼代碼了。
1.第一步 導(dǎo)包
<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.注意事項(xiàng):
simhei.ttf 這是字體,對中文有效的;然后如果導(dǎo)了com.lowagie包可能在引包的時(shí)候會出現(xiàn)問題,所以看我代碼上的import導(dǎo)的什么包就行了。
補(bǔ)充:java生成PDF表格的一次優(yōu)化
在優(yōu)化一個(gè)pdf的發(fā)票打印的時(shí)候如果發(fā)票的發(fā)票明細(xì)超過1000行的時(shí)候就會變得很慢.需要20分鐘才能把數(shù)據(jù)加載出來.之后就開始查詢耗時(shí)的原因,在打印了每個(gè)方法的執(zhí)行時(shí)間之后,發(fā)現(xiàn)在打印方法執(zhí)行的時(shí)候sql取數(shù)據(jù)的時(shí)候很快,那么就是itext的轉(zhuǎn)換PDF的時(shí)候?qū)е潞苈?

最后找到原因是因?yàn)榘l(fā)票明細(xì)行中的行合并導(dǎo)致效率低下,比如一個(gè)合同下有1000條明細(xì)數(shù)據(jù),那么合同名稱這一列就需要合同1000行,這個(gè)合并會導(dǎo)致打印效率低下(cell.setColspan(colspan);)方法;
優(yōu)化思路:
因?yàn)槊總€(gè)發(fā)票只有一個(gè)合同我們可以把整個(gè)明細(xì)行看成一個(gè)整體.(思路如下圖)

這樣在調(diào)一下樣式就可以了
相關(guān)的方法:
float[] widths = {110, 110, 330};
PdfPTable contractTable = new PdfPTable(widths);//這個(gè)表格三列的長度
contractTable.setTotalWidth(width);//這個(gè)屬性要加上
contractTable.setLockedWidth(true);//這個(gè)屬性要加上
cellDetail.setPadding(0f);
cellDetail.setBorderWidth(0f);//去除表格的邊框
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
springboot之SpringApplication生命周期和事件機(jī)制解讀
這篇文章主要介紹了springboot之SpringApplication生命周期和事件機(jī)制,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
MyBatisPlus 主鍵策略的實(shí)現(xiàn)(4種)
MyBatis Plus 集成了多種主鍵策略,幫助用戶快速生成主鍵,本文主要介紹了MyBatisPlus主鍵策略的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
ShardingSphere jdbc實(shí)現(xiàn)分庫分表核心概念詳解
這篇文章主要為大家介紹了ShardingSphere jdbc實(shí)現(xiàn)分庫分表核心概念詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Java實(shí)現(xiàn)定時(shí)任務(wù)的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)定時(shí)任務(wù)的相關(guān)知識,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-11-11
SpringBoot集成xxl-job實(shí)現(xiàn)超牛的定時(shí)任務(wù)的步驟詳解
XXL-JOB是一個(gè)分布式任務(wù)調(diào)度平臺,其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴(kuò)展,現(xiàn)已開放源代碼并接入多家公司線上產(chǎn)品線,開箱即用,本文給大家介紹了SpringBoot集成xxl-job實(shí)現(xiàn)超牛的定時(shí)任務(wù),需要的朋友可以參考下2023-10-10
SpringCloud?Nacos?+?Ribbon?調(diào)用服務(wù)的實(shí)現(xiàn)方式(兩種)
這篇文章主要介紹了SpringCloud?Nacos?+?Ribbon?調(diào)用服務(wù)的兩種方法,分別是通過代碼的方式調(diào)用服務(wù)和通過注解方式調(diào)用服務(wù),每種方式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03

