import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;
public class PdfFileExportUtil {
private static Font pdf8Font = null;
private static Font pdf20Font = null;
/**
* 设置PDF创建者信息
* @param pdfDocument
*/
public static Document setCreatorInfo(Document pdfDocument){
if(pdfDocument==null){
return null;
}
//文档属性
pdfDocument.addTitle("爱温数据安全产品");
pdfDocument.addAuthor("新致软件");
pdfDocument.addSubject("文件导出的信息安全管控");
pdfDocument.addKeywords("文件导出,信息安全");//文档关键字信息
pdfDocument.addCreator("爱温管理系统");//应用程序名称
return pdfDocument;
}
/**
* 获取中文字符集且是8号字体,常用作表格内容的字体格式
* @param fullFilePath
*/
public static Font getChinese8Font()throws DocumentException,IOException{
if(pdf8Font==null){
//设置中文字体和字体样式
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
pdf8Font = new Font(bfChinese, 10, Font.NORMAL);
}
return pdf8Font;
}
/**
* 获取中文字符集且是8号字体,常用作文字水印信息
* @param fullFilePath
*/
public static Font getChinese20Font()throws DocumentException,IOException{
if(pdf20Font==null){
//设置中文字体和字体样式
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
pdf20Font = new Font(bfChinese, 20, Font.BOLD);
}
return pdf20Font;
}
/**
* 设置成只读权限
* @param pdfWriter
*/
public static PdfWriter setReadOnlyPDFFile(PdfWriter pdfWriter)throws DocumentException{
pdfWriter.setEncryption(null, null,PdfWriter.ALLOW_PRINTING, PdfWriter.STANDARD_ENCRYPTION_128);
return pdfWriter;
}
/**
* 变更一个图片对象的展示位置和角度信息
* @param waterMarkImage
* @param xPosition
* @param yPosition
* @return
*/
public static Image getWaterMarkImage(Image waterMarkImage,float xPosition,float yPosition){
waterMarkImage.setAbsolutePosition(xPosition, yPosition);//坐标
waterMarkImage.setRotation(-20);//旋转 弧度
waterMarkImage.setRotationDegrees(-45);//旋转 角度
waterMarkImage.scalePercent(100);//依照比例缩放
return waterMarkImage;
}
/**
* 为PDF分页时创建添加文本水印的事件信息
*/
class TextWaterMarkPdfPageEvent extends PdfPageEventHelper{
private String waterMarkText;
public TextWaterMarkPdfPageEvent(String waterMarkText){
this.waterMarkText = waterMarkText;
}
public void onEndPage(PdfWriter writer, Document document) {
try{
float pageWidth = document.right()+document.left();//获取pdf内容正文页面宽度
float pageHeight = document.top()+document.bottom();//获取pdf内容正文页面高度
//设置水印字体格式
Font waterMarkFont = PdfFileExportUtil.getChinese20Font();
PdfContentByte waterMarkPdfContent = writer.getDirectContentUnder();
Phrase phrase = new Phrase(waterMarkText, waterMarkFont);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.25f,pageHeight*0.2f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.25f,pageHeight*0.5f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.25f,pageHeight*0.8f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.65f,pageHeight*0.2f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.65f,pageHeight*0.5f,45);
ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,
pageWidth*0.65f,pageHeight*0.8f,45);
}catch(DocumentException de) {
de.printStackTrace();
System.err.println("pdf watermark font: " + de.getMessage());
}catch(IOException de) {
de.printStackTrace();
System.err.println("pdf watermark font: " + de.getMessage());
}
}
}
/**
* 为PDF分页时创建添加图片水印的事件信息
*/
class PictureWaterMarkPdfPageEvent extends PdfPageEventHelper{
private String waterMarkFullFilePath;
private Image waterMarkImage;
public PictureWaterMarkPdfPageEvent(String waterMarkFullFilePath){
this.waterMarkFullFilePath = waterMarkFullFilePath;
}
public void onEndPage(PdfWriter writer, Document document) {
try{
float pageWidth = document.right()+document.left();//获取pdf内容正文页面宽度
float pageHeight = document.top()+document.bottom();//获取pdf内容正文页面高度
PdfContentByte waterMarkPdfContent = writer.getDirectContentUnder();
//仅设置一个图片实例对象,整个PDF文档只应用一个图片对象,极大减少因为增加图片水印导致PDF文档大小增加
if(waterMarkImage == null){
waterMarkImage = Image.getInstance(waterMarkFullFilePath);
}
//添加水印图片,文档正文内容采用横向三列,竖向两列模式增加图片水印
waterMarkPdfContent.addImage(getWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.1f));
waterMarkPdfContent.addImage(getWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.4f));
waterMarkPdfContent.addImage(getWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.7f));
waterMarkPdfContent.addImage(getWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.1f));
waterMarkPdfContent.addImage(getWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.4f));
waterMarkPdfContent.addImage(getWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.7f));
PdfGState gs = new PdfGState();
gs.setFillOpacity(0.2f);//设置透明度为0.2
waterMarkPdfContent.setGState(gs);
}catch(DocumentException de) {
de.printStackTrace();
System.err.println("pdf watermark font: " + de.getMessage());
}catch(IOException de) {
de.printStackTrace();
System.err.println("pdf watermark font: " + de.getMessage());
}
}
}
/**
* 为PDF分页时创建添加header和footer信息的事件信息
*/
class HeadFootInfoPdfPageEvent extends PdfPageEventHelper{
public HeadFootInfoPdfPageEvent(){
}
public void onEndPage(PdfWriter writer, Document document) {
try{
PdfContentByte headAndFootPdfContent = writer.getDirectContent();
headAndFootPdfContent.saveState();
headAndFootPdfContent.beginText();
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
headAndFootPdfContent.setFontAndSize(bfChinese, 15);
//文档页头信息设置
float x = document.top(-20);
//页头信息左面
// headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_LEFT,"数据管理",document.left(), x, 0);
//页头信息中间
// headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_CENTER, "会员导入报表",(document.right() + document.left())/2,x, 0);
//页头信息右面
headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_RIGHT,
"第"+writer.getPageNumber()+ "页",
document.right(), x, 0);
//文档页脚信息设置
float y = document.bottom(-20);
//页脚信息左面
headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_LEFT,
"--",
document.left(), y, 0);
//页脚信息中间
headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_CENTER,
"-",
(document.right() + document.left())/2,
y, 0);
//页脚信息右面
headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_RIGHT,
"--",
document.right(), y, 0);
headAndFootPdfContent.endText();
headAndFootPdfContent.restoreState();
}catch(DocumentException de) {
de.printStackTrace();
System.err.println("pdf watermark font: " + de.getMessage());
}catch(IOException de) {
de.printStackTrace();
System.err.println("pdf watermark font: " + de.getMessage());
}
}
}
}
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
public class PdfFileExport{
/**
* 从数据库中导出数据并以PDF文件形式存储
* 列信息较多,行信息可能超过100万
* 文档仅有只读权限,设置文档作者信息
* 在文档页头设置公司信息版权信息
* 添加公司的文字和图片水印信息
* @param fullFilePath
* @param tableContent
* @param rowsNumber
* @param submitAmount
* @return
*/
public boolean exportTableContent(String fullFilePath,String[][] tableContent,int rowsNumber,int submitAmount){
Document pdfDocument = new Document(PageSize.A2,50,50,50,50);
System.out.println(tableContent.length);
try {
//创建文件夹
int temp = fullFilePath.lastIndexOf("/");
String filePath = fullFilePath.substring(0,temp);
File File = new File(filePath);
if (!File.exists()) {
File.mkdirs();
}
//构建一个PDF文档输出流程
OutputStream pdfFileOutputStream = new FileOutputStream(new File(fullFilePath));
PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument,pdfFileOutputStream);
//设置作者信息
PdfFileExportUtil.setCreatorInfo(pdfDocument);
//设置文件只读权限
// PdfFileExportUtil.setReadOnlyPDFFile(pdfWriter);
//通过PDF页面事件模式添加文字水印功能
PdfFileExportUtil pdfFileExportUtil = new PdfFileExportUtil();
// pdfWriter.setPageEvent(pdfFileExportUtil.new TextWaterMarkPdfPageEvent("爱温管理系统"));
//通过PDF页面事件模式添加图片水印功能
// String waterMarkFullFilePath = "D:/temp/Export/login_logo.gif";//水印图片
// pdfWriter.setPageEvent(pdfFileExportUtil.new PictureWaterMarkPdfPageEvent(waterMarkFullFilePath));
//通过PDF页面事件模式添加页头和页脚信息功能
pdfWriter.setPageEvent(pdfFileExportUtil.new HeadFootInfoPdfPageEvent());
//设置中文字体和字体样式
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font f8 = new Font(bfChinese, 13, Font.NORMAL);
//打开PDF文件流
pdfDocument.open();
//创建一个N列的表格控件
PdfPTable pdfTable = new PdfPTable(tableContent[0].length);
//设置表格占PDF文档100%宽度
pdfTable.setWidthPercentage(100);
//水平方向表格控件左对齐
pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);
//创建一个表格的表头单元格
PdfPCell pdfTableHeaderCell = new PdfPCell();
//设置表格的表头单元格颜色
// pdfTableHeaderCell.setBackgroundColor(new BaseColor(213, 141, 69));
pdfTableHeaderCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
// for(String tableHeaderInfo : tableContent[0]){
// pdfTableHeaderCell.setPhrase(new Paragraph(tableHeaderInfo, f8));
// pdfTable.addCell(pdfTableHeaderCell);
// }
//创建一个表格的正文内容单元格
PdfPCell pdfTableContentCell = new PdfPCell();
pdfTableContentCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
pdfTableContentCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
//表格内容行数的填充
for(int i = 0;i < tableContent.length;i++){
for(String tableContentInfo : tableContent[i]){
pdfTableContentCell.setPhrase(new Paragraph(tableContentInfo, f8));
pdfTable.addCell(pdfTableContentCell);
}
//表格内容每写满某个数字的行数时,其内容一方面写入物理文件,另一方面释放内存中存留的内容。
if((i%submitAmount)==0){
pdfDocument.add(pdfTable);
pdfTable.deleteBodyRows();
}else if(i==rowsNumber){
//如果全部类容完毕且又没达到某个行数限制,则也要写入物理文件中。
pdfDocument.add(pdfTable);
pdfTable.deleteBodyRows();
}
}
return true;
}catch(FileNotFoundException de) {
de.printStackTrace();
System.err.println("pdf file: " + de.getMessage());
return false;
}catch(DocumentException de) {
de.printStackTrace();
System.err.println("document: " + de.getMessage());
return false;
}catch(IOException de) {
de.printStackTrace();
System.err.println("pdf font: " + de.getMessage());
return false;
}finally{
//关闭PDF文档流,OutputStream文件输出流也将在PDF文档流关闭方法内部关闭
if(pdfDocument!=null){
pdfDocument.close();
}
}
}
/* public static void main(String[] args) {
String[][] tableContent = new String[][]{{"序号","姓名","年龄","职业","籍贯","学历","单位名称","联系电话","联系地址"},
{"1","许果","31","软件工程师","浙江杭州","大学本科","浙江水果大王信息技术有限公司","18905710571","浙江省杭州市西湖区三墩镇三墩街188号1"}
};
PdfFileExportServiceImpl pdfFileExport = new PdfFileExportServiceImpl();
SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
String warrantyCard = sdf.format(new java.util.Date());
pdfFileExport.exportTableContent("D:/temp/pdftest/"+warrantyCard+"41导出PDF文档.pdf", tableContent, 30, tableContent.length-1);
} */
}
public void getReservationBypdf(@ModelAttribute("queryDt")QueryDt queryDt,@ModelAttribute("memberVo") MemberVo memberVo) throws Exception{
PageResult<Member> pageResult =this.listMember(memberVo);
String expiredCheckBox=memberVo.getExpiredCheckBox();
String[] strArr = expiredCheckBox.split(",");
String[][] tableContent = new String[pageResult.getContent().size()+1][strArr.length];
for (int i = 0; i < strArr.length; i++) {
if(strArr[i].equals("1")){
tableContent[0][i]="省份";
}
if(strArr[i].equals("2")){
tableContent[0][i]="城市";
}
if(strArr[i].equals("3")){
tableContent[0][i]="车牌";
}
if(strArr[i].equals("4")){
tableContent[0][i]="姓名";
}
if(strArr[i].equals("5")){
tableContent[0][i]="车型";
}
if(strArr[i].equals("6")){
tableContent[0][i]="车龄";
}
if(strArr[i].equals("7")){
tableContent[0][i]="联系方式 ";
}
if(strArr[i].equals("8")){
tableContent[0][i]="已行驶公里数";
}
if(strArr[i].equals("9")){
tableContent[0][i]="加注爱温时间";
}
if(strArr[i].equals("10")){
tableContent[0][i]="加注地点";
}
if(strArr[i].equals("11")){
tableContent[0][i]="施工员姓名";
}
if(strArr[i].equals("12")){
tableContent[0][i]="施工员手机";
}
if(strArr[i].equals("13")){
tableContent[0][i]="测水率原液值";
}
if(strArr[i].equals("14")){
tableContent[0][i]="测水率加注后值";
}
}
if(pageResult.getContent().size()>0){
for(int j=0;j<pageResult.getContent().size();j++){
for (int i = 0; i < strArr.length; i++) {
if(strArr[i].equals("1")){
if(pageResult.getContent().get(j).getProvinceId()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getProvincesCity().getProCityName();
}
}
if(strArr[i].equals("2")){
if(pageResult.getContent().get(j).getCityId()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getCity().getProCityName();
}
}
if(strArr[i].equals("3")){
if(pageResult.getContent().get(j).getLicence()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getLicence();
}
}
if(strArr[i].equals("4")){
if(pageResult.getContent().get(j).getLicence()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getName();
}
}
if(strArr[i].equals("5")){
if(pageResult.getContent().get(j).getCarType()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getCarType();
}
}
if(strArr[i].equals("6")){
if(pageResult.getContent().get(j).getCarAge()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getCarAge().toString();
}
}
if(strArr[i].equals("7")){
if(pageResult.getContent().get(j).getMobile()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getMobile();
}
}
if(strArr[i].equals("8")){
if(pageResult.getContent().get(j).getMiles()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getMiles().toString();
}
}
if(strArr[i].equals("9")){
if(pageResult.getContent().get(j).getFillDate()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=new SimpleDateFormat("yyyy-MM-dd").format(pageResult.getContent().get(j).getFillDate());
}
}
if(strArr[i].equals("10")){
if(pageResult.getContent().get(j).getFillPlace()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getFillPlace();
}
}
if(strArr[i].equals("11")){
if(pageResult.getContent().get(j).getWorkName()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getWorkName();
}
}
if(strArr[i].equals("12")){
if(pageResult.getContent().get(j).getWorkMobile()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getWorkMobile();
}
}
if(strArr[i].equals("13")){
if(pageResult.getContent().get(j).getOldValue()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getOldValue().toString();
}
}
if(strArr[i].equals("14")){
if(pageResult.getContent().get(j).getNewValue()==null){
tableContent[j+1][i]="";
}else{
tableContent[j+1][i]=pageResult.getContent().get(j).getNewValue().toString();
}
}
}
}
}
// System.out.println(tableContent);
PdfFileExport pdfFileExport = new PdfFileExport();
SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
String onTime = sdf.format(new java.util.Date());
if(tableContent.length==1){
pdfFileExport.exportTableContent("D:/temp/Export/"+onTime+"会员报表PDF文档.pdf", tableContent, tableContent.length,88);
}else{
pdfFileExport.exportTableContent("D:/temp/Export/"+onTime+"会员报表PDF文档.pdf", tableContent, tableContent.length, tableContent.length-1);
}
Runtime.getRuntime().exec("cmd /E:ON /c start "+"D:/temp/Export/"+onTime+"会员报表PDF文档.pdf");
}
- pdf导出大表格数据及水印操作的文档和原程序.rar (24.6 KB)
- 下载次数: 144
- 依赖的jar包.rar (3.7 MB)
- 下载次数: 114