背景:前段时候公司要开发合同PDF,公司可以根据该PDF打印出一份合同。合同中有些地方需要动态生成,因此并不能完全使用Pdf模板的形式来进行开发,比如某个PDF页面需要动态生成表格,那个这个页面就不能使用pdf模板来进行开发。但是合同中大部分都是固定不变的,所以可以将固定分离出来,只用专心开发动态部分,最后再将这些PDF合并成一个PDF就行了。
知识点:
1. 使用Itext5.5动态生成表格
2. PDF合并
3.设置页面大小:查看Itext的源码可以发现 PageSize.A4 = new Rectangle(595.0F, 842.0F);//像素
工程的目录结构如下:
GenerateContactPDFUtil.java 中的代码如下:
package com.utils; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.itextpdf.text.Chunk; import com.itextpdf.text.Document; import com.itextpdf.text.Font; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Phrase; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; import com.vo.PolicyPlan; /** * *生成 合同Pdf */ public class GenerateContactPDFUtil { public static void main(String[] args) throws Exception{ String fullPath = "table.pdf"; //合同基本信息 Map<String, String> contactInfo = new HashMap<String, String>(); contactInfo.put("firstParty", "高雄"); contactInfo.put("secondParty", "北京"); contactInfo.put("peopleCount", "100"); contactInfo.put("year", "2015"); contactInfo.put("month", "8"); contactInfo.put("day", "22"); //表头 String[] policyPlans = {"险种","保险责任","保险费"}; //数据 List<PolicyPlan> policyPlanList = new ArrayList<PolicyPlan>(); PolicyPlan policyPlan1 = new PolicyPlan("CAG13","意外身故", "455"); //实体类 PolicyPlan policyPlan2 = new PolicyPlan("CAG14","民用或商用航班飞机意外伤残", "455"); PolicyPlan policyPlan3 = new PolicyPlan("CAG15","营运水上交通工具意外伤残", "455"); PolicyPlan policyPlan4 = new PolicyPlan("CAG15","营运水上交通工具意外身故", "455"); PolicyPlan policyPlan5 = new PolicyPlan("CAG16","出行无忧", "1000"); policyPlanList.add(policyPlan1); policyPlanList.add(policyPlan2); policyPlanList.add(policyPlan3); policyPlanList.add(policyPlan4); policyPlanList.add(policyPlan5); createContactPdfHead(fullPath, contactInfo, policyPlans, policyPlanList); } /** * tableHead 表头数据 * tableDataList 表中数据 * return PDF名字 */ public static void createContactPdfHead(String fullPath, Map<String, String> contactInfo, String[] tableHeads, List<PolicyPlan> tableDataList) throws Exception{ //Document doc = new Document(PageSize.B5); Document document = new Document(PageSize.A4, 80, 80, 90, 25); //设置成A4纸大小,内容距左右上下的距离 try { PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(fullPath)); document.open();//打开PDF文件进行编辑 // 插入一个段落 //设置中文字体 BaseFont baseFontChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); //1.标题字体 Font headFont = new Font(baseFontChinese , 16 , Font.BOLD); Font headFontTitle = new Font(baseFontChinese , 14 , Font.BOLD); //2.正文字体 Font contentFontFirst = new Font(baseFontChinese , 12 , Font.NORMAL); Font contentFontSecond = new Font(baseFontChinese , 10 , Font.NORMAL); //设置标题 Paragraph head1 = new Paragraph("通过Email方式提交保全申请的授权协议", headFont); head1.setAlignment(1);//设置段落居中 head1.setSpacingAfter(50); document.add(head1); //甲方 Chunk theFirstParty = new Chunk("甲方: ", headFontTitle); Chunk theFirstPartyName = new Chunk(contactInfo.get("firstParty") , headFontTitle); theFirstPartyName.setTextRise(1); //第一个参数:下划线粗细, 第二个参数:下划线Y轴位置 theFirstPartyName.setUnderline(0.5f, -3f); Phrase party = new Phrase(); party.add(theFirstParty); party.add(theFirstPartyName); Paragraph head2 = new Paragraph(party); head2.setSpacingAfter(30); document.add(head2); //乙方 Chunk theSecondParty = new Chunk("乙方: 海康人寿保险有限公司 ", headFontTitle); Chunk theSecondPartyName1 = new Chunk(contactInfo.get("secondParty") , headFontTitle); theSecondPartyName1.setTextRise(1); //第一个参数:下划线粗细, 第二个参数:下划线Y轴位置 theSecondPartyName1.setUnderline(0.5f, -3f); Chunk theSecondPartyName2 = new Chunk("分公司" , headFontTitle); Phrase secondParty = new Phrase(); secondParty.add(theSecondParty); secondParty.add(theSecondPartyName1); secondParty.add(theSecondPartyName2); Paragraph head3 = new Paragraph(secondParty); head3.setSpacingAfter(30); document.add(head3); //甲方在某某保险有限公司 分公司为 名员工投保了团体人寿保险,生效日期 年 月 日。 Chunk contentParty1 = new Chunk(" 甲方在某某保险有限公司 ", contentFontFirst); Chunk contentParty2 = new Chunk(contactInfo.get("secondParty"), contentFontFirst); contentParty2.setTextRise(1); //第一个参数:下划线粗细, 第二个参数:下划线Y轴位置 contentParty2.setUnderline(0.5f, -3f); Chunk contentParty3 = new Chunk("分公司为 ", contentFontFirst); // String companyPersonCountStr = "100";//100个人 Chunk contentParty4 = new Chunk(contactInfo.get("peopleCount"), contentFontFirst); contentParty4.setTextRise(1); //第一个参数:下划线粗细, 第二个参数:下划线Y轴位置 contentParty4.setUnderline(0.5f, -3f); Chunk contentParty5 = new Chunk("名员工投保了团体人寿保险," , contentFontFirst); //生效日期 年 月 日。 Chunk effectiveDate = new Chunk("生效日期 ", contentFontFirst); // String yearStr = "2014"; Chunk yearParty = new Chunk(contactInfo.get("year"), contentFontFirst); yearParty.setTextRise(1); //第一个参数:下划线粗细, 第二个参数:下划线Y轴位置 yearParty.setUnderline(0.5f, -3f); Chunk yearPartyName = new Chunk("年 ", contentFontFirst); // String monthStr = "12"; Chunk monthParty = new Chunk(contactInfo.get("month"), contentFontFirst); monthParty.setTextRise(1); //第一个参数:下划线粗细, 第二个参数:下划线Y轴位置 monthParty.setUnderline(0.5f, -3f); Chunk monthPartyName = new Chunk("月 ", contentFontFirst); // String dayStr = "12"; Chunk dayParty = new Chunk(contactInfo.get("day"), contentFontFirst); dayParty.setTextRise(1); //第一个参数:下划线粗细, 第二个参数:下划线Y轴位置 dayParty.setUnderline(0.5f, -3f); Chunk dayPartyName = new Chunk("日 ", contentFontFirst); Phrase contentPhrase = new Phrase(); contentPhrase.add(contentParty1); contentPhrase.add(contentParty2); contentPhrase.add(contentParty3); contentPhrase.add(contentParty4); contentPhrase.add(contentParty5); contentPhrase.add(effectiveDate); contentPhrase.add(yearParty); contentPhrase.add(yearPartyName); contentPhrase.add(monthParty); contentPhrase.add(monthPartyName); contentPhrase.add(dayParty); contentPhrase.add(dayPartyName); Paragraph head4 = new Paragraph(contentPhrase); head4.setSpacingAfter(10); document.add(head4); //保险方案: Paragraph insuredPlanParagraph = new Paragraph("保险方案:",contentFontFirst); insuredPlanParagraph.setIndentationLeft(20);//设置左侧缩进E insuredPlanParagraph.setSpacingAfter(10); document.add(insuredPlanParagraph); PdfPTable policyPlanTable = new PdfPTable(tableHeads.length); //设置表格有多少列 int width[] = {20,60,20};//设置每列宽度比例 policyPlanTable.setWidths(width); policyPlanTable.setWidthPercentage(100);//占页面宽度比例 //设置表格中单元格的属性,所有单元格都可以使用 PdfPCell pdfPCell = new PdfPCell();//创建一个单元格 //设置字体水平居中 pdfPCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);//设置水平对齐 //设置字体垂直对齐居中 pdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); //保险方案内容: for(String head : tableHeads){ pdfPCell.setPhrase(new Phrase(head , contentFontFirst)); policyPlanTable.addCell(pdfPCell); } policyPlanTable.completeRow(); for(PolicyPlan policyPlan : tableDataList){ pdfPCell.setPhrase(new Phrase(policyPlan.getRiskCode(), contentFontFirst)); policyPlanTable.addCell(pdfPCell); pdfPCell.setPhrase(new Phrase(policyPlan.getLiability(), contentFontFirst)); policyPlanTable.addCell(pdfPCell); pdfPCell.setPhrase(new Phrase(policyPlan.getFee(), contentFontFirst)); policyPlanTable.addCell(pdfPCell); policyPlanTable.completeRow();//完成行 } document.add(policyPlanTable); //团体告知: Paragraph groupInformingParagraph = new Paragraph("团体告知:",contentFontFirst); groupInformingParagraph.setIndentationLeft(20);//设置左侧缩进E groupInformingParagraph.setSpacingBefore(20); groupInformingParagraph.setSpacingAfter(10); document.add(groupInformingParagraph); //团体告知内容: //1.设置表格属性 PdfPTable groupInformingTable = new PdfPTable(2); int groupInfowidth[] = {85,15};//设置每列宽度比例 groupInformingTable.setWidths(groupInfowidth); groupInformingTable.setWidthPercentage(100);//占页面宽度比例 //1.设置单元格样式 //1.1informingInfo style PdfPCell informingInfoPdfPCell = new PdfPCell();//创建一个单元格 //设置字体水平居中 informingInfoPdfPCell.setHorizontalAlignment(PdfPCell.LEFT);//设置左对齐 //设置字体垂直对齐居中 informingInfoPdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); //1.2 select style PdfPCell checkBoxPdfPCell = new PdfPCell();//创建一个单元格 //设置字体水平居中 checkBoxPdfPCell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);//设置水平对齐 //设置字体垂直对齐居中 checkBoxPdfPCell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); //1.第一条 informingInfoPdfPCell.setPhrase(new Phrase("1、 目前是否有正在病假中(产假除外),且不在岗时间达到或超过10个工作日的人员?", contentFontSecond)); groupInformingTable.addCell(informingInfoPdfPCell); checkBoxPdfPCell.setPhrase(new Phrase("囗是 囗否" , contentFontSecond)); groupInformingTable.addCell(checkBoxPdfPCell); groupInformingTable.completeRow(); //2.第二条 informingInfoPdfPCell.setPhrase(new Phrase("2、 目前是否有需要长期(一年累计超过30天)接受住院治疗的人员?", contentFontSecond)); groupInformingTable.addCell(informingInfoPdfPCell); checkBoxPdfPCell.setPhrase(new Phrase("囗是 囗否" , contentFontSecond)); groupInformingTable.addCell(checkBoxPdfPCell); groupInformingTable.completeRow(); //3.第三条 informingInfoPdfPCell.setPhrase(new Phrase("3、 近期1年内是否有因患疾病而不能全勤或全量工作,实际工作时长或工作量低于正常1/2的人员?", contentFontSecond)); groupInformingTable.addCell(informingInfoPdfPCell); checkBoxPdfPCell.setPhrase(new Phrase("囗是 囗否" , contentFontSecond)); groupInformingTable.addCell(checkBoxPdfPCell); groupInformingTable.completeRow(); //第4条 informingInfoPdfPCell.setPhrase(new Phrase("4、 目前或过去是否有以下情况被保险人人员? \n (1)曾接受器官移植手术或造血干细胞移植手术、主动脉手术、冠状动脉搭桥术或冠状动脉支架植入术;\n (2)腕关节或踝关节近躯干端以上完全缺失、深度昏迷状态、双耳失聪或双目失明、严重Ⅲ度烧伤、智力或神经障碍、语言能力丧失。", contentFontSecond)); groupInformingTable.addCell(informingInfoPdfPCell); checkBoxPdfPCell.setPhrase(new Phrase("囗是 囗否" , contentFontSecond)); groupInformingTable.addCell(checkBoxPdfPCell); groupInformingTable.completeRow(); //第五条 informingInfoPdfPCell.setPhrase(new Phrase("5、 有无员工的职业涉及或接触任何危险物(化学物质、爆炸物、有毒物质或其他危险物)、高空作业、潜水或水下作业、隧道坑道或井下作业等危险工作?", contentFontSecond)); groupInformingTable.addCell(informingInfoPdfPCell); checkBoxPdfPCell.setPhrase(new Phrase("囗是 囗否" , contentFontSecond)); groupInformingTable.addCell(checkBoxPdfPCell); groupInformingTable.completeRow(); document.add(groupInformingTable); } catch (Exception e) { e.printStackTrace(); } finally { document.close(); } } }
生成的PDF见附件。。。。
问题:
1.在使用itext5.5 时 中文不显示。
解决:在使用Itext5.5时,就不能使用老版本itext-asian.jar包了,应该使用更新版本的itext-asian.jar。细心的你可以发现老板的itext-asian与新版本的itext-asian的结构不一样。附件中提供了与itext5.5匹配的itext-asian供大家下载。
相关推荐
1. **PDF创建**:iText可以动态生成PDF文档,允许开发者通过编程方式添加文本、图像、表格、链接等各种元素。 2. **PDF操作**:除了创建PDF,iText还支持修改和解析已存在的PDF文档,例如添加或删除页面、填充表单...
首先,iTextPDF的核心在于其 PdfWriter 类,它是生成PDF文件的关键。PdfWriter允许开发者创建一个新的PDF文档,或者向已存在的PDF文档添加内容。通过创建一个PdfWriter实例,开发者可以指定输出流(如文件或内存流)...
在IT行业中,生成PDF文档和处理二维码是常见的需求。这里我们关注的是如何使用iText5、ZXing和QRCore这三款工具来实现这一目标。首先,iText5是一款强大的Java库,主要用于创建和编辑PDF文档,而ZXing(Zebra ...
3. **PDF表格自动分页**: 在生成PDF文档时,如果一个表格太长以至于无法在一页内完全显示,iTextPDF可以自动将其分页。通过调整表格属性,如行高、列宽,以及设置分页策略,可以确保表格在每一页上都保持完整的结构...
iText是一款广泛应用于PDF文档处理的Java库,尤其在生成、编辑和操作PDF文档方面表现卓越。本资源包包含了iText 5.5.11版本的组件,以及专门针对亚洲语言支持的itext-asian5.20.jar,同时提供了加水印和去水印的代码...
它包含了各种API,如PdfWriter和PdfReader,用于生成和读取PDF文件,还有PdfStamper,用于在已有的PDF上添加或修改内容。此外,它还支持表格、列表、图像、超链接等元素的插入,以及复杂的布局和格式设置。 `itext-...
这个压缩包包含了两个主要的JAR文件:`itext-asian-5.2.0.jar`和`itextpdf-5.5.13.1.jar`,它们在处理PDF文件时扮演着重要的角色。 `itext-asian-5.2.0.jar`是iText的一个扩展,主要是为了支持亚洲语言,如中文、...
iText 5.5.5 jar 文件是这个库的可执行组件,包含了所有必要的类和方法,使得开发者无需深入了解PDF规范就能实现复杂的PDF操作。 1. PDF生成:iText允许开发者通过编程方式创建PDF文档。你可以动态添加文本、图像、...
iTextPDF作为一个强大的PDF操作工具包,为开发者提供了丰富的API,使得生成、编辑PDF文件变得简单易行。本文将详细探讨iTextPDF 5.5.5版本的核心功能和使用方法。 iTextPDF是iText库的一个子项目,专注于PDF文档的...
10. **PDF版本兼容**:iText库生成的PDF文件可以遵循不同的PDF标准,如PDF/A、PDF/UA等,满足不同应用场景的需求。 在实际项目中,开发者通常会结合这两个JAR文件,利用iText提供的API来实现各种PDF相关的功能。...
它可以用于生成PDF报告、填充PDF表单、提取文本和图像等。在我们的场景中,ITEXT主要用于读取PDF文档的内容。 接下来,PDFBOX是Apache软件基金会的一个开源项目,它提供了一系列API来处理PDF文档。PDFBOX的功能包括...
共3个方法,一个是生成pdf,第2个是加文字水印,第3个是加图片水印 public static void main(String[] args) { String filepath = "C:\\Users\\igiroad\\Desktop\\申请汇总表 (3).xls"; String pdffilepath = ...
在IT行业中,生成PDF文档是常见的需求,尤其是在报表、发票或复杂的文档格式化场景中。Itext是一个流行的Java库,用于创建和修改PDF文档。本文将深入探讨如何使用Itext来输出复杂的PDF表格,并实现样式参数的外部...
然后,你可以使用`PdfWriter`将`Document`对象与实际的PDF文件关联起来。 2. **添加内容**:`Paragraph`、`Chunk`、`Font`等类用于构建文本内容。`Image`类则用于插入图片。你可以使用`Table`类创建表格,`List`类...
总的来说,iTextPDF是Java开发中一个不可或缺的工具,特别是在Web项目中生成PDF文档时。理解并选择合适的版本是成功应用的关键,同时也要注意许可证问题和API的更新。在实际使用中,应根据项目需求和资源限制来做出...
在IT行业中,生成PDF文档是一项常见的任务,特别是在报告、合同或者技术文档的制作上。iText是一个强大的Java库,专门用于创建和修改PDF文档。在这个“itext设置段落行间距.zip”压缩包中,包含了解决PDF生成过程中...
使用ItextCore生成PDF文件时,通常会涉及到以下几个关键步骤: 1. 创建PdfWriter实例,指定输出的PDF文件路径。 2. 创建PdfDocument对象,通过PdfWriter实例初始化。 3. 创建Document对象,它代表PDF文档的整体结构...
通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 iText的安装:下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。
这个例子会生成一个名为"output.pdf"的PDF文件,内容是HTML字符串的转换结果。需要注意的是,iText对HTML的支持有限,可能无法完美地呈现复杂的CSS样式和JavaScript。如果需要更高级的功能,如精确的CSS支持,可能...
例如,开发者可以通过查阅文档了解如何使用`PdfWriter`创建PDF文件,`PdfReader`读取已存在的PDF,或者`PdfStamper`对PDF进行修改。 iText-5.5.10是这个版本的特定标识,意味着这个版本修复了一些已知问题,可能...