您的位置:首页 > 编程语言 > Java开发

java导出pdf文件工具类

2016-12-08 19:12 513 查看
最近频繁用到itextpdf将数据导出为pdf文件,每次都要写一些基本的方法,太麻烦,就写了一个工具类,可以降低代码的冗余

下面是工具类:

首先引入itextpdf jar包,然后引入下面工具类:

import java.io.File;
import java.io.IOException;
import java.util.List;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.jfinal.kit.PathKit;
import com.xc.cfg.Preference;

/**
* @Description pdf工具类
* @author GuoMing
* @date 2016年11月29日 下午7:38:09
* @version V0.1
*/
public final class PdfTool {
//正文body 字体
public static Font setChineseFont() throws DocumentException, IOException {
File font = new File(PathKit.getWebRootPath()  + Preference.PDF_FONT_PATH);
BaseFont bfChinese = BaseFont.createFont(font.getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
return FontChinese;
}
//table thead 字体
public static Font setTheadFont() throws DocumentException, IOException {
File font = new File(PathKit.getWebRootPath()  + Preference.PDF_FONT_PATH);
BaseFont bfChinese = BaseFont.createFont(font.getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font FontChinese = new Font(bfChinese, 11, Font.NORMAL);
return FontChinese;
}
//table tbody 字体
public static Font setTbodyFont() throws DocumentException, IOException {
File font = new File(PathKit.getWebRootPath()  + Preference.PDF_FONT_PATH);
BaseFont bfChinese = BaseFont.createFont(font.getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font FontChinese = new Font(bfChinese, 9, Font.NORMAL);
return FontChinese;
}
//文档一号标题
public static Font setDheadFont() throws DocumentException, IOException {
File font = new File(PathKit.getWebRootPath()  + Preference.PDF_FONT_PATH);
BaseFont bfChinese = BaseFont.createFont(font.getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font FontChinese = new Font(bfChinese, 14, Font.NORMAL);
return FontChinese;
}
//获取字符长度(为了让汉字和字母长度统一)
public static int length(String s) {
if (s == null)
return 0;
char[] c = s.toCharArray();
int len = 0;
for (int i = 0; i < c.length; i++) {
len++;
if (!isLetter(c[i])) {
len++;
}
}
return len;
}

public static boolean isLetter(char c) {
int k = 0x80;
return c / k == 0 ? true : false;
}
/**
* @Description 添加行内容
* @author GuoMing
* @date 2016年11月29日 下午3:33:06
* @param document  文档对象
* @param list      行内容列表
* @return          返回添加行后的文档对象
* @throws DocumentException
*/
public static Document addParagraph(Document document,List<String> list,Font font) throws DocumentException{
for(String p : list){
document.add(new Paragraph(p,font));
}
return document;
}

/**
* @Description 添加表格
* @author GuoMing
* @date 2016年11月29日 下午3:34:27
* @param document  文档对象
* @param thead     表头列表
* @param thead     内容列表
* @return          添加表格之后的文档对象
* @throws DocumentException
*/
public static Document addTable(Document document,PdfPTable table,List<String> thead,List<List<String>> tbody,Font TBFont,Font THFont) throws DocumentException{
//添加表头
for(String p:thead){
PdfPCell cell=new PdfPCell(new Phrase(p,THFont));
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setBackgroundColor(new BaseColor(216, 218, 220));
table.addCell(cell);
}
//添加表内容
for(List<String> p:tbody){
for(String c:p){
PdfPCell cell=new PdfPCell(new Phrase(c,TBFont));
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
}
}
document.add(table);
return document;
}
//设置行距
public static void addParaAfter(Document document,float i) throws DocumentException {
// TODO Auto-generated method stub
Paragraph p=new Paragraph();
p.setSpacingAfter(i);
document.add(p);
}

public static void addParaBefore(Document document,float i) throws DocumentException {
// TODO Auto-generated method stub
Paragraph p=new Paragraph();
p.setSpacingBefore(i);
document.add(p);
}
}


设置页码

import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

/**
* @Description 设置底部页码
* @author GuoMing
* @date 2016年12月8日 下午7:06:46
* @version V0.1
*/
public class HeaderFooter extends PdfPageEventHelper{
public void onEndPage (PdfWriter writer, Document document) {
Rectangle rect = writer.getBoxSize("art");
switch(writer.getPageNumber() % 2) {
case 0:
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_RIGHT, new Phrase(""),
rect.getRight(), rect.getTop(), 0);
break;
case 1:
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_LEFT, new Phrase(""),
rect.getLeft(), rect.getTop(), 0);
break;
}
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_CENTER, new Phrase(String.format("第  %d 页", writer.getPageNumber())),
(rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 18, 0);
}
}


调用过程

1:前端调用接口

public class ExportController extends CommonAdminController {
public static DeviceCheckInfo info=new DeviceCheckInfo();//这是一个自建的bean类,将所有需要打印在pdf中的数据都封装在里面
public void exportDeviceCheckPdf(){
Document document = new Document(PageSize.A4, 40f, 40f, 100f, 20f);// 创建文档 大小
document.setMargins(40, 40, 15, 45); // 左,右,上,下
...中间封装数据过程略...
Base64ToImg.exportDeviceCheckPdf(document,info, path, pdfName);
renderFile(pdfName);
}
}


2,调用业务逻辑层方法:

public class Base64ToImg {
/**
* @Description
* @param info 导出数据bean
* @param path  存储路径
* @param pdfName 文件名称
* 自定义字体方法
BaseFont bfChinese = BaseFont.createFont(fpath.getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font1 = new Font(bfChinese, 16, Font.NORMAL); // 标题字体
*/
public static void exportDeviceCheckPdf(Document document,DeviceCheckInfo info, String path, String pdfName) {

PdfWriter writer;
File fpath = new File(PathKit.getWebRootPath() + Preference.PDF_FONT_PATH);
try {
Font DHFont = PdfTool.setDheadFont();                                                // 标题字体
Font THFont = PdfTool.setTheadFont();                                                 // thead字体
Font TBFont = PdfTool.setTbodyFont();                                                 // tbody字体
Font font = PdfTool.setChineseFont();                                                  // 正文字体
BaseFont bfChinese = BaseFont.createFont(fpath.getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font1 = new Font(bfChinese, 11, Font.BOLD); // 标题字体
writer = PdfWriter.getInstance(document, new FileOutputStream(path + "/" + pdfName));
Rectangle rect = new Rectangle(36, 54, 559, 788);                                         // 设置页面大小
rect.setBackgroundColor(BaseColor.WHITE);                                            // 页面背景色
rect.setBorderColor(BaseColor.BLACK);
writer.setBoxSize("art", rect);
document.open();
//设置页脚
HeaderFooter footer = new HeaderFooter();
writer.setPageEvent(footer);

Paragraph p11 = new Paragraph("设备巡检记录", DHFont);
p11.setAlignment(1);                                                                 //居中
p11.setSpacingBefore(20);                                                            //行间距
p11.setSpacingAfter(20);
document.add(p11);

Anchor anchorTarget = new Anchor("设备巡检记录", DHFont);
document.addTitle("设备巡检记录");

List<String> paragraphsList1=new ArrayList<String>();
List<String> paragraphsList=new ArrayList<String>();
String value="设备总数:"+info.getDeviceNums() + "    "+"正常:"+info.getNormalNums()+
"    "+"离线:"+info.getOutLineNums()+ "    "+"维保:"+info.getProtectNums()+
"    "+"异常:"+info.getErrNums()    + "    "+"报警:"+info.getAlarmNums();
String checkUser=info.getCheckUser();

paragraphsList1.add(value);
paragraphsList.add("巡检账户:"+checkUser+"     巡检时间:"+info.getCheckTime()+"    巡检人(签名):");

PdfPTable t=new PdfPTable(9);
t.setWidthPercentage(100);
t.setSpacingBefore(15);
t.setSpacingAfter(15);

t.setTotalWidth(new float[] { 5, 8, 9, 10, 10, 10, 24, 5, 19});               //设置表头列宽

List<String> thead=new ArrayList<String>() ;
thead.add("序号");                                                                //设置数据表头
thead.add("名称");
thead.add("型号");
thead.add("序列号");
thead.add("位置");
thead.add("最后记录时间");
thead.add("当前值");
thead.add("状态");
thead.add("设备所有人");

List<List<String>> tbody=new ArrayList<List<String>>();
for (int j = 0; j <info.getList().size(); j++) {                               //封装表格body内容
List<String> tCells=new ArrayList<String>();
tCells.add(""+(j+1));
tCells.add(info.getList().get(j).getDeviceName());
tCells.add(info.getList().get(j).getDeviceModel());
tCells.add(info.getList().get(j).getDeviceId());
tCells.add(info.getList().get(j).getDeviceAddr());
tCells.add(info.getList().get(j).getUploadTime());
tCells.add(info.getList().get(j).getChannelInfos());
tCells.add(info.getList().get(j).getStatus());
tCells.add(info.getList().get(j).getAlarmUsers());
tbody.add(tCells);
}

PdfTool.addParagraph(document, paragraphsList1,font1);                          //输出正文
//PdfTool.addParaAfter(document,10);
PdfTool.addParagraph(document, paragraphsList,font);
PdfTool.addParaAfter(document,-10);
PdfTool.addTable(document, t,thead, tbody,TBFont,THFont);                         //输出表格

} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {

document.close();
}

}
}

如果广大网友觉得这篇文章有用,可以用    666导航网   收藏起来,方便随时查看
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pdf java web jfinal