利用itext操作pdf从数据库导出大量数据--添加水印(四)

利用itext操作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. import java.net.MalformedURLException;  
  10.   
  11. import com.lowagie.text.BadElementException;  
  12. import com.lowagie.text.Document;  
  13. import com.lowagie.text.DocumentException;  
  14. import com.lowagie.text.Element;  
  15. import com.lowagie.text.Font;  
  16. import com.lowagie.text.Image;  
  17. import com.lowagie.text.Paragraph;  
  18. import com.lowagie.text.Phrase;  
  19. import com.lowagie.text.pdf.BaseFont;  
  20. import com.lowagie.text.pdf.ColumnText;  
  21. import com.lowagie.text.pdf.PdfContentByte;  
  22. import com.lowagie.text.pdf.PdfGState;  
  23. import com.lowagie.text.pdf.PdfPCell;  
  24. import com.lowagie.text.pdf.PdfPTable;  
  25. import com.lowagie.text.pdf.PdfPageEventHelper;  
  26. import com.lowagie.text.pdf.PdfReader;  
  27. import com.lowagie.text.pdf.PdfStamper;  
  28. import com.lowagie.text.pdf.PdfWriter;  
  29.   
  30. public class PDFCreate2WaterMark {  
  31.       
  32.     /** 
  33.      * 根据图片文件路径构建一个图片对象 
  34.      * @param waterMarkFullFilePath 
  35.      * @param xPosition 
  36.      * @param yPosition 
  37.      * @return 
  38.      * @throws BadElementException 
  39.      * @throws MalformedURLException 
  40.      * @throws IOException 
  41.      */  
  42.     private Image getWaterMarkImage(String waterMarkFullFilePath,float xPosition,float yPosition)throws BadElementException, MalformedURLException, IOException{  
  43.         Image waterMarkImage = Image.getInstance(waterMarkFullFilePath);  
  44.         waterMarkImage.setAbsolutePosition(xPosition, yPosition);//坐标  
  45.         waterMarkImage.setRotation(-20);//旋转 弧度  
  46.         waterMarkImage.setRotationDegrees(-45);//旋转 角度  
  47.         waterMarkImage.scalePercent(100);//依照比例缩放  
  48.         return waterMarkImage;  
  49.     }  
  50.       
  51.     /** 
  52.      * 对一个图片对象设置展示位置等信息,该对象重复利用,减少PDF文件大小 
  53.      * @param waterMarkImage 
  54.      * @param xPosition 
  55.      * @param yPosition 
  56.      * @return 
  57.      */  
  58.     private Image getSingletonWaterMarkImage(Image waterMarkImage,float xPosition,float yPosition){  
  59.         waterMarkImage.setAbsolutePosition(xPosition, yPosition);//坐标  
  60.         waterMarkImage.setRotation(-20);//旋转 弧度  
  61.         waterMarkImage.setRotationDegrees(-45);//旋转 角度  
  62.         waterMarkImage.scalePercent(100);//依照比例缩放  
  63.         return waterMarkImage;  
  64.     }  
  65.       
  66.     /** 
  67.      * 对于已存在的PDF文件增加图片水印 
  68.      * 图片水印按照两列三行模式,并旋转45度正斜形式添加水印图片 
  69.      * @param pdfInputFile 
  70.      * @param pdfOutputFile 
  71.      * @param waterMarkFullFilePath 
  72.      */  
  73.     public void addPictureWaterMark(String pdfInputFile,String pdfOutputFile,String waterMarkFullFilePath) {  
  74.         PdfStamper pdfStamper = null;  
  75.         PdfReader reader = null;  
  76.         try {  
  77.             //构造需要添加水印的PDF文件对象  
  78.             reader = new PdfReader(pdfInputFile);  
  79.             int pdfFileTotalPages = reader.getNumberOfPages() + 1;  
  80.             //创建添加水印后的PDF文件对象  
  81.             OutputStream pdfOutputStream = new FileOutputStream(pdfOutputFile);  
  82.             pdfStamper = new PdfStamper(reader,pdfOutputStream);  
  83.             PdfContentByte underPdfContent = null;  
  84.             float pageWidth = 0;  
  85.             float pageHeight = 0;  
  86.             for (int i = 1; i < pdfFileTotalPages; i++) {  
  87.                 pageWidth = reader.getPageSize(i).getWidth();//获取pdf文档页面宽度  
  88.                 pageHeight = reader.getPageSize(i).getHeight();//获取pdf文档页面高度  
  89.                 underPdfContent = pdfStamper.getUnderContent(i);  
  90.                 //添加水印图片,文档正文内容采用横向三列,竖向两列模式增加图片水印  
  91.                 underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.2f,pageHeight*0.1f));  
  92.                 underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.2f,pageHeight*0.4f));  
  93.                 underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.2f,pageHeight*0.7f));  
  94.                 underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.6f,pageHeight*0.1f));  
  95.                 underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.6f,pageHeight*0.4f));  
  96.                 underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.6f,pageHeight*0.7f));  
  97.                 PdfGState gs = new PdfGState();  
  98.                 gs.setFillOpacity(0.2f);//设置透明度为0.2  
  99.                 underPdfContent.setGState(gs);  
  100.             }  
  101.         }catch(DocumentException de){  
  102.             de.printStackTrace();  
  103.             System.err.println(”pdf add watermark documnet opt: ” + de.getMessage());  
  104.         }catch(IOException ioe){  
  105.             ioe.printStackTrace();  
  106.             System.err.println(”pdf add watermark iostream opt: ” + ioe.getMessage());  
  107.         }finally{  
  108.             if(reader!=null){  
  109.                 reader.close();  
  110.             }  
  111.             if(pdfStamper!=null){  
  112.                 try{  
  113.                     pdfStamper.close();  
  114.                 }catch(DocumentException de){  
  115.                     de.printStackTrace();  
  116.                     System.err.println(”pdf add watermark close stamper: ” + de.getMessage());  
  117.                 }catch(IOException ioe){  
  118.                     ioe.printStackTrace();  
  119.                     System.err.println(”pdf add watermark close stream: ” + ioe.getMessage());  
  120.                 }  
  121.             }  
  122.         }  
  123.     }  
  124.       
  125.     /** 
  126.      * 对于已存在的PDF文件增加图片水印,水印图片以单例模式添加,避免极大的增加PDF文件大小 
  127.      * 图片水印按照两列三行模式,并旋转45度正斜形式添加水印图片 
  128.      * @param pdfInputFile 
  129.      * @param pdfOutputFile 
  130.      * @param waterMarkFullFilePath 
  131.      */  
  132.     public void addSingletonPictureWaterMark(String pdfInputFile,String pdfOutputFile,String waterMarkFullFilePath) {  
  133.         PdfStamper pdfStamper = null;  
  134.         PdfReader reader = null;  
  135.         try {  
  136.             //构造需要添加水印的PDF文件对象  
  137.             reader = new PdfReader(pdfInputFile);  
  138.             int pdfFileTotalPages = reader.getNumberOfPages() + 1;  
  139.             //创建添加水印后的PDF文件对象  
  140.             OutputStream pdfOutputStream = new FileOutputStream(pdfOutputFile);  
  141.             pdfStamper = new PdfStamper(reader,pdfOutputStream);  
  142.             PdfContentByte underPdfContent = null;  
  143.             float pageWidth = 0;  
  144.             float pageHeight = 0;  
  145.             //仅设置一个图片实例对象,整个PDF文档只应用一个图片对象,极大减少因为增加图片水印导致PDF文档大小增加  
  146.             Image waterMarkImage = Image.getInstance(waterMarkFullFilePath);  
  147.             for (int i = 1; i < pdfFileTotalPages; i++) {  
  148.                 pageWidth = reader.getPageSize(i).getWidth();//获取pdf文档页面宽度  
  149.                 pageHeight = reader.getPageSize(i).getHeight();//获取pdf文档页面高度  
  150.                 underPdfContent = pdfStamper.getUnderContent(i);  
  151.                 //添加水印图片,文档正文内容采用横向三列,竖向两列模式增加图片水印  
  152.                 underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.1f));  
  153.                 underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.4f));  
  154.                 underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.7f));  
  155.                 underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.1f));  
  156.                 underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.4f));  
  157.                 underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.7f));  
  158.                 PdfGState gs = new PdfGState();  
  159.                 gs.setFillOpacity(0.2f);//设置透明度为0.2  
  160.                 underPdfContent.setGState(gs);  
  161.             }  
  162.         }catch(DocumentException de){  
  163.             de.printStackTrace();  
  164.             System.err.println(”pdf add watermark documnet opt: ” + de.getMessage());  
  165.         }catch(IOException ioe){  
  166.             ioe.printStackTrace();  
  167.             System.err.println(”pdf add watermark iostream opt: ” + ioe.getMessage());  
  168.         }finally{  
  169.             if(reader!=null){  
  170.                 reader.close();  
  171.             }  
  172.             if(pdfStamper!=null){  
  173.                 try{  
  174.                     pdfStamper.close();  
  175.                 }catch(DocumentException de){  
  176.                     de.printStackTrace();  
  177.                     System.err.println(”pdf add watermark close stamper: ” + de.getMessage());  
  178.                 }catch(IOException ioe){  
  179.                     ioe.printStackTrace();  
  180.                     System.err.println(”pdf add watermark close stream: ” + ioe.getMessage());  
  181.                 }  
  182.             }  
  183.         }  
  184.     }  
  185.       
  186.     /** 
  187.      * 对于已存在的PDF文件增加文字水印 
  188.      * 文字水印按照两列三行模式,并旋转45度正斜形式添加文字水印 
  189.      * @param pdfInputFile 
  190.      * @param pdfOutputFile 
  191.      * @param waterMarkText 
  192.      */  
  193.     private void addTextWaterMark(String pdfInputFile,String pdfOutputFile,String waterMarkText) {  
  194.         PdfStamper pdfStamper = null;  
  195.         PdfReader reader = null;  
  196.         try {  
  197.             //构造需要添加水印的PDF文件对象  
  198.             reader = new PdfReader(pdfInputFile);  
  199.             int pdfFileTotalPages = reader.getNumberOfPages() + 1;  
  200.             //创建添加水印后的PDF文件对象  
  201.             OutputStream pdfOutputStream = new FileOutputStream(pdfOutputFile);  
  202.             pdfStamper = new PdfStamper(reader,pdfOutputStream);  
  203.             PdfContentByte underPdfContent = null;  
  204.             float pageWidth = 0;  
  205.             float pageHeight = 0;  
  206.             for (int i = 1; i < pdfFileTotalPages; i++) {  
  207.                 pageWidth = reader.getPageSize(i).getWidth();  
  208.                 pageHeight = reader.getPageSize(i).getHeight();  
  209.                 underPdfContent = pdfStamper.getUnderContent(i);  
  210.                   
  211.                 BaseFont base = BaseFont.createFont(”STSong-Light”“UniGB-UCS2-H”,BaseFont.NOT_EMBEDDED);  
  212.                 underPdfContent.beginText();  
  213.                 underPdfContent.setColorFill(Color.CYAN);  
  214.                 underPdfContent.setFontAndSize(base, 20);  
  215.                 // 设置水印文字字体倾斜 开始  
  216.                 underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.2f,pageHeight*0.15f, 45);  
  217.                 underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.2f,pageHeight*0.45f, 45);  
  218.                 underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.2f,pageHeight*0.75f, 45);  
  219.                 underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.6f,pageHeight*0.15f, 45);  
  220.                 underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.6f,pageHeight*0.45f, 45);  
  221.                 underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.6f,pageHeight*0.75f, 45);  
  222.                 // 字体设置结束  
  223.                 underPdfContent.endText();  
  224.                 PdfGState gs = new PdfGState();  
  225.                 gs.setFillOpacity(0.2f);// 设置透明度为0.2  
  226.                 underPdfContent.setGState(gs);  
  227.             }  
  228.         }catch(DocumentException de){  
  229.             de.printStackTrace();  
  230.             System.err.println(”pdf add watermark documnet opt: ” + de.getMessage());  
  231.         }catch(IOException ioe){  
  232.             ioe.printStackTrace();  
  233.             System.err.println(”pdf add watermark iostream opt: ” + ioe.getMessage());  
  234.         }finally{  
  235.             if(reader!=null){  
  236.                 reader.close();  
  237.             }  
  238.             if(pdfStamper!=null){  
  239.                 try{  
  240.                     pdfStamper.close();  
  241.                 }catch(DocumentException de){  
  242.                     de.printStackTrace();  
  243.                     System.err.println(”pdf add watermark close stamper: ” + de.getMessage());  
  244.                 }catch(IOException ioe){  
  245.                     ioe.printStackTrace();  
  246.                     System.err.println(”pdf add watermark close stream: ” + ioe.getMessage());  
  247.                 }  
  248.             }  
  249.         }  
  250.     }  
  251.       
  252.     /** 
  253.      * 创建一份普通表格的PDF文件时同时创建文字水印 
  254.      * @param fullFilePath 
  255.      * @return 
  256.      */  
  257.     public boolean createNormalTableWithTextWaterMark(String fullFilePath,int rowsNumber,String waterMarkText){  
  258.         String[][] normalTableContent = new String[][]{  
  259.                 {”序号”,“姓名”,“年龄”,“职业”,“籍贯”,“学历”,“单位名称”,“联系电话”,“联系地址”,“备注”},  
  260.                 {”1”,“许果”,“31”,“软件工程师”,“浙江杭州”,“大学本科”,“浙江水果大王信息技术有限公司”,“18905710571”,“浙江省杭州市西湖区三墩镇三墩街188号”,“他是一名优秀的IT工程师,日常爱好旅游,运动”}  
  261.         };  
  262.         Document pdfDocument = new Document();  
  263.         try {  
  264.             //构建一个PDF文档输出流程  
  265.             OutputStream pdfFileOutputStream = new FileOutputStream(new File(fullFilePath));  
  266.             PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument,pdfFileOutputStream);  
  267.             //通过PDF页面事件模式添加文字水印功能  
  268.             pdfWriter.setPageEvent(new TextWaterMarkPdfPageEvent(waterMarkText));  
  269.             //设置中文字体和字体样式  
  270.             BaseFont bfChinese = BaseFont.createFont(”STSong-Light”“UniGB-UCS2-H”, BaseFont.NOT_EMBEDDED);    
  271.             Font f8 = new Font(bfChinese, 8, Font.NORMAL);  
  272.             //打开PDF文件流  
  273.             pdfDocument.open();  
  274.             //创建一个N列的表格控件  
  275.             PdfPTable pdfTable = new PdfPTable(normalTableContent[0].length);  
  276.             //设置表格占PDF文档100%宽度  
  277.             pdfTable.setWidthPercentage(100);  
  278.             //水平方向表格控件左对齐  
  279.             pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);  
  280.             //创建一个表格的表头单元格  
  281.             PdfPCell pdfTableHeaderCell = new PdfPCell();  
  282.             //设置表格的表头单元格颜色  
  283.             pdfTableHeaderCell.setBackgroundColor(new Color(21314169));  
  284.             pdfTableHeaderCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  285.             for(String tableHeaderInfo : normalTableContent[0]){  
  286.                 pdfTableHeaderCell.setPhrase(new Paragraph(tableHeaderInfo, f8));  
  287.                 pdfTable.addCell(pdfTableHeaderCell);  
  288.             }  
  289.             //创建一个表格的正文内容单元格  
  290.             PdfPCell pdfTableContentCell = new PdfPCell();  
  291.             pdfTableContentCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  292.             pdfTableContentCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);  
  293.             //表格内容行数的填充  
  294.             for(int i = 0;i < rowsNumber;i++){  
  295.                 for(String tableContentInfo : normalTableContent[1]){  
  296.                     pdfTableContentCell.setPhrase(new Paragraph(tableContentInfo, f8));  
  297.                     pdfTable.addCell(pdfTableContentCell);  
  298.                 }  
  299.             }  
  300.             pdfDocument.add(pdfTable);  
  301.             return true;  
  302.         }catch(FileNotFoundException de) {  
  303.             de.printStackTrace();  
  304.             System.err.println(”pdf file: ” + de.getMessage());  
  305.             return false;  
  306.         }catch(DocumentException de) {  
  307.             de.printStackTrace();  
  308.             System.err.println(”document: ” + de.getMessage());  
  309.             return false;  
  310.         }catch(IOException de) {  
  311.             de.printStackTrace();  
  312.             System.err.println(”pdf font: ” + de.getMessage());  
  313.             return false;  
  314.         }finally{  
  315.             //关闭PDF文档流,OutputStream文件输出流也将在PDF文档流关闭方法内部关闭  
  316.             if(pdfDocument!=null){  
  317.                 pdfDocument.close();  
  318.             }  
  319.         }          
  320.     }  
  321.       
  322.     /** 
  323.      * 创建一份普通表格的PDF文件时同时创建图片水印 
  324.      * @param fullFilePath 
  325.      * @return 
  326.      */  
  327.     public boolean createNormalTableWithPictureWaterMark(String fullFilePath,int rowsNumber,String waterMarkFullFilePath){  
  328.         String[][] normalTableContent = new String[][]{  
  329.                 {”序号”,“姓名”,“年龄”,“职业”,“籍贯”,“学历”,“单位名称”,“联系电话”,“联系地址”,“备注”},  
  330.                 {”1”,“许果”,“31”,“软件工程师”,“浙江杭州”,“大学本科”,“浙江水果大王信息技术有限公司”,“18905710571”,“浙江省杭州市西湖区三墩镇三墩街188号”,“他是一名优秀的IT工程师,日常爱好旅游,运动”}  
  331.         };  
  332.         Document pdfDocument = new Document();  
  333.         try {  
  334.             //构建一个PDF文档输出流程  
  335.             OutputStream pdfFileOutputStream = new FileOutputStream(new File(fullFilePath));  
  336.             PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument,pdfFileOutputStream);  
  337.             //通过PDF页面事件模式添加图片水印功能  
  338.             pdfWriter.setPageEvent(new PictureWaterMarkPdfPageEvent(waterMarkFullFilePath));  
  339.             //设置中文字体和字体样式  
  340.             BaseFont bfChinese = BaseFont.createFont(”STSong-Light”“UniGB-UCS2-H”, BaseFont.NOT_EMBEDDED);    
  341.             Font f8 = new Font(bfChinese, 8, Font.NORMAL);  
  342.             //打开PDF文件流  
  343.             pdfDocument.open();  
  344.             //创建一个N列的表格控件  
  345.             PdfPTable pdfTable = new PdfPTable(normalTableContent[0].length);  
  346.             //设置表格占PDF文档100%宽度  
  347.             pdfTable.setWidthPercentage(100);  
  348.             //水平方向表格控件左对齐  
  349.             pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);  
  350.             //创建一个表格的表头单元格  
  351.             PdfPCell pdfTableHeaderCell = new PdfPCell();  
  352.             //设置表格的表头单元格颜色  
  353.             pdfTableHeaderCell.setBackgroundColor(new Color(21314169));  
  354.             pdfTableHeaderCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  355.             for(String tableHeaderInfo : normalTableContent[0]){  
  356.                 pdfTableHeaderCell.setPhrase(new Paragraph(tableHeaderInfo, f8));  
  357.                 pdfTable.addCell(pdfTableHeaderCell);  
  358.             }  
  359.             //创建一个表格的正文内容单元格  
  360.             PdfPCell pdfTableContentCell = new PdfPCell();  
  361.             pdfTableContentCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  362.             pdfTableContentCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);  
  363.             //表格内容行数的填充  
  364.             for(int i = 0;i < rowsNumber;i++){  
  365.                 for(String tableContentInfo : normalTableContent[1]){  
  366.                     pdfTableContentCell.setPhrase(new Paragraph(tableContentInfo, f8));  
  367.                     pdfTable.addCell(pdfTableContentCell);  
  368.                 }  
  369.             }  
  370.             pdfDocument.add(pdfTable);  
  371.             return true;  
  372.         }catch(FileNotFoundException de) {  
  373.             de.printStackTrace();  
  374.             System.err.println(”pdf file: ” + de.getMessage());  
  375.             return false;  
  376.         }catch(DocumentException de) {  
  377.             de.printStackTrace();  
  378.             System.err.println(”document: ” + de.getMessage());  
  379.             return false;  
  380.         }catch(IOException de) {  
  381.             de.printStackTrace();  
  382.             System.err.println(”pdf font: ” + de.getMessage());  
  383.             return false;  
  384.         }finally{  
  385.             //关闭PDF文档流,OutputStream文件输出流也将在PDF文档流关闭方法内部关闭  
  386.             if(pdfDocument!=null){  
  387.                 pdfDocument.close();  
  388.             }  
  389.         }          
  390.     }  
  391.       
  392.     /** 
  393.      * 创建一份普通表格的PDF文件时同时创建图片水印 
  394.      * @param fullFilePath 
  395.      * @return 
  396.      */  
  397.     public boolean createNormalTableWithHeadAndFootInfo(String fullFilePath,int rowsNumber){  
  398.         String[][] normalTableContent = new String[][]{  
  399.                 {”序号”,“姓名”,“年龄”,“职业”,“籍贯”,“学历”,“单位名称”,“联系电话”,“联系地址”,“备注”},  
  400.                 {”1”,“许果”,“31”,“软件工程师”,“浙江杭州”,“大学本科”,“浙江水果大王信息技术有限公司”,“18905710571”,“浙江省杭州市西湖区三墩镇三墩街188号”,“他是一名优秀的IT工程师,日常爱好旅游,运动”}  
  401.         };  
  402.         Document pdfDocument = new Document();  
  403.         try {  
  404.             //构建一个PDF文档输出流程  
  405.             OutputStream pdfFileOutputStream = new FileOutputStream(new File(fullFilePath));  
  406.             PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument,pdfFileOutputStream);  
  407.             //通过PDF页面事件模式添加页头和页脚信息功能  
  408.             pdfWriter.setPageEvent(new HeadFootInfoPdfPageEvent());  
  409.             //设置中文字体和字体样式  
  410.             BaseFont bfChinese = BaseFont.createFont(”STSong-Light”“UniGB-UCS2-H”, BaseFont.NOT_EMBEDDED);    
  411.             Font f8 = new Font(bfChinese, 8, Font.NORMAL);  
  412.             //打开PDF文件流  
  413.             pdfDocument.open();  
  414.             //创建一个N列的表格控件  
  415.             PdfPTable pdfTable = new PdfPTable(normalTableContent[0].length);  
  416.             //设置表格占PDF文档100%宽度  
  417.             pdfTable.setWidthPercentage(100);  
  418.             //水平方向表格控件左对齐  
  419.             pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);  
  420.             //创建一个表格的表头单元格  
  421.             PdfPCell pdfTableHeaderCell = new PdfPCell();  
  422.             //设置表格的表头单元格颜色  
  423.             pdfTableHeaderCell.setBackgroundColor(new Color(21314169));  
  424.             pdfTableHeaderCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  425.             for(String tableHeaderInfo : normalTableContent[0]){  
  426.                 pdfTableHeaderCell.setPhrase(new Paragraph(tableHeaderInfo, f8));  
  427.                 pdfTable.addCell(pdfTableHeaderCell);  
  428.             }  
  429.             //创建一个表格的正文内容单元格  
  430.             PdfPCell pdfTableContentCell = new PdfPCell();  
  431.             pdfTableContentCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);  
  432.             pdfTableContentCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);  
  433.             //表格内容行数的填充  
  434.             for(int i = 0;i < rowsNumber;i++){  
  435.                 for(String tableContentInfo : normalTableContent[1]){  
  436.                     pdfTableContentCell.setPhrase(new Paragraph(tableContentInfo, f8));  
  437.                     pdfTable.addCell(pdfTableContentCell);  
  438.                 }  
  439.             }  
  440.             pdfDocument.add(pdfTable);  
  441.             return true;  
  442.         }catch(FileNotFoundException de) {  
  443.             de.printStackTrace();  
  444.             System.err.println(”pdf file: ” + de.getMessage());  
  445.             return false;  
  446.         }catch(DocumentException de) {  
  447.             de.printStackTrace();  
  448.             System.err.println(”document: ” + de.getMessage());  
  449.             return false;  
  450.         }catch(IOException de) {  
  451.             de.printStackTrace();  
  452.             System.err.println(”pdf font: ” + de.getMessage());  
  453.             return false;  
  454.         }finally{  
  455.             //关闭PDF文档流,OutputStream文件输出流也将在PDF文档流关闭方法内部关闭  
  456.             if(pdfDocument!=null){  
  457.                 pdfDocument.close();  
  458.             }  
  459.         }          
  460.     }  
  461.   
  462.     /** 
  463.      * @param args 
  464.      */  
  465.     public static void main(String[] args) {  
  466.         PDFCreate2Table pdfCreate2Table = new PDFCreate2Table();  
  467.         String sourcePDFFile = ”D:/temp/pdftest/31需要增加水印的原文档.pdf”;  
  468.         boolean result1 = pdfCreate2Table.createNormalTable(sourcePDFFile, 500);  
  469.         PDFCreate2WaterMark pdfWaterMark = new PDFCreate2WaterMark();  
  470.         String waterMarkFullFilePath = ”D:/temp/pdftest/login_logo.gif”;//水印图片  
  471.         if(result1){  
  472.             pdfWaterMark.addPictureWaterMark(sourcePDFFile,”D:/temp/pdftest/32增加图片水印大文档.pdf”,waterMarkFullFilePath);  
  473.             pdfWaterMark.addSingletonPictureWaterMark(sourcePDFFile,”D:/temp/pdftest/33增加图片水印小文档.pdf”,waterMarkFullFilePath);  
  474.             pdfWaterMark.addTextWaterMark(sourcePDFFile,”D:/temp/pdftest/34增加文字水印文档.pdf”,“杭州水果大王信息技术”);  
  475.         }  
  476.         pdfWaterMark.createNormalTableWithTextWaterMark(”D:/temp/pdftest/35文档生成时同时生成文字水印.pdf”,1500,“杭州水果大王信息技术”);  
  477.         pdfWaterMark.createNormalTableWithPictureWaterMark(”D:/temp/pdftest/36文档生成时同时生成图片水印.pdf”,1500,waterMarkFullFilePath);  
  478.         pdfWaterMark.createNormalTableWithHeadAndFootInfo(”D:/temp/pdftest/37文档生成时同时生成页头和页脚信息.pdf”,1500);  
  479.     }  
  480.       
  481.     /** 
  482.      * 为PDF分页时创建添加文本水印的事件信息 
  483.      */  
  484.     class TextWaterMarkPdfPageEvent extends PdfPageEventHelper{  
  485.           
  486.         private String waterMarkText;  
  487.           
  488.         public TextWaterMarkPdfPageEvent(String waterMarkText){  
  489.             this.waterMarkText = waterMarkText;  
  490.         }  
  491.           
  492.         public void onEndPage(PdfWriter writer, Document document) {  
  493.             try{  
  494.                 float pageWidth = document.right()+document.left();//获取pdf内容正文页面宽度  
  495.                 float pageHeight = document.top()+document.bottom();//获取pdf内容正文页面高度  
  496.                 //设置水印字体格式  
  497.                 BaseFont base = BaseFont.createFont(”STSong-Light”“UniGB-UCS2-H”,BaseFont.NOT_EMBEDDED);  
  498.                 Font waterMarkFont = new Font(base, 20, Font.BOLD, Color.CYAN);  
  499.                 PdfContentByte waterMarkPdfContent = writer.getDirectContentUnder();  
  500.                 Phrase phrase = new Phrase(waterMarkText, waterMarkFont);  
  501.                 ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,    
  502.                         pageWidth*0.25f,pageHeight*0.2f,45);  
  503.                 ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,    
  504.                         pageWidth*0.25f,pageHeight*0.5f,45);  
  505.                 ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,    
  506.                         pageWidth*0.25f,pageHeight*0.8f,45);  
  507.                 ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,    
  508.                         pageWidth*0.65f,pageHeight*0.2f,45);  
  509.                 ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,    
  510.                         pageWidth*0.65f,pageHeight*0.5f,45);  
  511.                 ColumnText.showTextAligned(waterMarkPdfContent,Element.ALIGN_CENTER,phrase,    
  512.                         pageWidth*0.65f,pageHeight*0.8f,45);  
  513.             }catch(DocumentException de) {  
  514.                 de.printStackTrace();  
  515.                 System.err.println(”pdf watermark font: ” + de.getMessage());  
  516.             }catch(IOException de) {  
  517.                 de.printStackTrace();  
  518.                 System.err.println(”pdf watermark font: ” + de.getMessage());  
  519.             }  
  520.         }  
  521.     }  
  522.       
  523.     /** 
  524.      * 为PDF分页时创建添加图片水印的事件信息 
  525.      */  
  526.     class PictureWaterMarkPdfPageEvent extends PdfPageEventHelper{  
  527.           
  528.         private String waterMarkFullFilePath;  
  529.         private Image waterMarkImage;  
  530.           
  531.         public PictureWaterMarkPdfPageEvent(String waterMarkFullFilePath){  
  532.             this.waterMarkFullFilePath = waterMarkFullFilePath;  
  533.         }  
  534.           
  535.         public void onEndPage(PdfWriter writer, Document document) {  
  536.             try{  
  537.                 float pageWidth = document.right()+document.left();//获取pdf内容正文页面宽度  
  538.                 float pageHeight = document.top()+document.bottom();//获取pdf内容正文页面高度  
  539.                 PdfContentByte waterMarkPdfContent = writer.getDirectContentUnder();  
  540.                 //仅设置一个图片实例对象,整个PDF文档只应用一个图片对象,极大减少因为增加图片水印导致PDF文档大小增加  
  541.                 if(waterMarkImage == null){  
  542.                     waterMarkImage = Image.getInstance(waterMarkFullFilePath);  
  543.                 }  
  544.                 //添加水印图片,文档正文内容采用横向三列,竖向两列模式增加图片水印  
  545.                 waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.1f));  
  546.                 waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.4f));  
  547.                 waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.7f));  
  548.                 waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.1f));  
  549.                 waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.4f));  
  550.                 waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.7f));  
  551.                 PdfGState gs = new PdfGState();  
  552.                 gs.setFillOpacity(0.2f);//设置透明度为0.2  
  553.                 waterMarkPdfContent.setGState(gs);  
  554.             }catch(DocumentException de) {  
  555.                 de.printStackTrace();  
  556.                 System.err.println(”pdf watermark font: ” + de.getMessage());  
  557.             }catch(IOException de) {  
  558.                 de.printStackTrace();  
  559.                 System.err.println(”pdf watermark font: ” + de.getMessage());  
  560.             }  
  561.         }  
  562.     }  
  563.       
  564.     /** 
  565.      * 为PDF分页时创建添加header和footer信息的事件信息 
  566.      */  
  567.     class HeadFootInfoPdfPageEvent extends PdfPageEventHelper{  
  568.           
  569.         public HeadFootInfoPdfPageEvent(){  
  570.         }  
  571.           
  572.         public void onEndPage(PdfWriter writer, Document document) {  
  573.             try{  
  574.                 PdfContentByte headAndFootPdfContent = writer.getDirectContent();  
  575.                 headAndFootPdfContent.saveState();  
  576.                 headAndFootPdfContent.beginText();  
  577.                 BaseFont bfChinese = BaseFont.createFont(”STSong-Light”“UniGB-UCS2-H”, BaseFont.NOT_EMBEDDED);  
  578.                 headAndFootPdfContent.setFontAndSize(bfChinese, 10);  
  579.                 //文档页头信息设置  
  580.                 float x = document.top(-20);  
  581.                 //页头信息左面  
  582.                 headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_LEFT,  
  583.                                    ”数据安全产品”,  
  584.                                    document.left(), x, 0);  
  585.                 //页头信息中间  
  586.                 headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_CENTER,  
  587.                                     ”第”+writer.getPageNumber()+ “页”,  
  588.                                    (document.right() + document.left())/2,  
  589.                                    x, 0);  
  590.                 //页头信息右面  
  591.                 headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_RIGHT,  
  592.                                    ”杭州水果大王信息技术有限公司”,  
  593.                                    document.right(), x, 0);  
  594.                 //文档页脚信息设置  
  595.                 float y = document.bottom(-20);  
  596.                 //页脚信息左面  
  597.                 headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_LEFT,  
  598.                                    ”–”,  
  599.                                    document.left(), y, 0);  
  600.                 //页脚信息中间  
  601.                 headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_CENTER,  
  602.                                     ”-“,  
  603.                                    (document.right() + document.left())/2,  
  604.                                    y, 0);  
  605.                 //页脚信息右面  
  606.                 headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_RIGHT,  
  607.                                    ”–”,  
  608.                                    document.right(), y, 0);  
  609.                 headAndFootPdfContent.endText();  
  610.                 headAndFootPdfContent.restoreState();  
  611.             }catch(DocumentException de) {  
  612.                 de.printStackTrace();  
  613.                 System.err.println(”pdf watermark font: ” + de.getMessage());  
  614.             }catch(IOException de) {  
  615.                 de.printStackTrace();  
  616.                 System.err.println(”pdf watermark font: ” + de.getMessage());  
  617.             }  
  618.         }  
  619.     }  
  620. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值