欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java生成pdf表格,调用itext创建的实例

程序员文章站 2022-11-17 13:19:24
昨天花了很长的时间去找pdf生成表格的代码,发现网上大家写的代码太多了,而且又没有注释,让我一个小白是完全看不懂,这就很过分了,所以秉着我们代码界共享的原则,我要把我昨天的收获分享给大家,好了废话不多...

昨天花了很长的时间去找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的时候导致很慢.

java生成pdf表格,调用itext创建的实例

最后找到原因是因为发票明细行中的行合并导致效率低下,比如一个合同下有1000条明细数据,那么合同名称这一列就需要合同1000行,这个合并会导致打印效率低下(cell.setcolspan(colspan);)方法;

优化思路:

因为每个发票只有一个合同我们可以把整个明细行看成一个整体.(思路如下图)

java生成pdf表格,调用itext创建的实例

这样在调一下样式就可以了

相关的方法:

float[] widths = {110, 110, 330};
pdfptable contracttable = new pdfptable(widths);//这个表格三列的长度
contracttable.settotalwidth(width);//这个属性要加上
contracttable.setlockedwidth(true);//这个属性要加上
celldetail.setpadding(0f);
celldetail.setborderwidth(0f);//去除表格的边框

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。