itext5 生成pdf 使用总结
2011-07-07 14:42
459 查看
最近在忙一个租赁行业的一个业务系统,其中客户要求自动生成PDF通知书文件,itext5首先生成PDF文件有两种方式,1:利用Adobe Acrobat 8 Professional专业版来制作PDF模板 2:就是用PdfWriter去生成。我个人建议第二种,因为模板定义的文本域是要框定长宽的,而业务数据往往不规则就会出现有的内容放不下有的内容就位置太大,无法动态去换行和收缩控制。但第二种去手动生成可以通过API属性来排版和自动换行等灵活的效果。下面来事例一个基本的PDF生成代码。
[/code]
Document document = new Document(PageSize.A4, 80, 79, 20, 45); // A4纸大小 左、右、上、下 /* 使用中文字体 */ BaseFont bfChinese = BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); // 中文处理 Font FontChinese = new Font(bfChinese, 14, Font.COURIER); // 其他所有文字字体 Font BoldChinese = new Font(bfChinese, 14, Font.BOLD); // 粗体 Font titleChinese = new Font(bfChinese, 20, Font.BOLD); // 模板抬头的字体 Font subFontChinese = new Font(bfChinese, 12, Font.COURIER); // 币种和租金金额的小一号字体 Font moneyFontChinese = new Font(bfChinese, 8, Font.COURIER); // 币种和租金金额的小一号字体 Font subBoldFontChinese = new Font(bfChinese, 8, Font.BOLD); // 币种和租金金额的小一号字体 PdfWriter.getInstance(document,new FileOutputStream("D:/opt/yd_apps/rim/uploadfolder/RENTAL_NOTICE/20110707/P48231_RENTAL_NOTICE_20110707.pdf")); document.open(); //打开文档 //------------开始写数据------------------- Paragraph title = new Paragraph("起租通知书", titleChinese);// 抬头 title.setAlignment(Element.ALIGN_CENTER); // 居中设置 title.setLeading(1f);//设置行间距//设置上面空白宽度 document.add(title); title = new Paragraph("致:XXX公司", BoldChinese);// 抬头 title.setSpacingBefore(25f);//设置上面空白宽度 document.add(title); title = new Paragraph(" 贵我双方签署的编号为 XXX有关起租条件已满足,现将租赁合同项下相关租赁要素明示如下:", FontChinese); title.setLeading(22f);//设置行间距 document.add(title); float[] widths = { 10f,25f,30f,30f };// 设置表格的列宽和列数 默认是4列 if(depositBean.isExpress()==5){ //如果是明示就是6列 widths = new float[]{ 8f,15f,19f,19f,19f,20f }; }else if(depositBean.isExpress()==6){ //如果是业发事业部就是7列 widths = new float[]{ 8f,15f,15f,15f,15f,16f,16f }; } PdfPTable table = new PdfPTable(widths);// 建立一个pdf表格 table.setSpacingBefore(20f);// 设置表格上面空白宽度 table.setTotalWidth(500);// 设置表格的宽度 table.setWidthPercentage(100);//设置表格宽度为%100 // table.getDefaultCell().setBorder(0);//设置表格默认为无边框 String[] tempValue = new Stirng[4]{"1","2011-07-07","2222","11.11","11.11","3000","9999"}; //租金期次列表 int rowCount=1; //行计数器 PdfPCell cell = null; //---表头 cell = new PdfPCell(new Paragraph("期次", subBoldFontChinese));//描述 cell.setFixedHeight(20); cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 设置内容水平居中显示 cell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 设置垂直居中 table.addCell(cell); cell = new PdfPCell(new Paragraph("租金日", subBoldFontChinese));//描述 cell.setFixedHeight(20); cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 设置内容水平居中显示 cell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 设置垂直居中 table.addCell(cell); cell = new PdfPCell(new Paragraph("各期租金金额", subBoldFontChinese));//描述 cell.setFixedHeight(20); cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 设置内容水平居中显示 cell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 设置垂直居中 table.addCell(cell); cell = new PdfPCell(new Paragraph("各期租金后\n剩余租金", subBoldFontChinese));//描述 cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 设置内容水平居中显示 cell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 设置垂直居中 cell.setFixedHeight(20); table.addCell(cell); for (int j = 1 ; j< tempValue.length; j++){ if(j%argument==1){ //第一列 日期 cell = new PdfPCell(new Paragraph(rowCount+"", moneyFontChinese));//描述 cell.setFixedHeight(20); cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 设置内容水平居中显示 cell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 设置垂直居中 table.addCell(cell); rowCount++; } cell = new PdfPCell(new Paragraph(tempValue[j], moneyFontChinese));//描述 cell.setFixedHeight(20); cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 设置内容水平居中显示 cell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 设置垂直居中 table.addCell(cell); } document.add(table); title = new Paragraph(" 租金总额:XXX", FontChinese); title.setLeading(22f);//设置行间距 document.add(title); title = new Paragraph(" 特此通知!", FontChinese); title.setLeading(22f);//设置行间距 document.add(title); //-------此处增加图片和日期,因为图片会遇到跨页的问题,图片跨页,图片下方的日期就会脱离图片下方会放到上一页。 //所以必须用表格加以固定的技巧来实现 float[] widthes = { 50f };// 设置表格的列宽和列数 PdfPTable hiddenTable = new PdfPTable(widthes);// 建立一个pdf表格 hiddenTable.setSpacingBefore(11f); //设置表格上空间 hiddenTable.setTotalWidth(500);// 设置表格的宽度 hiddenTable.setWidthPercentage(100);//设置表格宽度为%100 hiddenTable.getDefaultCell().disableBorderSide(1); hiddenTable.getDefaultCell().disableBorderSide(2); hiddenTable.getDefaultCell().disableBorderSide(4); hiddenTable.getDefaultCell().disableBorderSide(8); Image upgif = Image.getInstance("D:/opt/yd_apps/rim/uploadfolder/stamp1.jpg"); upgif.scalePercent(7.5f);//设置缩放的百分比%7.5 upgif.setAlignment(Element.ALIGN_RIGHT); cell = new PdfPCell(new Paragraph("", FontChinese));//描述 cell.setHorizontalAlignment(Element.ALIGN_RIGHT);// 设置内容水平居中显示 cell.addElement(upgif); cell.setPaddingTop(0f); //设置内容靠上位置 cell.setPaddingBottom(0f); cell.setPaddingRight(20f); cell.setBorder(Rectangle.NO_BORDER);//设置单元格无边框 hiddenTable.addCell(cell); cell = new PdfPCell(new Paragraph("XX 年 XX 月 XX 日 ", FontChinese));//金额 cell.setHorizontalAlignment(Element.ALIGN_RIGHT);// 设置内容水平居中显示 cell.setPaddingTop(0f); cell.setPaddingRight(20f); cell.setBorder(Rectangle.NO_BORDER); hiddenTable.addCell(cell); document.add(hiddenTable); logger.debug("拼装起租通知书结束..."); document.close();
[/code]
附件里是所需的JAR和中文字体JAR
相关文章推荐
- 使用报表开发工具Ireport生成Pdf报表的总结
- Asp.net或C#使用word模板生成替换后的Word和pdf文档-总结
- 使用报表开发工具Ireport生成Pdf报表的总结
- 使用iText生成PDF的一些实践和总结
- WinEdt7生成PDF文件中的一些使用体会
- java使用iText生成pdf表格
- 使用TCPDF撰写和生成PDF文件
- 使用jspdf生成pdf报表
- 使用Qt生成PDF文件
- 在springmvc中使用itext生成pdf文件
- 使用ITextSharp生成PDF文件心得
- [iReport总结1]iReport生成PDF文件中时的中文日文字体问题
- 生成libSVM的数据格式及使用方法总结
- StatSVN插件使用方法总结-项目代码分析工具 工作量图表生成工具
- QuaZip的源码编译和生成DLL后的使用总结
- Laravel 使用TCPDF生成PDF文档 - tcpdf
- 编程珠玑: 13章 搜索 13.2使用链表结构,生成[0 ,maxval]范围内m各随机整数的有序序列 -------解题总结
- 使用fpdf生成pdf
- .net使用DotNetCharting控件生成报表统计图总结
- 使用QPrinter生成pdf或用打印机打印数据