itext java生成pdf

1.PDF模版填充

     首先需要有一个pdf文件作为模版,可以用如adobe acrobat等工具,添加几个文本域在pdf中,下面就是模版完成后的部分截图。







Java代码

/**
* 批量导出PDF(一页为一条数据)
* @param dataList PDF模板数据集合
* @param MoudleUrl PDF模板路径
* @param exportUrl PDF导出路径
*/
public  static boolean exportPDF(ArrayList<Object> dataList ,String MoudleUrl ,String exportUrl){
try{
int isize = dataList.size();
if(isize == 0) return true;//没有数据不导出
FileOutputStream fos = new FileOutputStream(exportUrl);
//ByteArrayOutputStream baos[] = new ByteArrayOutputStream[isize];//每页的pdf流
ByteArrayOutputStream tempBytearray = null;

Document doc = new Document();
PdfCopy pdfCopy = new PdfCopy(doc, fos);
doc.open();
PdfImportedPage impPage = null;

//字体
// BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
// Font font = new Font(bf, 12, Font.NORMAL);

for(int i=0;i<isize;i++){
//baos[i] = new ByteArrayOutputStream();
tempBytearray = new ByteArrayOutputStream();
PdfReader reader = new PdfReader(MoudleUrl);
//PdfStamper ps = new PdfStamper(reader, baos[i]);
PdfStamper ps = new PdfStamper(reader, tempBytearray);
AcroFields afs = ps.getAcroFields();
Object moudObj = dataList.get(i);

Field[] fields = moudObj.getClass().getDeclaredFields();
int length = fields.length;
for(int j=0;j<length;j++){
String varName = fields[j].getName();
boolean accessFlag = fields[j].isAccessible();
fields[j].setAccessible(true);
Object varValue = fields[j].get(moudObj);
//如果有值填充值
if(varValue!=null) afs.setField(varName, varValue.toString());
//恢复访问权限
fields[j].setAccessible(accessFlag);
}

ps.setFormFlattening(true);
ps.close();

impPage = pdfCopy.getImportedPage(new PdfReader(tempBytearray.toByteArray()), 1); 
pdfCopy.addPage(impPage);
}

/**取出之前保存的每页内容*/ 
// for (int i = 0; i < isize; i++) { 
//  
// }

doc.close();
System.out.println("pdf 导出成功!");

return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
/**
* 批量导出PDF(一页为多条数据)
* @param dataList 模板数据集合
* @param MoudleUrl PDF模板路径
* @param exportUrl PDF导出路径
* @param pageSize 每页要显示的条数
* @param pageAttribute 每页页面属性
*/
public  static boolean exportPDFTable(ArrayList<Object> dataList ,String MoudleUrl ,String exportUrl ,int pageSize ,Map pageAttribute){
try{
int isize = dataList.size();
int totalPage = (isize/pageSize)+1;
FileOutputStream fos = new FileOutputStream(exportUrl);
ByteArrayOutputStream baos[] = new ByteArrayOutputStream[totalPage];//每页的pdf流

for(int i=0;i<totalPage;i++){
baos[i] = new ByteArrayOutputStream();
PdfReader reader = new PdfReader(MoudleUrl);
PdfStamper ps = new PdfStamper(reader, baos[i]);
AcroFields afs = ps.getAcroFields();

Iterator iter = pageAttribute.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry = (Map.Entry) iter.next();
String key = entry.getKey().toString();
String val = entry.getValue().toString();
afs.setField(key, val);
}

for(int j=0;j<pageSize;j++){
if(((i*pageSize) + j)>=dataList.size()) break;
Object moudObj = dataList.get((i*pageSize) + j);
Field[] fields = moudObj.getClass().getDeclaredFields();
int length = fields.length;
for(int k=0;k<length;k++){
String varName = fields[k].getName();
boolean accessFlag = fields[k].isAccessible();
fields[k].setAccessible(true);
Object varValue = fields[k].get(moudObj);
//如果有值填充值
if(varValue!=null) afs.setField(varName+(j+1), varValue.toString());
//恢复访问权限
fields[k].setAccessible(accessFlag);
}

}

ps.setFormFlattening(true);
ps.close();
}

Document doc = new Document();
PdfCopy pdfCopy = new PdfCopy(doc, fos);
doc.open();
PdfImportedPage impPage = null;

/**取出之前保存的每页内容*/ 
for (int i = 0; i < totalPage; i++) { 
impPage = pdfCopy.getImportedPage(new PdfReader(baos[i].toByteArray()), 1); 
pdfCopy.addPage(impPage); 
}

doc.close();
System.out.println("pdf 导出成功!");

return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}

 

你可能感兴趣的:(iText-5.0.6.jar)