前言
作为开发人员,工作中难免会遇到复杂表单的导出,接下来介绍一种通过Java利用模板便捷导出Pdf表单的方式
模拟需求
需求:按照下面格式导出pdf格式的学生成绩单

准备工作
- Excel软件
- Adobe Acrobat XI Pro软件
模板制作
第一步:利用Excel制作出上述表单,设置好字体、行高、列宽等,如下:

第二步:按照给定模板做好Excel表单后,删除需要后期填充的数据

第三步:打开Adobe Acrobat XI Pro软件,开始依据Excel模板制作PDF模板
1、单击创建、选择创建表单按钮

2、选择从现有文档创建,选择前面制作的Excel模板



3、点击工具,编辑表单


4、此时表单中只有一个文本域,我们可以点击添加新的文本域的形式来添加表头和结尾。也可以在pdf上添加一些其他控件。制作完成后如下:

5、可以通过鼠标在域中右键和属性中修改域的位置,字体、颜色、换行等


6、将制作好的表单保存
项目实现
第一步:创建基于maven的Java项目

第二步:引入itext的pom依赖
<!-- itextpdf依赖 --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.10</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>第六步:将上面制作的pdf模板放到Resources目录下,编写PdfUtils工具类
package com.whw.pdf;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.PageSize;import com.itextpdf.text.pdf.*;import java.io.*;import java.util.ArrayList;public class PdfUtils { public static void exportMapMZydPdf(String templatePath,String savePath,String fileName) throws DocumentException { ByteArrayOutputStream byteArrayOutputStream = null; PdfReader pdfReader = null; FileOutputStream fileOutputStream=null; try { fileOutputStream=new FileOutputStream(savePath+"//"+fileName); byteArrayOutputStream = new ByteArrayOutputStream(); pdfReader = new PdfReader(templatePath); PdfStamper pdfStamper = new PdfStamper(pdfReader, byteArrayOutputStream); //获取模板所有域参数 AcroFields acroFields = pdfStamper.getAcroFields(); //解决中文字体不显示的问题 BaseFont baseFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); ArrayList<BaseFont> fontArrayList = new ArrayList<BaseFont>(); fontArrayList.add(baseFont); acroFields.setSubstitutionFonts(fontArrayList); acroFields.setField("head", "xxx同学成绩单"); acroFields.setField("yuwen", "116"); acroFields.setField("shuxue", "115"); acroFields.setField("yingyu", "110"); acroFields.setField("zhengzhi", "89"); acroFields.setField("lishi", "90"); acroFields.setField("shengwu", "85"); acroFields.setField("dili", "83"); acroFields.setField("yinyue", "78"); acroFields.setField("tiyu", "88"); acroFields.setField("meishu", "80"); acroFields.setField("xiguan", "优秀"); acroFields.setField("nengli", "优秀"); acroFields.setField("xuexi", "优秀"); acroFields.setField("jl", "优秀"); acroFields.setField("weisheng", "良好"); acroFields.setField("pingyu", " 在校表现优秀。你关心同学,有很强的集体荣誉感,对待工作细致负责,学习上也比较踏实。老师相信你还有很大潜力没有挖掘出来,你要相信自己,不断挑战自我,加油!"); acroFields.setField("jc", "三号学生"); acroFields.setField("school", "xx市第一高级中学"); pdfStamper.setFormFlattening(true);//如果为false那么生成的PDF文件还能编辑,一定要设为true pdfStamper.flush(); pdfStamper.close(); //设置纸张,可以在Excel制作是设定好纸张大小 Document doc = new Document(PageSize.A5); PdfCopy copy = new PdfCopy(doc,fileOutputStream); doc.open(); PdfImportedPage importPage = copy.getImportedPage(new PdfReader(byteArrayOutputStream.toByteArray()), 1); try { copy.addPage(importPage); } catch (BadPdfFormatException e) { e.printStackTrace(); } doc.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (byteArrayOutputStream != null) { try { byteArrayOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (pdfReader != null) { pdfReader.close(); } } } public static void main(String[] args) throws IOException { try { String savePath="C://Users//hua//Desktop//"; String fileName="xxx同学成绩单.pdf"; exportMapMZydPdf("/成绩单模板.pdf",savePath,fileName); } catch (DocumentException e) { e.printStackTrace(); } }}第三步:运行main方法进行测试,并查看导出后的文件

项目文件:链接:https://pan.baidu.com/s/1xvrtd1HdXuImafMfrFcGrA 提取码:l0qh
写在最后
1、此种方式对Pdf居中自动换行支持性不好,可以根据文本域的宽度所能容纳的字数,创建多个文本域,对值进行手动分割填充到多个文本域。
2、C#开发时处理Excel文件可用NPOI插件进行数据导入导出,处理PDF文件可用ITextSharp插件。
上述介绍只是导出pdf表单的一种方式,也可以直接利用itext进行手动创作pdf表单或者导出Excel或World后台转换为pdf格式等。如有其它更好的方式或建议,欢迎留言一块交流!
原文转载:http://www.shaoqun.com/a/488099.html
亚马逊 海外购:https://www.ikjzd.com/w/998
三维度科技:https://www.ikjzd.com/w/1312
anker:https://www.ikjzd.com/w/1027
前言 作为开发人员,工作中难免会遇到复杂表单的导出,接下来介绍一种通过Java利用模板便捷导出Pdf表单的方式模拟需求 需求:按照下面格式导出pdf格式的学生成绩单准备工作Excel软件AdobeAcrobatXIPro软件模板制作第一步:利用Excel制作出上述表单,设置好字体、行高、列宽等,如下:第二步:按照给定模板做好Excel表单后,删除需要后期填充的数据第三步:打开AdobeAcro
aeo:https://www.ikjzd.com/w/2356
ensogo:https://www.ikjzd.com/w/1485
阳山小江银杏园好玩吗?清远阳山银杏怎么样?:http://tour.shaoqun.com/a/32203.html
瑞典旅行买什么 盘点瑞典那些创意十足的特产:http://tour.shaoqun.com/a/18271.html
三亚市区的最高峰是什么峰?:http://tour.shaoqun.com/a/43905.html
No comments:
Post a Comment