利用itext操作pdf从数据库导出大量数据--创建PDF表格(三)

相关代码以及jar包说明文件:http://download.csdn.net/detail/baby_soga/7105763
Java代码   收藏代码
  1. package com.fruitking.testpdf.util;  
  2.   
  3. import java.awt.Color;  
  4. import java.io.File;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.OutputStream;  
  9.   
  10. import com.lowagie.text.Document;  
  11. import com.lowagie.text.DocumentException;  
  12. import com.lowagie.text.Font;  
  13. import com.lowagie.text.PageSize;  
  14. import com.lowagie.text.Paragraph;  
  15. import com.lowagie.text.pdf.BaseFont;  
  16. import com.lowagie.text.pdf.PdfPCell;  
  17. import com.lowagie.text.pdf.PdfPTable;  
  18. import com.lowagie.text.pdf.PdfWriter;  
  19.   
  20. public class PDFCreate2Table {  
  21.       
  22.     private String[][] normalTableContent = new String[][]{  
  23.             {"序号","姓名","年龄","职业","籍贯","学历","单位名称","联系电话","联系地址","备注"},  
  24.             {"1","许果","31","软件工程师","浙江杭州","大学本科","浙江水果大王信息技术有限公司","18905710571","浙江省杭州市西湖区三墩镇三墩街188号","他是一名优秀的IT工程师,日常爱好旅游,运动"}  
  25.     };  
  26.       
  27.     private String[][] columnTooMuchTableContent = new String[][]{  
  28.             {"序号","姓名","年龄","职业","籍贯","学历","单位名称","联系电话","联系地址",  
  29.                 "语文","数学","英语","物理","化学","生物","政治","历史","地理","音乐","美术","体育","课外实践","学校名称","备注"},  
  30.             {"1","许果","31","软件工程师","浙江杭州","大学本科","浙江水果大王信息技术有限公司","18905710571","浙江省杭州市西湖区三墩镇三墩街188号",  
  31.                     "85","95","75","90","90","85","80","90","90","75","65","75","80","石城中学","他是一名优秀的IT工程师,日常爱好旅游,运动"}  
  32.     };  
  33.       
  34.     /** 
  35.      * 创建一份普通表格的PDF文件 
  36.      * @param fullFilePath 
  37.      * @return 
  38.      */  
  39.     public boolean createNormalTable(String fullFilePath,int rowsNumber){  
  40.         Document pdfDocument = new Document();  
  41.         try {  
  42.             //构建一个PDF文档输出流程  
  43.             OutputStream pdfFileOutputStream = new FileOutputStream(new File(fullFilePath));  
  44.             PdfWriter.getInstance(pdfDocument,pdfFileOutputStream);  
  45.             //设置中文字体和字体样式  
  46.             BaseFont bfChinese = BaseFont.createFont("STSong-Light""UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);    
  47.             Font f8 = new Font(bfChinese, 8, Font.NORMAL);  
  48.             //打开PDF文件流  
  49.             pdfDocument.open();  
  50.             //创建一个N列的表格控件  
  51.             PdfPTable pdfTable = new PdfPTable(normalTableContent[0].length);  
  52.             //设置表格占PDF文档100%宽度  
  53.             pdfTable.setWidthPercentage(100);  
  54.             //水平方向表格控件左对齐  
  55.             pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);  
  56.             //创建一个表格的表头单元格  
  57.             PdfPCell pdfTableHeaderCell = new PdfPCell();  
  58.             //设置表格的表头单元格颜色  
  59.             pdfTableHeaderCell.setBackgroundColor(new Color(21314169));  
  60.             pdfTableHeaderCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  61.             for(String tableHeaderInfo : normalTableContent[0]){  
  62.                 pdfTableHeaderCell.setPhrase(new Paragraph(tableHeaderInfo, f8));  
  63.                 pdfTable.addCell(pdfTableHeaderCell);  
  64.             }  
  65.             //创建一个表格的正文内容单元格  
  66.             PdfPCell pdfTableContentCell = new PdfPCell();  
  67.             pdfTableContentCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  68.             pdfTableContentCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);  
  69.             //表格内容行数的填充  
  70.             for(int i = 0;i < rowsNumber;i++){  
  71.                 for(String tableContentInfo : normalTableContent[1]){  
  72.                     pdfTableContentCell.setPhrase(new Paragraph(tableContentInfo, f8));  
  73.                     pdfTable.addCell(pdfTableContentCell);  
  74.                 }  
  75.             }  
  76.             pdfDocument.add(pdfTable);  
  77.             return true;  
  78.         }catch(FileNotFoundException de) {  
  79.             de.printStackTrace();  
  80.             System.err.println("pdf file: " + de.getMessage());  
  81.             return false;  
  82.         }catch(DocumentException de) {  
  83.             de.printStackTrace();  
  84.             System.err.println("document: " + de.getMessage());  
  85.             return false;  
  86.         }catch(IOException de) {  
  87.             de.printStackTrace();  
  88.             System.err.println("pdf font: " + de.getMessage());  
  89.             return false;  
  90.         }finally{  
  91.             //关闭PDF文档流,OutputStream文件输出流也将在PDF文档流关闭方法内部关闭  
  92.             if(pdfDocument!=null){  
  93.                 pdfDocument.close();  
  94.             }  
  95.         }          
  96.     }  
  97.       
  98.     /** 
  99.      * 创建一份表格行内容超长的PDF文件 
  100.      * 产生的问题:如果表格行内容足够多时,容易产生Java程序内存溢出问题 
  101.      * 解决办法:采用PDF文件流式写入方式。即表格内容每写入某个数字的行数时,其内容一方面写满物理文件,另一方面释放内存中存留的内容。 
  102.      * @param fullFilePath 
  103.      * @return 
  104.      */  
  105.     public boolean createRowTooMuchTable(String fullFilePath,int rowsNumber,int submitAmount){  
  106.         Document pdfDocument = new Document();  
  107.         try {  
  108.             //构建一个PDF文档输出流程  
  109.             OutputStream pdfFileOutputStream = new FileOutputStream(new File(fullFilePath));  
  110.             PdfWriter.getInstance(pdfDocument,pdfFileOutputStream);  
  111.             //设置中文字体和字体样式  
  112.             BaseFont bfChinese = BaseFont.createFont("STSong-Light""UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);    
  113.             Font f8 = new Font(bfChinese, 8, Font.NORMAL);  
  114.             //打开PDF文件流  
  115.             pdfDocument.open();  
  116.             //创建一个N列的表格控件  
  117.             PdfPTable pdfTable = new PdfPTable(normalTableContent[0].length);  
  118.             //设置表格占PDF文档100%宽度  
  119.             pdfTable.setWidthPercentage(100);  
  120.             //水平方向表格控件左对齐  
  121.             pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);  
  122.             //创建一个表格的表头单元格  
  123.             PdfPCell pdfTableHeaderCell = new PdfPCell();  
  124.             //设置表格的表头单元格颜色  
  125.             pdfTableHeaderCell.setBackgroundColor(new Color(21314169));  
  126.             pdfTableHeaderCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  127.             for(String tableHeaderInfo : normalTableContent[0]){  
  128.                 pdfTableHeaderCell.setPhrase(new Paragraph(tableHeaderInfo, f8));  
  129.                 pdfTable.addCell(pdfTableHeaderCell);  
  130.             }  
  131.             //创建一个表格的正文内容单元格  
  132.             PdfPCell pdfTableContentCell = new PdfPCell();  
  133.             pdfTableContentCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  134.             pdfTableContentCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);  
  135.             //表格内容行数的填充  
  136.             for(int i = 1;i < rowsNumber;i++){  
  137.                 for(String tableContentInfo : normalTableContent[1]){  
  138.                     pdfTableContentCell.setPhrase(new Paragraph(tableContentInfo, f8));  
  139.                     pdfTable.addCell(pdfTableContentCell);  
  140.                 }  
  141.                 //表格内容每写满某个数字的行数时,其内容一方面写入物理文件,另一方面释放内存中存留的内容。  
  142.                 if((i%submitAmount)==0){  
  143.                     pdfDocument.add(pdfTable);  
  144.                     pdfTable.deleteBodyRows();  
  145.                 }else if(i==rowsNumber){  
  146.                     //如果全部类容完毕且又没达到某个行数限制,则也要写入物理文件中。  
  147.                     pdfDocument.add(pdfTable);  
  148.                     pdfTable.deleteBodyRows();  
  149.                 }  
  150.             }  
  151.             return true;  
  152.         }catch(FileNotFoundException de) {  
  153.             de.printStackTrace();  
  154.             System.err.println("pdf file: " + de.getMessage());  
  155.             return false;  
  156.         }catch(DocumentException de) {  
  157.             de.printStackTrace();  
  158.             System.err.println("document: " + de.getMessage());  
  159.             return false;  
  160.         }catch(IOException de) {  
  161.             de.printStackTrace();  
  162.             System.err.println("pdf font: " + de.getMessage());  
  163.             return false;  
  164.         }finally{  
  165.             //关闭PDF文档流,OutputStream文件输出流也将在PDF文档流关闭方法内部关闭  
  166.             if(pdfDocument!=null){  
  167.                 pdfDocument.close();  
  168.             }  
  169.         }          
  170.     }  
  171.       
  172.     /** 
  173.      * 创建一份表格列信息超长的PDF文件 
  174.      * 产生的问题:如果表格行列信息足够多时,默认的A4纸格式大小文档版面把列信息压缩得不好看 
  175.      * 解决办法:采用A3,A2,A1,A0等宽度更宽的页面板式 
  176.      * @param fullFilePath 
  177.      * @return 
  178.      */  
  179.     public boolean createColumnTooMuchTable(String fullFilePath,int rowsNumber){  
  180.         Document pdfDocument = new Document(PageSize.A2,50,50,50,50);  
  181.         try {  
  182.             //构建一个PDF文档输出流程  
  183.             OutputStream pdfFileOutputStream = new FileOutputStream(new File(fullFilePath));  
  184.             PdfWriter.getInstance(pdfDocument,pdfFileOutputStream);  
  185.             //设置中文字体和字体样式  
  186.             BaseFont bfChinese = BaseFont.createFont("STSong-Light""UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);    
  187.             Font f8 = new Font(bfChinese, 8, Font.NORMAL);  
  188.             //打开PDF文件流  
  189.             pdfDocument.open();  
  190.             //创建一个N列的表格控件  
  191.             PdfPTable pdfTable = new PdfPTable(columnTooMuchTableContent[0].length);  
  192.             //设置表格占PDF文档100%宽度  
  193.             pdfTable.setWidthPercentage(100);  
  194.             //水平方向表格控件左对齐  
  195.             pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);  
  196.             //创建一个表格的表头单元格  
  197.             PdfPCell pdfTableHeaderCell = new PdfPCell();  
  198.             //设置表格的表头单元格颜色  
  199.             pdfTableHeaderCell.setBackgroundColor(new Color(21314169));  
  200.             pdfTableHeaderCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  201.             for(String tableHeaderInfo : columnTooMuchTableContent[0]){  
  202.                 pdfTableHeaderCell.setPhrase(new Paragraph(tableHeaderInfo, f8));  
  203.                 pdfTable.addCell(pdfTableHeaderCell);  
  204.             }  
  205.             //创建一个表格的正文内容单元格  
  206.             PdfPCell pdfTableContentCell = new PdfPCell();  
  207.             pdfTableContentCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  208.             pdfTableContentCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);  
  209.             //表格内容行数的填充  
  210.             for(int i = 0;i < rowsNumber;i++){  
  211.                 for(String tableContentInfo : columnTooMuchTableContent[1]){  
  212.                     pdfTableContentCell.setPhrase(new Paragraph(tableContentInfo, f8));  
  213.                     pdfTable.addCell(pdfTableContentCell);  
  214.                 }  
  215.             }  
  216.             pdfDocument.add(pdfTable);  
  217.             return true;  
  218.         }catch(FileNotFoundException de) {  
  219.             de.printStackTrace();  
  220.             System.err.println("pdf file: " + de.getMessage());  
  221.             return false;  
  222.         }catch(DocumentException de) {  
  223.             de.printStackTrace();  
  224.             System.err.println("document: " + de.getMessage());  
  225.             return false;  
  226.         }catch(IOException de) {  
  227.             de.printStackTrace();  
  228.             System.err.println("pdf font: " + de.getMessage());  
  229.             return false;  
  230.         }finally{  
  231.             //关闭PDF文档流,OutputStream文件输出流也将在PDF文档流关闭方法内部关闭  
  232.             if(pdfDocument!=null){  
  233.                 pdfDocument.close();  
  234.             }  
  235.         }          
  236.     }  
  237.       
  238.     /** 
  239.      * 创建一份表格列信息超长的PDF文件 
  240.      * 产生的问题:如果表格行列信息足够多时,默认的A4纸格式大小文档版面把列信息压缩得不好看; 
  241.      * 产生的问题:如果表格行内容足够多时,容易产生Java程序内存溢出问题 
  242.      * 解决办法:采用A3,A2,A1,A0等宽度更宽的页面板式; 
  243.      * 解决办法:采用PDF文件流式写入方式。即表格内容每写入某个数字的行数时,其内容一方面写满物理文件,另一方面释放内存中存留的内容。 
  244.      * @param fullFilePath 
  245.      * @return 
  246.      */  
  247.     public boolean createRowsAndColumnTooMuchTable(String fullFilePath,int rowsNumber,int submitAmount){  
  248.         Document pdfDocument = new Document(PageSize.A2,50,50,50,50);  
  249.         try {  
  250.             //构建一个PDF文档输出流程  
  251.             OutputStream pdfFileOutputStream = new FileOutputStream(new File(fullFilePath));  
  252.             PdfWriter.getInstance(pdfDocument,pdfFileOutputStream);  
  253.             //设置中文字体和字体样式  
  254.             BaseFont bfChinese = BaseFont.createFont("STSong-Light""UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);    
  255.             Font f8 = new Font(bfChinese, 8, Font.NORMAL);  
  256.             //打开PDF文件流  
  257.             pdfDocument.open();  
  258.             //创建一个N列的表格控件  
  259.             PdfPTable pdfTable = new PdfPTable(columnTooMuchTableContent[0].length);  
  260.             //设置表格占PDF文档100%宽度  
  261.             pdfTable.setWidthPercentage(100);  
  262.             //水平方向表格控件左对齐  
  263.             pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);  
  264.             //创建一个表格的表头单元格  
  265.             PdfPCell pdfTableHeaderCell = new PdfPCell();  
  266.             //设置表格的表头单元格颜色  
  267.             pdfTableHeaderCell.setBackgroundColor(new Color(21314169));  
  268.             pdfTableHeaderCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  269.             for(String tableHeaderInfo : columnTooMuchTableContent[0]){  
  270.                 pdfTableHeaderCell.setPhrase(new Paragraph(tableHeaderInfo, f8));  
  271.                 pdfTable.addCell(pdfTableHeaderCell);  
  272.             }  
  273.             //创建一个表格的正文内容单元格  
  274.             PdfPCell pdfTableContentCell = new PdfPCell();  
  275.             pdfTableContentCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  276.             pdfTableContentCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);  
  277.             //表格内容行数的填充  
  278.             for(int i = 0;i < rowsNumber;i++){  
  279.                 for(String tableContentInfo : columnTooMuchTableContent[1]){  
  280.                     pdfTableContentCell.setPhrase(new Paragraph(tableContentInfo, f8));  
  281.                     pdfTable.addCell(pdfTableContentCell);  
  282.                 }  
  283.                 //表格内容每写满某个数字的行数时,其内容一方面写入物理文件,另一方面释放内存中存留的内容。  
  284.                 if((i%submitAmount)==0){  
  285.                     pdfDocument.add(pdfTable);  
  286.                     pdfTable.deleteBodyRows();  
  287.                 }else if(i==rowsNumber){  
  288.                     //如果全部类容完毕且又没达到某个行数限制,则也要写入物理文件中。  
  289.                     pdfDocument.add(pdfTable);  
  290.                     pdfTable.deleteBodyRows();  
  291.                 }  
  292.             }  
  293.             return true;  
  294.         }catch(FileNotFoundException de) {  
  295.             de.printStackTrace();  
  296.             System.err.println("pdf file: " + de.getMessage());  
  297.             return false;  
  298.         }catch(DocumentException de) {  
  299.             de.printStackTrace();  
  300.             System.err.println("document: " + de.getMessage());  
  301.             return false;  
  302.         }catch(IOException de) {  
  303.             de.printStackTrace();  
  304.             System.err.println("pdf font: " + de.getMessage());  
  305.             return false;  
  306.         }finally{  
  307.             //关闭PDF文档流,OutputStream文件输出流也将在PDF文档流关闭方法内部关闭  
  308.             if(pdfDocument!=null){  
  309.                 pdfDocument.close();  
  310.             }  
  311.         }          
  312.     }  
  313.   
  314.     /** 
  315.      * @param args 
  316.      */  
  317.     public static void main(String[] args) {  
  318.         PDFCreate2Table pdfCreate2Table = new PDFCreate2Table();  
  319.         long startTime1 = System.currentTimeMillis();  
  320.         boolean result1 = pdfCreate2Table.createNormalTable("D:/temp/pdftest/21表格正常内容文档.pdf"500);  
  321.         long endTime1 = System.currentTimeMillis();  
  322.         System.out.println("表格正常内容的pdf文档创建结果:" + result1+"。总计花费时间:"+((endTime1-startTime1)/1000)+"秒");  
  323.         System.out.println("--------------------------------------------------------------------------");  
  324.         long startTime2 = System.currentTimeMillis();  
  325.         boolean result2 = pdfCreate2Table.createRowTooMuchTable("D:/temp/pdftest/22表格行信息超长文档.pdf"500000,2000);  
  326.         long endTime2 = System.currentTimeMillis();  
  327.         System.out.println("表格行信息超长的pdf文档创建结果:" + result2+"。总计花费时间:"+((endTime2-startTime2)/1000)+"秒");  
  328.         System.out.println("--------------------------------------------------------------------------");  
  329.         long startTime3 = System.currentTimeMillis();  
  330.         boolean result3 = pdfCreate2Table.createColumnTooMuchTable("D:/temp/pdftest/23表格列信息超长文档.pdf"5000);  
  331.         long endTime3 = System.currentTimeMillis();  
  332.         System.out.println("表格行信息超长的pdf文档创建结果:" + result3+"。总计花费时间:"+((endTime3-startTime3)/1000)+"秒");  
  333.         System.out.println("--------------------------------------------------------------------------");  
  334.         long startTime4 = System.currentTimeMillis();  
  335.         boolean result4 = pdfCreate2Table.createRowTooMuchTable("D:/temp/pdftest/24表格行列都信息超长文档.pdf"200000,2000);  
  336.         long endTime4 = System.currentTimeMillis();  
  337.         System.out.println("表格行列信息都超长的pdf文档创建结果:" + result4+"。总计花费时间:"+((endTime4-startTime4)/1000)+"秒");  
  338.           
  339.     }  
  340.   
  341. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值