java pdf导出报表工具类
一、描述
pdf导出报表工具,需要的jar包:itextpdf-5.1.2.jar 和 itext-asian-5.1.1.jar(解决中文乱码),需要转成pdf模板工具:Adobe Acrobat软件(制作pdf模板)。
二、代码实现
package com.lanshen.utils.lsjavaUtils;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
/**
* Created by Lanshen on 2019/11/29.
* * pdf导出报表工具
* 需要的jar包:itextpdf-5.1.2.jar 和 itext-asian-5.1.1.jar(解决中文乱码)
* 需要转成pdf模板工具:Adobe Acrobat软件(制作pdf模板)
*/
public class lsexitPdfUtils {
/**
* 利用模板生成pdf
* @param map 模板中填充的参数值
* @param fileName 导出的文件名
* @param request
*/
public static void createPdf(Map<String, String> map,String fileName,HttpServletRequest request) throws DocumentException, IOException{
//获取根路径
String realPath = request.getSession().getServletContext().getRealPath("");
//模板路径
String beginfile=realPath+"WebContent\\modelfiles\\aaa.pdf";
//生成的新文件路径
String endfile=realPath+"WebContent\\upload\\"+fileName;
PdfReader reader;
FileOutputStream outputStream;
ByteArrayOutputStream byteArrayOutputStream;
PdfStamper pdfStamper;
//系统自带的字库,解决中文是否全解释可见
BaseFont baseFont = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
//pdf自带的字库
//BaseFont baseFont = BaseFont.createFont("STSong-Light","UniGB-UNS2-H",BaseFont.NOT_EMBEDDED);
//Font font = new Font(baseFont,12,Font.BOLD);
try{
//把输出流输出到目标文件上
outputStream=new FileOutputStream(endfile);
//通过pdf读工具读取模板文件的信息
reader=new PdfReader(beginfile);
//获取模板文件中的页数
int pagecount = reader.getNumberOfPages();
byteArrayOutputStream=new ByteArrayOutputStream();
//创建pdf读对象
pdfStamper=new PdfStamper(reader,byteArrayOutputStream);
//获取模板pdf文件中区域对象
AcroFields acroFields = pdfStamper.getAcroFields();
//添加文字样式
acroFields.addSubstitutionFont(baseFont);
//取出所有的key值
Set<String> keys = map.keySet();
//遍历出key值,并对应找出value值,并动态写入到pdf中
for(String key : keys){
//动态对应模板中的name值写入内容
if("name".equals(key.toString())){
String name = map.get(key.toString()).toString();
acroFields.setField("name",name);
}
if("sex".equals(key.toString())){
String sex = map.get(key.toString()).toString();
acroFields.setField("sex",sex);
}
if("tel".equals(key.toString())){
String tel = map.get(key.toString()).toString();
acroFields.setField("tel",tel);
}
if("mobile".equals(key.toString())){
String mobile = map.get(key.toString()).toString();
acroFields.setField("mobile",mobile);
}
}
//如果为true,那么生成的PDF文件不能再编辑,如果为false,那么生成的PDF文件还能再编辑
pdfStamper.setFormFlattening(true);
//关闭pdf读对象
pdfStamper.close();
Document document=new Document();
PdfCopy copy = new PdfCopy(document,outputStream);
document.open();
//还原模板文件相同页数
for(int j=1;j<=pagecount;j++){
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(byteArrayOutputStream.toByteArray()),j);
copy.addPage(importPage);
}
document.close();
}catch(IOException e){
e.printStackTrace();
}catch(DocumentException e){
e.printStackTrace();
}
}
public static void main(String[] args) throws DocumentException, IOException{
Map<String, String> map = new HashMap<String, String>();
//向map实例中添加键值
map.put("name","张三");
map.put("sex","男");
map.put("tel","020-1646977-445");
map.put("mobile","12345678988");
//createPdf(map);
}
}