java实现根据pdf文件模板生成pdf文件

2023-11-15

一、如何制作pdf模板

1.首先创建template.doc

2.根据doc文件制作pdf模板

3.将doc文件输出为pdf

  文件->输出为pdf

4.输出的pdf文件

5.使用Adobe Acrobat DC打开template.pdf

6.填充文字及创作表单

      创作表单->添加“文本”域

   创作表单->编辑“表格”

*填充的字段名(比如对象Table的属性为name,这里名称后面一列的单元格填充name)

7.模板制作完毕

 

二、java生成pdf文件

1.java代码

PdfFileBlh.java:

@SuppressWarnings("unchecked")
public void exportPdfFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
		//1.获取数据 
//		String jsonString = getRequestJsonString(request);
		String jsonString = request.getParameter("jsonString");
		/*String jsonString = "{\r\n" + 
				"  \"hospitalId\":\"14064\",\r\n" + 
				"  \"hospitalName\":\"揭阳市人民医院\",\r\n" + 
				"  \"name\":\"周虎\",\r\n" + 
				"  \"gender\":\"男\",\r\n" + 
				"  \"age\":\"26岁\",\r\n" + 
				"  \"patNo\":\"0001278568\",\r\n" + 
				"  \"clinic\":\"全科医学科简易门诊\",\r\n" + 
				"  \"bedNo\":\"16床\",\r\n" + 
				"  \"specimen\":\"咽拭子\",\r\n" + 
				"  \"repNo\":\"110254767\",\r\n" + 
				"  \"serialNo\":\"0\",\r\n" + 
				"  \"doctor\":\"核酸检测号\",\r\n" + 
				"  \"applicationTime\":\"2021-02-18 15:17\",\r\n" + 
				"  \"advName\":\"新型冠状病毒核酸RNA检测(自费)\",\r\n" + 
				"  \"idType\":\"身份证\",\r\n" + 
				"  \"idNo\":\"EC3263698\",\r\n" + 
				"  \"dateOfCollection\":\"2021-02-18 15:30\",\r\n" + 
				"  \"dateOfReceipt\":\"2021-02-19 11:13\",\r\n" + 
				"  \"specimenCollector\":\"黄敏华\",\r\n" + 
				"  \"specimenReceiver\":\"钟乔华\",\r\n" + 
				"  \"dateOfInspection\":\"2021-02-19 11:15\",\r\n" + 
				"  \"dateOfReport\":\"2021-02-19 11:15\",\r\n" + 
				"  \"reportedBy\":\"陈舒兰\",\r\n" + 
				"  \"inspectedBy\":\"钟乔华\",\r\n" + 
				"  \"resultList\":[\r\n" + 
				"	{\r\n" + 
				"		\"testItems\":\"2019新型冠状病毒核酸检测\",\r\n" + 
				"		\"result\":\"阴性(-)\",\r\n" + 
				"		\"refRange\":\"阴性(-)\",\r\n" + 
				"		\"method\":\"RT-PCR\"\r\n" + 
				"	},\r\n" + 
				"	{\r\n" + 
				"		\"testItems\":\"Nucleic Acid Test For SARA-Cov-2\",\r\n" + 
				"		\"result\":\"Negative(-)\",\r\n" + 
				"		\"refRange\":\"Negative(-)\",\r\n" + 
				"		\"method\":\"RT-PCR\"\r\n" + 
				"	},\r\n" + 
				"	{\r\n" + 
				"		\"testItems\":\"2019-nCov ORFlab基因\",\r\n" + 
				"		\"result\":\"阴性Negative(-)\",\r\n" + 
				"		\"refRange\":\"阴性Negative(-)\",\r\n" + 
				"		\"method\":\"RT-PCR\"\r\n" + 
				"	},\r\n" + 
				"	{\r\n" + 
				"		\"testItems\":\"2019-nCov N基因\",\r\n" + 
				"		\"result\":\"阴性Negative(-)\",\r\n" + 
				"		\"refRange\":\"阴性Negative(-)\",\r\n" + 
				"		\"method\":\"RT-PCR\"\r\n" + 
				"	}\r\n" + 
				"  ]\r\n" + 
				"}";*/
		System.out.println("======jsonString======"+jsonString);
		if(StringUtils.isNotBlank(jsonString)) {
			//2.处理数据
			Map<String, Object> data = JsonUtils.toObject(jsonString, Map.class);
			//3.根据医院Id获取pdf模板文件
			String hospitalId = (String) data.get("hospitalId");
			String hospitalName = (String) data.get("hospitalName");
			String templatePath = request.getSession().getServletContext().getRealPath("/WEB-INF/classes/template/template_" + hospitalId + ".pdf");
			String fontPath = request.getSession().getServletContext().getRealPath("/WEB-INF/classes/template/simsun.ttc");
			System.out.println("======templatePath======"+templatePath);
			
			//4.设置响应头信息
			response.setContentType("multipart/form-data");
			response.setHeader("Content-Disposition","attachment;fileName="+new String((hospitalName + "检验报告单_").getBytes("GBK"), "ISO-8859-1") + DateUtils.formatDate(new Date(), "yyyyMMddHHmmss") + ".pdf");

			//5.指定解析器
			ServletOutputStream os = null;
			PdfStamper ps = null;
			PdfReader reader = null;
			Document doc = null;
			try {
				os = response.getOutputStream();
				// 6.读入pdf表单
				reader = new PdfReader(templatePath);
				// 7.根据表单生成一个新的pdf
				ps = new PdfStamper(reader, os);
				doc = new Document();
				// 8.获取pdf表单
				AcroFields form = ps.getAcroFields();
				// 9.给表单添加中文字体 。不设置的话,中文可能无法显示
				BaseFont bf = BaseFont.createFont(fontPath+",1", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
				form.addSubstitutionFont(bf);
				// 10.获取到明细
				List<Map<String,Object>> resultList = (List<Map<String, Object>>) data.get("resultList");
				data.remove("resultList");
				// 11.遍历data 给pdf表单表格赋值
				for (String key : data.keySet()) {
					String value = (String) data.get(key);
					form.setField(key, value);
				}
				
				// 12.处理检验明细
				if(resultList!=null && resultList.size()>0) {
					String testItems="\r\n";
					String result="\r\n";
					String refRange="\r\n";
					String method="\r\n";
					for(Map<String,Object> resultMap:resultList) {
						testItems+=resultMap.get("testItems")+"\r\n\r\n";
						result+=resultMap.get("result")+"\r\n\r\n";
						refRange+=resultMap.get("refRange")+"\r\n\r\n";
						method+=resultMap.get("method")+"\r\n\r\n";
					}
					form.setField("testItems", testItems);
					form.setField("result", result);
					form.setField("refRange", refRange);
					form.setField("method", method);
				}
				
				ps.setFormFlattening(true);
				ps.close();
				doc.open();
				doc.close();
				System.out.println("===============PDF导出成功=============");
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					os.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	public static String getRequestJsonString(HttpServletRequest request)
            throws IOException {
        String submitMehtod = request.getMethod();
        // GET
        if (submitMehtod.equals("GET")) {
          return new String(request.getQueryString().getBytes("iso-8859-1"),"utf-8").replaceAll("%22", "\"");
            // POST
        } else {
            return getRequestPostStr(request);
        }
    }
	
	public static byte[] getRequestPostBytes(HttpServletRequest request)
            throws IOException {
        int contentLength = request.getContentLength();
        if(contentLength<0){
            return null;
        }
        byte buffer[] = new byte[contentLength];
        for (int i = 0; i < contentLength;) 
        {
            int readlen = request.getInputStream().read(buffer, i,
                    contentLength - i);
            if (readlen == -1) {
                break;
            }
            i += readlen;
        }
        return buffer;
    }
	
	public static String getRequestPostStr(HttpServletRequest request)
            throws IOException {
        byte buffer[] = getRequestPostBytes(request);
        String charEncoding = request.getCharacterEncoding();
        if (charEncoding == null) {
            charEncoding = "UTF-8";
        }
        return new String(buffer, charEncoding);
    }

PdfFileController.java:

@Controller
@RequestMapping("/pdfFile")
public class PdfFileController {
	
	@Resource
	private PdfFileBlh blh;
	
	@RequestMapping(params="BLHMI=exportPdfFile")
    public void exportNoEndFormList(HttpServletRequest request, HttpServletResponse response) throws IOException {
        blh.exportPdfFile(request,response);
    }
}

2.html代码:
 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>生成PDF文件</title>
		<jsp:include page="/WEB-INF/jsp/common/scriptInc.jsp"></jsp:include>
		<jsp:include page="/WEB-INF/jsp/common/styleInc.jsp"></jsp:include>
		<script type="text/javascript">
			function exportPdfFile(){
				$("#downPdfFileForm").submit();
			}
		</script>
	</head>
	
	<body>
		<div class="">
			<div class="">
				<div id="handout_wrap_inner">
					<form id="downPdfFileForm" action="http://localhost:8080/demo/pdfFile?BLHMI=exportPdfFile" method="post">
						<input name="jsonString" value='{"hospitalId":"14064","hospitalName":"揭阳市人民医院","name":"张三","gender":"男","age":"26岁","patNo":"0001278568","clinic":"全科医学科简易门诊","bedNo":"16床","specimen":"咽拭子","repNo":"110254767","serialNo":"0","doctor":"核酸检测号","applicationTime":"2021-02-18 15:17","advName":"新型冠状病毒核酸RNA检测(自费)","idType":"身份证","idNo":"EC3263698","dateOfCollection":"2021-02-18 15:30","dateOfReceipt":"2021-02-19 11:13","specimenCollector":"黄敏华","specimenReceiver":"钟乔华","dateOfInspection":"2021-02-19 11:15","dateOfReport":"2021-02-19 11:15","reportedBy":"陈舒兰","inspectedBy":"钟乔华","resultList":[{	"testItems":"2019新型冠状病毒核酸检测",	"result":"阴性(-)",	"refRange":"阴性(-)",	"method":"RT-PCR"},{	"testItems":"Nucleic Acid Test For SARA-Cov-2",	"result":"Negative(-)",	"refRange":"Negative(-)",	"method":"RT-PCR"},{	"testItems":"2019-nCov ORFlab基因",	"result":"阴性Negative(-)",	"refRange":"阴性Negative(-)",	"method":"RT-PCR"},{	"testItems":"2019-nCov N基因",	"result":"阴性Negative(-)",	"refRange":"阴性Negative(-)",	"method":"RT-PCR"}]}'/>
					</form>
					<a href="javascript:void(0);" onclick="exportPdfFile()">下载</a>
				</div>
			</div>
		</div>
	</body>
</html>

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java实现根据pdf文件模板生成pdf文件 的相关文章

  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 为什么 java 编译器不报告 Intellij 中多播表达式的未经检查的强制转换警告?

    为什么下面的代码没有报告 Intellij IDEA 的未经检查的警告jdk 1 8 0 121自从Supplier
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a

随机推荐

  • Sklearn fit , transform ,fit_transform

    一 关于sklearn fit 和transform sklearn里的封装好的各种算法使用前都要fit fit之后 可以调用各种API方法 transform是其中一个API fit原义指的是安装 使适合的意思 有点train的含义 但是
  • Java通过正则表达式获取域名

    由于 url getHost 获取域名会有漏洞 会获取不完整 因此通过正则表达式获取域名 上代码 String url http www linuxidc com entry 4545 0 Pattern p Pattern compile
  • Nginx 第三方健康检测模块的使用

    ngx http upstream check module 模块 模块开源地址 https github com yaoweibin nginx upstream check module 官网介绍 http tengine taobao
  • linux 网络

    网络基础 协议的概念 什么是协议 从应用的角度出发 协议可理解为 规则 是数据传输和数据的解释的规则 假设 A B双方欲传输文件 规定 第一次 传输文件名 接收方接收到文件名 应答OK给传输方 第二次 发送文件的尺寸 接收方接收到该数据再次
  • tf好朋友之matplotlib的使用——subplot分格显示

    tf好朋友之matplotlib的使用 subplot分格显示 分格显示的方法 利用plt subplot2grid进行分格显示 利用gridspec GridSpec进行分格显示 应用示例 在学习matlab的时候 图像是可以分格显示的
  • 1032. 挖掘机技术哪家强(20)

    1032 挖掘机技术哪家强 20 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN Yue 为了用事实说明挖掘机技术到底哪家强 PAT组织了一场挖掘机技能大赛 现请你
  • maven仓库中_remote.repositories的作用

    首先直接给结论 remote repositories的作用是当maven本地仓库缓存了jar pom的情况下修改了maven的配置文件 settings xml 后依然会去远程仓库获取 以org slf4j slf4j api 1 5 6
  • 科创板、香港主板、纳斯达克三地部门上市条件和要求

    转自 https zhuanlan zhihu com p 69144513 科创板 香港主板 纳斯达克三地部门上市条件和要求 发布于 2019 06 14
  • 一、创建型模式:工厂方法模式(Factory Method)

    请MM去麦当劳吃汉堡 不同的MM有不同的口味 要每个都记住是一件烦人的事情 我一般采用Factory Method模式 带着MM到服务员那儿 说 要一个汉堡 具体要什么样的汉堡呢 让MM直接跟服务员说就行了 定义 核心工厂类不再负责所有产品
  • MySQL-多表关联

    多表关联 多张数据表之间是可以有一定的关联关系 这种关联关系可以通过外键约束实现 多表的分类 一对一 一对多 多对多 一对一 一张表对应另一张表 适用场景 人和身份证 一个人只能有一个身份证 一个身份证只能对应一个人 建表原则 在任意一个表
  • python爬虫实战练手——————淘宝网站的爬取

    python爬虫是很好的数据分析手段 可以进行爬虫程序来进行爬取网站 下面是淘宝的爬取 淘宝搜索书包 然后得到以下的界面 注意到下面的分页 可以通过进行分页的改变来进行多页数据的爬取 爬取多页 这里用到了和重要的re库 也就是正则表达式库
  • Windows10下Linux子系统Ubuntu使用教程(8)——升级WSL2,及解决遇到的问题

    WSL 2 是 WSL 中体系结构的新版本 它更改 Linux 发行版与 Windows 交互的方式 WSL 2 的主要目标是提高文件系统性能并增加系统调用的完全兼容性 每个 Linux 发行版都可以作为 WSL 1 或 WSL 2 发行版
  • vue 获取服务端base64位图片之后的处理

    目录 Base64是什么 Base64可以在Url中传输吗 Base64是加密算法么 Base64的应用场景有哪些 Base64的优点 Base64的缺点 关于vue中img无法展示base64位图片的原因分析 Base64是什么 Base
  • CSS-选择器的基本用法

    目录 一 CSS的分类 1 行内样式 2 内部样式 3 外部样式 二 选择器是什么 三 选择器具体种类 1 类选择器 2 标签选择器 3 ID选择器 4 通配符选择器 一 CSS的分类 1 行内样式 通过 style 属性 来指定某个标签的
  • Java实现Token的生成与验证

    二 基于JWT的token认证实现 JWT JSON Web Token 其实token就是一段字符串 由三部分组成 Header Payload Signature 1 引入依赖
  • 爬虫之简单js逆向

    本次js逆向没有存在代码混淆 所以还是比较简单的 重要的就是js逆向的思路 目标网站https notice qb com detail noticeId 215让我们开始吧 进入网站后按F12 查看DOC中的 可以看出该网页一部分内容是异
  • vue3解读—reactivity响应式实现

    前言 Vue3 中引入了proxy进行数据劫持 而effect是响应式系统的核心 而响应式系统又是 vue3 中的核心 所以vue3的解读要从 effect 开始讲起 1 reactivity和effect的使用 目前vue3的各个模块都可
  • 蓝桥杯:基础练习 特殊的数字(java实现)

    问题描述 153是一个非常特殊的数 它等于它的每位数字的立方和 即153 111 555 333 编程求所有满足这种条件的三位十进制数 输出格式 按从小到大的顺序输出满足条件的三位十进制数 每个数占一行 public class Main
  • 2014阿里巴巴9月14北京校园招聘笔试及参考答案

    form http blog csdn net lingfengtengfei article details 12344511 from http blog csdn net lingfengtengfei article details
  • java实现根据pdf文件模板生成pdf文件

    一 如何制作pdf模板 1 首先创建template doc 2 根据doc文件制作pdf模板 3 将doc文件输出为pdf 文件 gt 输出为pdf 4 输出的pdf文件 5 使用Adobe Acrobat DC打开template pd