前言

  作为开发人员,工作中难免会遇到复杂表单的导出,接下来介绍一种通过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依赖

  1. <!-- itextpdf依赖 -->
  2. <dependency>
  3. <groupId>com.itextpdf</groupId>
  4. <artifactId>itextpdf</artifactId>
  5. <version>5.5.10</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.itextpdf</groupId>
  9. <artifactId>itext-asian</artifactId>
  10. <version>5.2.0</version>
  11. </dependency>

第六步:将上面制作的pdf模板放到Resources目录下,编写PdfUtils工具类

  1. package com.whw.pdf;
  2. import com.itextpdf.text.Document;
  3. import com.itextpdf.text.DocumentException;
  4. import com.itextpdf.text.PageSize;
  5. import com.itextpdf.text.pdf.*;
  6. import java.io.*;
  7. import java.util.ArrayList;
  8. public class PdfUtils {
  9. public static void exportMapMZydPdf(String templatePath,String savePath,String fileName) throws DocumentException {
  10. ByteArrayOutputStream byteArrayOutputStream = null;
  11. PdfReader pdfReader = null;
  12. FileOutputStream fileOutputStream=null;
  13. try {
  14. fileOutputStream=new FileOutputStream(savePath+"//"+fileName);
  15. byteArrayOutputStream = new ByteArrayOutputStream();
  16. pdfReader = new PdfReader(templatePath);
  17. PdfStamper pdfStamper = new PdfStamper(pdfReader, byteArrayOutputStream);
  18. //获取模板所有域参数
  19. AcroFields acroFields = pdfStamper.getAcroFields();
  20. //解决中文字体不显示的问题
  21. BaseFont baseFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  22. ArrayList<BaseFont> fontArrayList = new ArrayList<BaseFont>();
  23. fontArrayList.add(baseFont);
  24. acroFields.setSubstitutionFonts(fontArrayList);
  25. acroFields.setField("head", "xxx同学成绩单");
  26. acroFields.setField("yuwen", "116");
  27. acroFields.setField("shuxue", "115");
  28. acroFields.setField("yingyu", "110");
  29. acroFields.setField("zhengzhi", "89");
  30. acroFields.setField("lishi", "90");
  31. acroFields.setField("shengwu", "85");
  32. acroFields.setField("dili", "83");
  33. acroFields.setField("yinyue", "78");
  34. acroFields.setField("tiyu", "88");
  35. acroFields.setField("meishu", "80");
  36. acroFields.setField("xiguan", "优秀");
  37. acroFields.setField("nengli", "优秀");
  38. acroFields.setField("xuexi", "优秀");
  39. acroFields.setField("jl", "优秀");
  40. acroFields.setField("weisheng", "良好");
  41. acroFields.setField("pingyu", " 在校表现优秀。你关心同学,有很强的集体荣誉感,对待工作细致负责,学习上也比较踏实。老师相信你还有很大潜力没有挖掘出来,你要相信自己,不断挑战自我,加油!");
  42. acroFields.setField("jc", "三号学生");
  43. acroFields.setField("school", "xx市第一高级中学");
  44. pdfStamper.setFormFlattening(true);//如果为false那么生成的PDF文件还能编辑,一定要设为true
  45. pdfStamper.flush();
  46. pdfStamper.close();
  47. //设置纸张,可以在Excel制作是设定好纸张大小
  48. Document doc = new Document(PageSize.A5);
  49. PdfCopy copy = new PdfCopy(doc,fileOutputStream);
  50. doc.open();
  51. PdfImportedPage importPage = copy.getImportedPage(new PdfReader(byteArrayOutputStream.toByteArray()), 1);
  52. try {
  53. copy.addPage(importPage);
  54. } catch (BadPdfFormatException e) {
  55. e.printStackTrace();
  56. }
  57. doc.close();
  58. } catch (IOException e) {
  59. e.printStackTrace();
  60. } finally {
  61. if (byteArrayOutputStream != null) {
  62. try {
  63. byteArrayOutputStream.close();
  64. } catch (IOException e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. if (fileOutputStream != null) {
  69. try {
  70. fileOutputStream.close();
  71. } catch (IOException e) {
  72. e.printStackTrace();
  73. }
  74. }
  75. if (pdfReader != null) {
  76. pdfReader.close();
  77. }
  78. }
  79. }
  80. public static void main(String[] args) throws IOException {
  81. try {
  82. String savePath="C://Users//hua//Desktop//";
  83. String fileName="xxx同学成绩单.pdf";
  84. exportMapMZydPdf("/成绩单模板.pdf",savePath,fileName);
  85. } catch (DocumentException e) {
  86. e.printStackTrace();
  87. }
  88. }
  89. }

第三步:运行main方法进行测试,并查看导出后的文件

项目文件:链接:https://pan.baidu.com/s/1xvrtd1HdXuImafMfrFcGrA   提取码:l0qh

写在最后

​  1、此种方式对Pdf居中自动换行支持性不好,可以根据文本域的宽度所能容纳的字数,创建多个文本域,对值进行手动分割填充到多个文本域。

​  2、C#开发时处理Excel文件可用NPOI插件进行数据导入导出,处理PDF文件可用ITextSharp插件。

  上述介绍只是导出pdf表单的一种方式,也可以直接利用itext进行手动创作pdf表单或者导出Excel或World后台转换为pdf格式等。如有其它更好的方式或建议,欢迎留言一块交流!

Java导出Pdf格式表单的更多相关文章

  1. JAVA导出pdf实例

    一.直接导出成PDF   Java代码 1. import java.io.FileNotFoundException; 2. import java.io.FileOutputStream; 3.  ...

  2. JSP页面导出PDF格式文件

    JSP页面导出PDF格式文件基本在前端页面可以全部完成 <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/ ...

  3. 获取一个表中的字段总数(mysql) Navicat如何导出Excel格式表结构 获取某个库中的一个表中的所有字段和数据类型

    如何获取一个表中的字段总数 1.function show columns from 表明: 结果 : 2.functiuon select count(*) from INFORMATION_SCH ...

  4. 相册选择头像或者拍照 上传头像以NSData 图片二进制格式 表单上传

    一.点击头像图片 或者按钮 在相册选择照片返回img,网络上传头像要用data表单上传 (1)上传头像属性 // 图片二进制格式 表单上传 @property (nonatomic, strong) ...

  5. confluence导出PDF格式文件不显示中文解决

    由于confluence导出PDF格式文件需要应用字体文件,下载字体文件在confluence管理员界面安装即可. 我这里使用从simhei.ttf楷体,可以从windowns主机里下载(c:/win ...

  6. JAVA笔记-如何将百万级数据高效的导出到Excel表单

    今天,一朋友问我使用JAVA有没有什么办法导出百万级的数据到Excel工作表. 当时我的第一个念头就是这真的是一个好疯狂的念头.然后就想假如真的有这样类似的需求,我自己应该怎么做呢? ps: 首先科普 ...

  7. java导出pdf功能记录

    这几天已在做处理导出pdf文件的功能,摸索了几天总算可以了.记录下这几天遇到的问题. 1.网上基本都是基于Itext5和Itext7来处理的.我最终是在Itext5上成功了,itext7应该是模板出问 ...

  8. html/jsp导出pdf格式的几种方法(jsPDF,iText,wkhtmltopdf)

    在许多生成报表的时候需要我们后台作出动态的数据,并渲染到前端生成pdf格式,Excel格式的各种报表,但是浏览器自带的生成pdf功能,windows系统的ctrl+p键就能完全搞定这一需求,但对客户来 ...

  9. Java导出pdf文件数据

    提示:导出pdf文件,需要3个jar包iText-2.1.5.jar,iTextAsian.jar,iText-rtf-2.1.4.jar. public boolean outputPdfJhsy( ...

随机推荐

  1. Python-变量-数字类型

    数字 number 整形 int 浮点型 float bool True(=1) False(=0) int_num = 10 float_num = 10.1 bool_True = True bo ...

  2. Go-missing return at end of function

    where? Go程序中函数在执行的时候 why? 函数有返回参数,但是函数没有return关键字,报错 way? 添加return返回函数需要返回的参数

  3. 01 C语言基本介绍

    C语言特点 容易上手学习 结构化语言 执行效率高 处理的工作和活动偏底层 可以在多种计算机平台上编译(类似Java的跨平台) C语言历史 目前,C 语言是最广泛使用的系统程序设计语言之一 C 语言是最 ...

  4. Arduino Wire.h(IIC/ I2C)语法

    转自:https://www.cnblogs.com/1996jiwei/p/6561681.html 本文转自上面链接,版权请直接参考原链接. 最近在用I2C进行通信交流,发现有两种方法的头文件需要 ...

  5. matlab中exist 检查变量、脚本、函数、文件夹或类的存在情况

    参考: 1.https://ww2.mathworks.cn/help/matlab/ref/exist.html?searchHighlight=exist&s_tid=doc_srchti ...

  6. Android作业10/07

    1.多个Activity界面实现数据的传递 <?xml version="1.0" encoding="utf-8"?> <androidx. ...

  7. BUUCTF-[极客大挑战 2019]BabySQL 1 详解

    打开靶机 应该是love sql惹的事吧,来了个加强版本的sql注入,不过我们先输入账号密码看有什么反应 整一手万能密码,闭合双引号?username=admin&password=admin ...

  8. SQL学习 小知识点(一)

    这是我在做实验的时候总结的,随着学习可能会做更多的小总结 ssms上面把所有代码写下来后一块执行是行不通的(极大可能会报错),推测可能是因为ssms先对代码的语法进行了检查.    --My expe ...

  9. pytest文档42-fixture参数化params

    前言 参数化是自动化测试里面必须掌握的一个知识点,用过 unittest 框架的小伙伴都知道使用 ddt 来实现测试用例的参数化. pytest 测试用例里面对应的参数可以用 parametrize ...

  10. php安装kafka扩展

    https://blog.csdn.net/zsl10/article/details/78743335 https://blog.csdn.net/lw545034502/article/detai ...