- 浏览: 284014 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
北方狼:
请问,当表格列数过多时,除了调整pdf页面宽度,能否设置分页显 ...
利用itext操作pdf从数据库导出大量数据--功能汇总(一) -
15817048604:
.....................
利用itext操作pdf从数据库导出大量数据--添加水印(四) -
laoma102:
顶个,谢楼主
代理模式,JDK动态代理,SpringAOP来龙去脉 -
穷途末路:
给力,谢谢分享
Excel2003和Excel2007对下拉选择和下拉级联选择的操作以及java程序的调用 -
weir2009:
复杂的交叉表crosstab 怎么处理?
利用itext操作pdf从数据库导出大量数据--功能汇总(一)
【原始需求】
通过SQL及JDBC模式导出各类业务数据,以PDF文件格式存放,要求该文件只能查看和打印(不能编辑和篡改),文件要有公司相关标志和水印功能。
【需求分析】
1、 通过SQL及JDBC模式导出业务数据,业务数据以表格内容格式存放于PDF文件
2、 PDF文件注明版权
3、 PDF页面中增加水印,公司文字或图片
【设计分析】
1、 生成PDF文件
2、 PDF文件注明版权
3、 PDF增加文字和图片水印
4、 PDF表格列数可能很多,比如1-50列信息,导出时需判断A4纸格式或其他格式宽度。
5、 PDF表格行数量可能超大,比如10万以上,甚至100万以上。
6、 增加水印信息后,文件大小增量应比较小,比如小于5%。
【功能开发】
1、 生成PDF文件
2、 支持中文字体
3、 PDF文件内容为表格,表格有表头
4、 PDF文件内容支持中文,表格内容上下居中,左右居中或左对齐/右对齐
5、 PDF列信息多寡不同,PDF采用页面宽度也能根据列信息按比例调整
6、 PDF行信息超大时写入模式,不能引起内存溢出等问题,有一定的并发性支撑能力。
7、 PDF文件增加作者相关版权信息
8、 PDF页头增加版权相关信息
9、 PDF文件修改权限限制,实现文档只可读取的权限
10、 PDF文件增加文字或图片水印功能,要求文字或图片在整个页面清晰可见。增加的水印信息不能使PDF文件大小增长超过5%。
11、 对PDF文件进行加密
【开发总结】
1、 大数据量写入的内存溢出问题采用文件流模式解决
2、 图片水印需要采用单例图片对象来处理,避免增加图片水印后PDF文件大小猛增
3、 PDF文件生成时,特别是当表格数据比较大时,CPU和JVM内存资源消耗都比较高,这样系统并发性较低。个人笔记本电脑单PDF文件导出时,CPU资源使用率在30%左右,JVM内存资源达到堆大小的极限,因为垃圾回收的缘故避免了内存溢出(已按流式数据处理方式)。
4、 水印的位置需要根据PDF页面大小和水印本身的信息位置范围来确定
利用itext操作pdf从数据库导出大量数据--功能汇总(一)
利用itext操作pdf从数据库导出大量数据--创建PDF相关(二)
利用itext操作pdf从数据库导出大量数据--创建PDF表格(三)
利用itext操作pdf从数据库导出大量数据--添加水印(四)
通过SQL及JDBC模式导出各类业务数据,以PDF文件格式存放,要求该文件只能查看和打印(不能编辑和篡改),文件要有公司相关标志和水印功能。
【需求分析】
1、 通过SQL及JDBC模式导出业务数据,业务数据以表格内容格式存放于PDF文件
2、 PDF文件注明版权
3、 PDF页面中增加水印,公司文字或图片
【设计分析】
1、 生成PDF文件
2、 PDF文件注明版权
3、 PDF增加文字和图片水印
4、 PDF表格列数可能很多,比如1-50列信息,导出时需判断A4纸格式或其他格式宽度。
5、 PDF表格行数量可能超大,比如10万以上,甚至100万以上。
6、 增加水印信息后,文件大小增量应比较小,比如小于5%。
【功能开发】
1、 生成PDF文件
2、 支持中文字体
3、 PDF文件内容为表格,表格有表头
4、 PDF文件内容支持中文,表格内容上下居中,左右居中或左对齐/右对齐
5、 PDF列信息多寡不同,PDF采用页面宽度也能根据列信息按比例调整
6、 PDF行信息超大时写入模式,不能引起内存溢出等问题,有一定的并发性支撑能力。
7、 PDF文件增加作者相关版权信息
8、 PDF页头增加版权相关信息
9、 PDF文件修改权限限制,实现文档只可读取的权限
10、 PDF文件增加文字或图片水印功能,要求文字或图片在整个页面清晰可见。增加的水印信息不能使PDF文件大小增长超过5%。
11、 对PDF文件进行加密
【开发总结】
1、 大数据量写入的内存溢出问题采用文件流模式解决
2、 图片水印需要采用单例图片对象来处理,避免增加图片水印后PDF文件大小猛增
3、 PDF文件生成时,特别是当表格数据比较大时,CPU和JVM内存资源消耗都比较高,这样系统并发性较低。个人笔记本电脑单PDF文件导出时,CPU资源使用率在30%左右,JVM内存资源达到堆大小的极限,因为垃圾回收的缘故避免了内存溢出(已按流式数据处理方式)。
4、 水印的位置需要根据PDF页面大小和水印本身的信息位置范围来确定
利用itext操作pdf从数据库导出大量数据--功能汇总(一)
利用itext操作pdf从数据库导出大量数据--创建PDF相关(二)
利用itext操作pdf从数据库导出大量数据--创建PDF表格(三)
利用itext操作pdf从数据库导出大量数据--添加水印(四)
package com.fruitking.testpdf.util; import java.awt.Color; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.MalformedURLException; import com.lowagie.text.BadElementException; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Element; import com.lowagie.text.Font; import com.lowagie.text.Image; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.ColumnText; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfGState; import com.lowagie.text.pdf.PdfPCell; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.pdf.PdfPageEventHelper; import com.lowagie.text.pdf.PdfReader; import com.lowagie.text.pdf.PdfStamper; import com.lowagie.text.pdf.PdfWriter; public class PDFCreate2WaterMark { /** * 根据图片文件路径构建一个图片对象 * @param waterMarkFullFilePath * @param xPosition * @param yPosition * @return * @throws BadElementException * @throws MalformedURLException * @throws IOException */ private Image getWaterMarkImage(String waterMarkFullFilePath,float xPosition,float yPosition)throws BadElementException, MalformedURLException, IOException{ Image waterMarkImage = Image.getInstance(waterMarkFullFilePath); waterMarkImage.setAbsolutePosition(xPosition, yPosition);//坐标 waterMarkImage.setRotation(-20);//旋转 弧度 waterMarkImage.setRotationDegrees(-45);//旋转 角度 waterMarkImage.scalePercent(100);//依照比例缩放 return waterMarkImage; } /** * 对一个图片对象设置展示位置等信息,该对象重复利用,减少PDF文件大小 * @param waterMarkImage * @param xPosition * @param yPosition * @return */ private Image getSingletonWaterMarkImage(Image waterMarkImage,float xPosition,float yPosition){ waterMarkImage.setAbsolutePosition(xPosition, yPosition);//坐标 waterMarkImage.setRotation(-20);//旋转 弧度 waterMarkImage.setRotationDegrees(-45);//旋转 角度 waterMarkImage.scalePercent(100);//依照比例缩放 return waterMarkImage; } /** * 对于已存在的PDF文件增加图片水印 * 图片水印按照两列三行模式,并旋转45度正斜形式添加水印图片 * @param pdfInputFile * @param pdfOutputFile * @param waterMarkFullFilePath */ public void addPictureWaterMark(String pdfInputFile,String pdfOutputFile,String waterMarkFullFilePath) { PdfStamper pdfStamper = null; PdfReader reader = null; try { //构造需要添加水印的PDF文件对象 reader = new PdfReader(pdfInputFile); int pdfFileTotalPages = reader.getNumberOfPages() + 1; //创建添加水印后的PDF文件对象 OutputStream pdfOutputStream = new FileOutputStream(pdfOutputFile); pdfStamper = new PdfStamper(reader,pdfOutputStream); PdfContentByte underPdfContent = null; float pageWidth = 0; float pageHeight = 0; for (int i = 1; i < pdfFileTotalPages; i++) { pageWidth = reader.getPageSize(i).getWidth();//获取pdf文档页面宽度 pageHeight = reader.getPageSize(i).getHeight();//获取pdf文档页面高度 underPdfContent = pdfStamper.getUnderContent(i); //添加水印图片,文档正文内容采用横向三列,竖向两列模式增加图片水印 underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.2f,pageHeight*0.1f)); underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.2f,pageHeight*0.4f)); underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.2f,pageHeight*0.7f)); underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.6f,pageHeight*0.1f)); underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.6f,pageHeight*0.4f)); underPdfContent.addImage(getWaterMarkImage(waterMarkFullFilePath,pageWidth*0.6f,pageHeight*0.7f)); PdfGState gs = new PdfGState(); gs.setFillOpacity(0.2f);//设置透明度为0.2 underPdfContent.setGState(gs); } }catch(DocumentException de){ de.printStackTrace(); System.err.println("pdf add watermark documnet opt: " + de.getMessage()); }catch(IOException ioe){ ioe.printStackTrace(); System.err.println("pdf add watermark iostream opt: " + ioe.getMessage()); }finally{ if(reader!=null){ reader.close(); } if(pdfStamper!=null){ try{ pdfStamper.close(); }catch(DocumentException de){ de.printStackTrace(); System.err.println("pdf add watermark close stamper: " + de.getMessage()); }catch(IOException ioe){ ioe.printStackTrace(); System.err.println("pdf add watermark close stream: " + ioe.getMessage()); } } } } /** * 对于已存在的PDF文件增加图片水印,水印图片以单例模式添加,避免极大的增加PDF文件大小 * 图片水印按照两列三行模式,并旋转45度正斜形式添加水印图片 * @param pdfInputFile * @param pdfOutputFile * @param waterMarkFullFilePath */ public void addSingletonPictureWaterMark(String pdfInputFile,String pdfOutputFile,String waterMarkFullFilePath) { PdfStamper pdfStamper = null; PdfReader reader = null; try { //构造需要添加水印的PDF文件对象 reader = new PdfReader(pdfInputFile); int pdfFileTotalPages = reader.getNumberOfPages() + 1; //创建添加水印后的PDF文件对象 OutputStream pdfOutputStream = new FileOutputStream(pdfOutputFile); pdfStamper = new PdfStamper(reader,pdfOutputStream); PdfContentByte underPdfContent = null; float pageWidth = 0; float pageHeight = 0; //仅设置一个图片实例对象,整个PDF文档只应用一个图片对象,极大减少因为增加图片水印导致PDF文档大小增加 Image waterMarkImage = Image.getInstance(waterMarkFullFilePath); for (int i = 1; i < pdfFileTotalPages; i++) { pageWidth = reader.getPageSize(i).getWidth();//获取pdf文档页面宽度 pageHeight = reader.getPageSize(i).getHeight();//获取pdf文档页面高度 underPdfContent = pdfStamper.getUnderContent(i); //添加水印图片,文档正文内容采用横向三列,竖向两列模式增加图片水印 underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.1f)); underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.4f)); underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.7f)); underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.1f)); underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.4f)); underPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.7f)); PdfGState gs = new PdfGState(); gs.setFillOpacity(0.2f);//设置透明度为0.2 underPdfContent.setGState(gs); } }catch(DocumentException de){ de.printStackTrace(); System.err.println("pdf add watermark documnet opt: " + de.getMessage()); }catch(IOException ioe){ ioe.printStackTrace(); System.err.println("pdf add watermark iostream opt: " + ioe.getMessage()); }finally{ if(reader!=null){ reader.close(); } if(pdfStamper!=null){ try{ pdfStamper.close(); }catch(DocumentException de){ de.printStackTrace(); System.err.println("pdf add watermark close stamper: " + de.getMessage()); }catch(IOException ioe){ ioe.printStackTrace(); System.err.println("pdf add watermark close stream: " + ioe.getMessage()); } } } } /** * 对于已存在的PDF文件增加文字水印 * 文字水印按照两列三行模式,并旋转45度正斜形式添加文字水印 * @param pdfInputFile * @param pdfOutputFile * @param waterMarkText */ private void addTextWaterMark(String pdfInputFile,String pdfOutputFile,String waterMarkText) { PdfStamper pdfStamper = null; PdfReader reader = null; try { //构造需要添加水印的PDF文件对象 reader = new PdfReader(pdfInputFile); int pdfFileTotalPages = reader.getNumberOfPages() + 1; //创建添加水印后的PDF文件对象 OutputStream pdfOutputStream = new FileOutputStream(pdfOutputFile); pdfStamper = new PdfStamper(reader,pdfOutputStream); PdfContentByte underPdfContent = null; float pageWidth = 0; float pageHeight = 0; for (int i = 1; i < pdfFileTotalPages; i++) { pageWidth = reader.getPageSize(i).getWidth(); pageHeight = reader.getPageSize(i).getHeight(); underPdfContent = pdfStamper.getUnderContent(i); BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED); underPdfContent.beginText(); underPdfContent.setColorFill(Color.CYAN); underPdfContent.setFontAndSize(base, 20); // 设置水印文字字体倾斜 开始 underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.2f,pageHeight*0.15f, 45); underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.2f,pageHeight*0.45f, 45); underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.2f,pageHeight*0.75f, 45); underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.6f,pageHeight*0.15f, 45); underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.6f,pageHeight*0.45f, 45); underPdfContent.showTextAligned(Element.ALIGN_LEFT, waterMarkText,pageWidth*0.6f,pageHeight*0.75f, 45); // 字体设置结束 underPdfContent.endText(); PdfGState gs = new PdfGState(); gs.setFillOpacity(0.2f);// 设置透明度为0.2 underPdfContent.setGState(gs); } }catch(DocumentException de){ de.printStackTrace(); System.err.println("pdf add watermark documnet opt: " + de.getMessage()); }catch(IOException ioe){ ioe.printStackTrace(); System.err.println("pdf add watermark iostream opt: " + ioe.getMessage()); }finally{ if(reader!=null){ reader.close(); } if(pdfStamper!=null){ try{ pdfStamper.close(); }catch(DocumentException de){ de.printStackTrace(); System.err.println("pdf add watermark close stamper: " + de.getMessage()); }catch(IOException ioe){ ioe.printStackTrace(); System.err.println("pdf add watermark close stream: " + ioe.getMessage()); } } } } /** * 创建一份普通表格的PDF文件时同时创建文字水印 * @param fullFilePath * @return */ public boolean createNormalTableWithTextWaterMark(String fullFilePath,int rowsNumber,String waterMarkText){ String[][] normalTableContent = new String[][]{ {"序号","姓名","年龄","职业","籍贯","学历","单位名称","联系电话","联系地址","备注"}, {"1","许果","31","软件工程师","浙江杭州","大学本科","浙江水果大王信息技术有限公司","18905710571","浙江省杭州市西湖区三墩镇三墩街188号","他是一名优秀的IT工程师,日常爱好旅游,运动"} }; Document pdfDocument = new Document(); try { //构建一个PDF文档输出流程 OutputStream pdfFileOutputStream = new FileOutputStream(new File(fullFilePath)); PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument,pdfFileOutputStream); //通过PDF页面事件模式添加文字水印功能 pdfWriter.setPageEvent(new TextWaterMarkPdfPageEvent(waterMarkText)); //设置中文字体和字体样式 BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font f8 = new Font(bfChinese, 8, Font.NORMAL); //打开PDF文件流 pdfDocument.open(); //创建一个N列的表格控件 PdfPTable pdfTable = new PdfPTable(normalTableContent[0].length); //设置表格占PDF文档100%宽度 pdfTable.setWidthPercentage(100); //水平方向表格控件左对齐 pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_LEFT); //创建一个表格的表头单元格 PdfPCell pdfTableHeaderCell = new PdfPCell(); //设置表格的表头单元格颜色 pdfTableHeaderCell.setBackgroundColor(new Color(213, 141, 69)); pdfTableHeaderCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); for(String tableHeaderInfo : normalTableContent[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 < rowsNumber;i++){ for(String tableContentInfo : normalTableContent[1]){ pdfTableContentCell.setPhrase(new Paragraph(tableContentInfo, f8)); pdfTable.addCell(pdfTableContentCell); } } pdfDocument.add(pdfTable); 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(); } } } /** * 创建一份普通表格的PDF文件时同时创建图片水印 * @param fullFilePath * @return */ public boolean createNormalTableWithPictureWaterMark(String fullFilePath,int rowsNumber,String waterMarkFullFilePath){ String[][] normalTableContent = new String[][]{ {"序号","姓名","年龄","职业","籍贯","学历","单位名称","联系电话","联系地址","备注"}, {"1","许果","31","软件工程师","浙江杭州","大学本科","浙江水果大王信息技术有限公司","18905710571","浙江省杭州市西湖区三墩镇三墩街188号","他是一名优秀的IT工程师,日常爱好旅游,运动"} }; Document pdfDocument = new Document(); try { //构建一个PDF文档输出流程 OutputStream pdfFileOutputStream = new FileOutputStream(new File(fullFilePath)); PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument,pdfFileOutputStream); //通过PDF页面事件模式添加图片水印功能 pdfWriter.setPageEvent(new PictureWaterMarkPdfPageEvent(waterMarkFullFilePath)); //设置中文字体和字体样式 BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font f8 = new Font(bfChinese, 8, Font.NORMAL); //打开PDF文件流 pdfDocument.open(); //创建一个N列的表格控件 PdfPTable pdfTable = new PdfPTable(normalTableContent[0].length); //设置表格占PDF文档100%宽度 pdfTable.setWidthPercentage(100); //水平方向表格控件左对齐 pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_LEFT); //创建一个表格的表头单元格 PdfPCell pdfTableHeaderCell = new PdfPCell(); //设置表格的表头单元格颜色 pdfTableHeaderCell.setBackgroundColor(new Color(213, 141, 69)); pdfTableHeaderCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); for(String tableHeaderInfo : normalTableContent[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 < rowsNumber;i++){ for(String tableContentInfo : normalTableContent[1]){ pdfTableContentCell.setPhrase(new Paragraph(tableContentInfo, f8)); pdfTable.addCell(pdfTableContentCell); } } pdfDocument.add(pdfTable); 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(); } } } /** * 创建一份普通表格的PDF文件时同时创建图片水印 * @param fullFilePath * @return */ public boolean createNormalTableWithHeadAndFootInfo(String fullFilePath,int rowsNumber){ String[][] normalTableContent = new String[][]{ {"序号","姓名","年龄","职业","籍贯","学历","单位名称","联系电话","联系地址","备注"}, {"1","许果","31","软件工程师","浙江杭州","大学本科","浙江水果大王信息技术有限公司","18905710571","浙江省杭州市西湖区三墩镇三墩街188号","他是一名优秀的IT工程师,日常爱好旅游,运动"} }; Document pdfDocument = new Document(); try { //构建一个PDF文档输出流程 OutputStream pdfFileOutputStream = new FileOutputStream(new File(fullFilePath)); PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument,pdfFileOutputStream); //通过PDF页面事件模式添加页头和页脚信息功能 pdfWriter.setPageEvent(new HeadFootInfoPdfPageEvent()); //设置中文字体和字体样式 BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); Font f8 = new Font(bfChinese, 8, Font.NORMAL); //打开PDF文件流 pdfDocument.open(); //创建一个N列的表格控件 PdfPTable pdfTable = new PdfPTable(normalTableContent[0].length); //设置表格占PDF文档100%宽度 pdfTable.setWidthPercentage(100); //水平方向表格控件左对齐 pdfTable.setHorizontalAlignment(PdfPTable.ALIGN_LEFT); //创建一个表格的表头单元格 PdfPCell pdfTableHeaderCell = new PdfPCell(); //设置表格的表头单元格颜色 pdfTableHeaderCell.setBackgroundColor(new Color(213, 141, 69)); pdfTableHeaderCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); for(String tableHeaderInfo : normalTableContent[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 < rowsNumber;i++){ for(String tableContentInfo : normalTableContent[1]){ pdfTableContentCell.setPhrase(new Paragraph(tableContentInfo, f8)); pdfTable.addCell(pdfTableContentCell); } } pdfDocument.add(pdfTable); 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(); } } } /** * @param args */ public static void main(String[] args) { PDFCreate2Table pdfCreate2Table = new PDFCreate2Table(); String sourcePDFFile = "D:/temp/pdftest/31需要增加水印的原文档.pdf"; boolean result1 = pdfCreate2Table.createNormalTable(sourcePDFFile, 500); PDFCreate2WaterMark pdfWaterMark = new PDFCreate2WaterMark(); String waterMarkFullFilePath = "D:/temp/pdftest/login_logo.gif";//水印图片 if(result1){ pdfWaterMark.addPictureWaterMark(sourcePDFFile,"D:/temp/pdftest/32增加图片水印大文档.pdf",waterMarkFullFilePath); pdfWaterMark.addSingletonPictureWaterMark(sourcePDFFile,"D:/temp/pdftest/33增加图片水印小文档.pdf",waterMarkFullFilePath); pdfWaterMark.addTextWaterMark(sourcePDFFile,"D:/temp/pdftest/34增加文字水印文档.pdf","杭州水果大王信息技术"); } pdfWaterMark.createNormalTableWithTextWaterMark("D:/temp/pdftest/35文档生成时同时生成文字水印.pdf",1500,"杭州水果大王信息技术"); pdfWaterMark.createNormalTableWithPictureWaterMark("D:/temp/pdftest/36文档生成时同时生成图片水印.pdf",1500,waterMarkFullFilePath); pdfWaterMark.createNormalTableWithHeadAndFootInfo("D:/temp/pdftest/37文档生成时同时生成页头和页脚信息.pdf",1500); } /** * 为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内容正文页面高度 //设置水印字体格式 BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED); Font waterMarkFont = new Font(base, 20, Font.BOLD, Color.CYAN); 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(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.1f)); waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.4f)); waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.2f,pageHeight*0.7f)); waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.1f)); waterMarkPdfContent.addImage(getSingletonWaterMarkImage(waterMarkImage,pageWidth*0.6f,pageHeight*0.4f)); waterMarkPdfContent.addImage(getSingletonWaterMarkImage(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, 10); //文档页头信息设置 float x = document.top(-20); //页头信息左面 headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_LEFT, "数据安全产品", document.left(), x, 0); //页头信息中间 headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_CENTER, "第"+writer.getPageNumber()+ "页", (document.right() + document.left())/2, x, 0); //页头信息右面 headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_RIGHT, "杭州水果大王信息技术有限公司", 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()); } } } }
发表评论
-
利用itext操作pdf从数据库导出大量数据--功能汇总(一)
2013-10-21 00:25 15775【原始需求】 通过SQL及JDBC模式导出各类业务数据,以PD ... -
利用itext操作pdf从数据库导出大量数据--创建PDF表格(三)
2013-10-21 00:14 10180【原始需求】 通过SQL及JDBC模式导出各类业务数据,以PD ... -
利用itext操作pdf从数据库导出大量数据--创建PDF相关(二)
2013-10-21 00:12 4662【原始需求】 通过SQL及JDBC模式导出各类业务数据,以PD ... -
利用itext操作pdf从数据库导出大量数据--汇总(一)
2013-10-21 00:06 0【原始需求】 通过SQL及JDBC模式导出各类业务数据,以PD ... -
kettle应用程序集成代码
2013-06-19 21:32 1827package com.zjhcsoft.kettle.t ... -
转载:hibernate原理及应用知识点
2011-10-22 12:45 2044SSH面试题总结 ... -
上传一个ssh整个的工程,方便搭建基于spring的web应用
2010-12-07 20:36 1086web有struts2,spring hibernate组件 ... -
PIO的EXCEL的写入和导出
2010-11-25 14:16 2228PIO的EXCEL的字体样式,边框样式,背景色样式,下拉选择, ... -
上一篇的flex的远程对象调用,flex和spring集成分页的jar和截图
2010-06-04 22:18 1480需要的jar如附件 返回结果不需要设定特别的java对象和ac ... -
flex远程对象调用,flex和spring的集成,分页
2010-06-04 21:58 2476这里讲解四个例子 1,使用flex的远程调用方式(java的B ... -
j2ee概念规范结构学习
2010-01-11 11:19 1235J2EE规范:就是把把一系 ... -
Jboss下开发ejb应用之一消息驱动bean的应用
2010-01-06 17:28 1922Jboss下开发ejb应用之一消息驱动bean的应用,这是一篇 ... -
Jboss下开发ejb应用之一实体bean的应用
2010-01-05 16:26 1365Jboss下开发ejb应用之一 ... -
Jboss下开发ejb应用之一会话bean的应用
2010-01-05 11:57 1418Jboss下开发ejb应用之一 ... -
根据dhlayer整理的输入提示下拉列表信息
2009-09-24 11:26 1264根据dhlayer整理的输入提示下拉列表信息 这里用的是网络下 ... -
log4j的项目引用
2008-08-06 08:51 1205最近写了一个利用log4j记录方法调用信息(方法名 时间 ... -
freemarker 中的is undefined错误
2008-08-05 16:36 2143freemarker 中的is undefined错误一般都是 ... -
jasperreport报表的使用
2008-06-10 14:24 14281. 下载ireport和jasperreport。不知道就b ... -
使用dwr错误总结
2008-05-26 19:19 17071.是否在spring容器中创建了bean 2.是否在dwr. ... -
开源组件的使用总结之二
2008-05-18 13:10 1156web service 不同项目 不同系统 不同物理位置的 ...
相关推荐
这篇博客"利用iText操作PDF从数据库导出大量数据--汇总(一)"显然讨论了如何利用iText将数据库中的数据高效地导出到PDF文件中,这对于报告生成、数据分析或者报表制作等场景非常有用。 首先,我们需要了解iText的...
在这个场景中,我们需要利用iText来从数据库导出大量数据并生成PDF文件。以下是关于这个主题的详细知识: 1. **iText简介**: iText是一个开源的Java库,它提供了创建、读取、更新和签署PDF文档的功能。它支持多种...
在Java开发中,导出PDF、添加表格以及加水印是常见的需求,这些功能可以用于创建报告、发票、证书等文档。PDF(Portable Document Format)是一种广泛应用的文档格式,能够跨平台保持一致的布局和样式。下面将详细...
本教程将探讨如何利用iText库在Spring Boot应用中从HTML页面生成PDF,并进行一系列的定制化操作,如添加页眉、页码、水印、目录以及二维码。 首先,iText是一个强大的Java库,专门用于创建和编辑PDF文档。它提供了...
在JSP(JavaServer Pages)环境中,开发者经常使用iText来动态生成PDF报表,这在数据导出、报告生成或者电子发票等场景中非常常见。这个压缩包“利用iText在JSP中生成PDF报表.rar”提供了一个实例,帮助我们理解如何...
总结,iText 5.5.6是一个强大且灵活的PDF处理工具,适用于各种应用场景,从简单的文档创建到复杂的表单和数据导出。开发者可以通过其丰富的API和功能,轻松实现PDF文档的创建、编辑和安全控制,同时也能处理Excel...
它通过注解的方式简化了对Excel文件的操作,使得开发者可以更加便捷地实现数据的导入导出。尽管其功能强大,但在实际使用过程中,开发者也需要了解一些关于其依赖、错误处理以及使用的细节。 ### 如何引入jar包 在...
此外,文档还会涵盖如何处理PDF表单、添加水印、合并PDF文件、签署PDF等高级功能。 在实际应用中,iText常被用于B2B业务中的报表生成、发票制作、电子合同签署等领域。通过熟练掌握iText的API,开发者可以实现自动...
1. **直接从数据库导出**:这种情况下,程序会连接到一个数据库,查询所需的数据,然后使用iText将这些数据转换成PDF格式。这通常涉及到SQL查询、结果集处理以及数据转换为PDF元素的过程。开发者需要熟悉JDBC(Java ...
它支持动态生成文档,可以根据数据源(如数据库或XML文件)自动生成PDF报告。此外,iText还支持对已有的PDF进行修改,如添加水印、签名验证、加密和解密等功能。 描述中的"java导出pdf必须jar包"表明,在Java环境中...
6. **水印技术**:提到“水印”标签,可能是指在导出Excel或PDF等文件时,为了防止数据被滥用,添加具有版权或公司标识的水印。这通常涉及到第三方库,如Apache POI(用于处理Excel)和iText(用于处理PDF),并在...
3. **生成报表**:将填充后的报表导出为PDF或其他格式,供用户查看。 通过这种方式,不仅可以快速高效地完成报表设计,还能充分利用JasperReports的强大功能,确保报表质量的同时提升用户体验。
3. **多种数据来源支持**:它能够从各种数据源获取数据,如数据库、CSV文件、XML文件等,具有很好的数据源适应性。 4. **生成水印**:可以为报表添加水印,提高报表的安全性和专业性。 5. **子报表支持**:允许在主...