动态导出pdf(简单方法只包括分页)

import java.io.IOException;


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  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;jfor (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
  • 查看图片附件

你可能感兴趣的:(动态导出pdf(简单方法只包括分页))