Bootstrap

Java|Springboot集成ItextPdf 7.2.4

1、添加Gradle依赖

        如图所示添加itextpdf 7.2.4核心包依赖,implementation 'com.itextpdf:itext7-core:7.2.4','com.itextpdf:html2pdf:5.0.0'为HTML转PDF,业务需要则添加。

2、创建PDF

A、生成PDF文件到本地 

@GetMapping("createPDF")
	public void createPDF(HttpServletResponse response){
		String fileName= fileNameEncode("病案首页");
		//创建字节输出流
		ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
		try {
			//初始化PDF
			initPDF(fileName,byteArrayOutputStream);
			FileOutputStream fileOutputStream=new FileOutputStream("C:\\Users\\DJW\\Desktop\\1.pdf");
			fileOutputStream.write(byteArrayOutputStream.toByteArray());
			fileOutputStream.flush();
			byteArrayOutputStream.close();
			fileOutputStream.close();
		}  catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

 B、返回PDF字节流

@GetMapping("createPDF")
	public void createPDF(HttpServletResponse response){
		String fileName= fileNameEncode("病案首页");
		response.setHeader("Access-Control-Allow-Origin","*");
		//设置响应内容为PDF
		response.setContentType("application/pdf;charset=UTF-8");
		//设置文件名称
		response.setHeader("Content-Disposition", "inline;filename="+fileName+".pdf");
		//创建字节输出流
		ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
		//初始化PDF
		initPDF(fileName,byteArrayOutputStream);
		try {
			response.getOutputStream().write(byteArrayOutputStream.toByteArray());
			byteArrayOutputStream.flush();
			byteArrayOutputStream.close();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

1、初始化PDF,创建PDF的Document,设置PDF标题、作者等信息。 

 CUSTOM_SONGTI_FONT为引用的字体路径,如图所示:

void initPDF(String pdfTitle,ByteArrayOutputStream byteArrayOutputStream){
		//创建PDF写入流对象
		PdfWriter pdfWriter=new PdfWriter(byteArrayOutputStream);
		//创建PDF文档
		PdfDocument pdfDocument=new PdfDocument(pdfWriter);
		//获取pdf文档信息
		PdfDocumentInfo pdfDocumentInfo= pdfDocument.getDocumentInfo();
		//设置pdf的标题
		pdfDocumentInfo.setTitle(fileNameDecode(pdfTitle));
		//设置pdf作者
		pdfDocumentInfo.setAuthor("丁家伟");
		//创建文档对象
		Document document=new Document(pdfDocument);
		pdfDocument.setDefaultPageSize(PageSize.A4);
		//添加水印
		pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE,new WaterMarkEventHandler(WATER_MARK_TEXT));
		//添加页码
		pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new PageEventHandler());
		//整个文档设置中文字体支持
		FontSet fontSet=new FontSet();
		//ttc字体必须加,0
		fontSet.addFont(CUSTOM_SONGTI_FONT+",0");

		FontProvider fontProvider=new FontProvider(fontSet);
		document.setFontProvider(fontProvider);
		//文档设置全局字体:宋体
		document.setFontFamily("SIMSUN");
		//pdfFontSongTi = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", pdfDocument);
		writePDF(document, pdfDocument);
		//组建PDF
		try {
			document.close();
			pdfWriter.close();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

 2、编辑PDF段落

void writePDF(Document document,PdfDocument pdfDocument) {
		//在pdf文档中添加1个A4纸大小的页面
		pdfDocument.addNewPage(PageSize.A4);
		//机构标题
		Paragraph paragraph0=new Paragraph("XXXXXXX医院");
		Paragraph paragraph1=new Paragraph("门诊病历");
		paragraph0.setMultipliedLeading(1.0f);
		paragraph1.setMultipliedLeading(1.0f);
		paragraph0.addStyle(PdfStyle.titleStyle());
		paragraph1.addStyle(PdfStyle.titleStyle());
		document.add(paragraph0);
		document.add(paragraph1);
		//姓名、性别、年龄
		Paragraph basicInfoP1=new Paragraph();
		basicInfoP1.setMultipliedLeading(1.0f);
		basicInfoP1.addStyle(PdfStyle.percent100Style());
		Paragraph rowP11=new Paragraph();
		rowP11.setMultipliedLeading(1.0f);
		rowP11.addStyle(PdfStyle.col3Style());
		Text t11Left=new Text("姓名:");
		Text t11Right=new Text("测试");
		t11Right.addStyle(PdfStyle.resultStyle());
		rowP11.add(t11Left);
		rowP11.add(t11Right);
		Paragraph rowP12=new Paragraph();
		rowP12.setMultipliedLeading(1.0f);
		rowP12.addStyle(PdfStyle.col3Style());
		Text t12Left=new Text("年龄:");
		Text t12Right=new Text("38岁");
		t12Right.addStyle(PdfStyle.resultStyle());
		rowP12.add(t12Left);
		rowP12.add(t12Right);
		Paragraph rowP13=new Paragraph();
		rowP13.setMultipliedLeading(1.0f);
		rowP13.addStyle(PdfStyle.col3Style());
		Text t13Left=new Text("性别:");
		Text t13Right=new Text("女");
		t13Right.addStyle(PdfStyle.resultStyle());
		rowP13.add(t13Left);
		rowP13.add(t13Right);
		basicInfoP1.setMultipliedLeading(1.0f);
		basicInfoP1.add(rowP11);
		basicInfoP1.add(rowP12);
		basicInfoP1.add(rowP13);
		document.add(basicInfoP1);
		//就诊号 就诊科室 就诊日期
		Paragraph basicInfoP2=new Paragraph();
		basicInfoP2.setMultipliedLeading(1.0f);
		basicInfoP2.addStyle(PdfStyle.percent100Style());
		Paragraph rowP21=new Paragraph();
		rowP21.addStyle(PdfStyle.col3Style());
		Text t21Left=new Text("病历号:");
		Text t21Right=new Text("2403010000541");
		t21Right.addStyle(PdfStyle.resultStyle());
		rowP21.add(t21Left);
		rowP21.add(t21Right);
		Paragraph rowP22=new Paragraph();
		rowP22.addStyle(PdfStyle.col3Style());
		Text t22Left=new Text("就诊科室:");
		Text t22Right=new Text("肛肠科");
		t22Right.addStyle(PdfStyle.resultStyle());
		rowP22.add(t22Left);
		rowP22.add(t22Right);
		Paragraph rowP23=new Paragraph();
		rowP23.addStyle(PdfStyle.col3Style());
		Text t23Left=new Text("就诊时间:");
		Text t23Right=new Text("2024-03-01 15:17:18");
		t23Right.addStyle(PdfStyle.resultStyle());
		rowP23.add(t23Left);
		rowP23.add(t23Right);
		basicInfoP2.setMultipliedLeading(1.0f);
		basicInfoP2.add(rowP21);
		basicInfoP2.add(rowP22);
		basicInfoP2.add(rowP23);
		document.add(basicInfoP2);
		//诊断
		Paragraph basicInfoP3=new Paragraph();
		basicInfoP3.setMultipliedLeading(1.0f);
		basicInfoP3.addStyle(PdfStyle.percent100Style());
		Text t31=new Text("");
		t31.setText("诊断:混合痔;肛周脓肿;");
		basicInfoP3.add(t31);
		document.add(basicInfoP3);
		//主要内容
		Paragraph paragraphMain=new Paragraph();
		paragraphMain.addStyle(PdfStyle.mainStyle());
		//设置上边框
		Border mainTopBorder=new SolidBorder(0.5f);
		paragraphMain.setBorderTop(mainTopBorder);
		//编辑主要内容
		Paragraph zsParagraph=new Paragraph();
		zsParagraph.setMultipliedLeading(1.0f);
		Text zsParagraphTitle=new Text("主诉:");
		zsParagraphTitle.setBold();
		Text zsParagraphContent=new Text("患者诉3天前和朋友在海底捞火锅店就餐,要求店家上了特特特辣锅,就餐完毕回家突感胃疼,且腹泻,大便糖稀,且带血,随即前往药店购买马应龙痔疮膏涂抹无效,今日来我院肛肠科就诊。");
		zsParagraph.add(zsParagraphTitle);
		zsParagraph.add(zsParagraphContent);
		paragraphMain.add(zsParagraph);
		//现病史
		Paragraph xbsParagraph=new Paragraph();
		xbsParagraph.setMultipliedLeading(1.0f);
		Text xbsParagraphTitle=new Text("现病史:");
		xbsParagraphTitle.setBold();
		Text xbsParagraphContent=new Text("腹泻,肛门疼痛。");
		xbsParagraph.add(xbsParagraphTitle);
		xbsParagraph.add(xbsParagraphContent);
		paragraphMain.add(xbsParagraph);
		//体格检查
		Paragraph ctParagraph=new Paragraph();
		ctParagraph.setMultipliedLeading(1.0f);
		Text ctParagraphTitle=new Text("体格检查:");
		ctParagraphTitle.setBold();
		Text ctParagraphContent=new Text("℃p82次/分r21次/分bp220/110mmhg。急性病容,步行入院,步态正常,神志清楚,对答切题,。查体合作。皮肤粘膜无黄染、皮疹、出血点。全身浅表淋巴结未触及明显肿大。双侧瞳孔等大等园,直径约2毫米,对光反射及调节均灵敏。口唇无苍白,颊粘膜无破溃,舌苔正常,舌质淡红,伸舌居中,咽充血明显,后壁见滤泡,双侧扁桃体无肿大。双肺呼吸音运动正常,触觉语颤对称,未触及皮下捻发感及胸膜摩擦感,双肺叩诊呈清音,呼吸音粗,双肺未闻及干湿性啰音,无胸膜摩擦音;心前区无隆起,心尖搏动位于左侧第v间锁骨中线内厘米处,未触及震颤,心界无明显扩大,心率82次/分,律齐,各瓣膜听诊区未闻及明显病理性杂音。");
		ctParagraph.add(ctParagraphTitle);
		ctParagraph.add(ctParagraphContent);
		paragraphMain.add(ctParagraph);
		//辅助检查
		Paragraph fzParagraph=new Paragraph();
		fzParagraph.setMultipliedLeading(1.0f);
		Text fzParagraphTitle=new Text("辅助检查:");
		fzParagraphTitle.setBold();
		Text fzParagraphContent=new Text("白细胞∕l中性细胞百分比74% 淋巴细胞比率%红细胞∕l 血红蛋白140g∕l 血小板15710^9∕l,生化全套 r-谷氨转肽酶59iu∕l 钾∕l 二氧化碳 mmol∕l 阴离子间隙 mmol∕l 尿酸 umol∕l 总胆固醇 mmol∕l 余大致正常。 x线示心影增大。8月3日胸部ct示1两肺下叶炎症伴双侧胸腔少量积液;2心脏增大,左侧冠脉钙化。8月6日电解质钠 mmol∕l。");
		fzParagraph.add(fzParagraphTitle);
		fzParagraph.add(fzParagraphContent);
		paragraphMain.add(fzParagraph);
		//既往史
		Paragraph jwsParagraph=new Paragraph();
		jwsParagraph.setMultipliedLeading(1.0f);
		Text jwsParagraphTitle=new Text("既往史:");
		jwsParagraphTitle.setBold();
		Text jwsParagraphContent=new Text("无。");
		jwsParagraph.add(jwsParagraphTitle);
		jwsParagraph.add(jwsParagraphContent);
		paragraphMain.add(jwsParagraph);
		//医生签名
		Paragraph doctorSignParagraph=new Paragraph();
		doctorSignParagraph.setMarginRight(40f);
		doctorSignParagraph.addStyle(PdfStyle.percent100Style());
		doctorSignParagraph.setTextAlignment(TextAlignment.RIGHT);
		doctorSignParagraph.setMultipliedLeading(1.5f);
		Text doctorSignTitle=new Text("医生签名:");
		doctorSignTitle.setBold();
		doctorSignParagraph.add(doctorSignTitle);
		paragraphMain.add(doctorSignParagraph);
		document.add(paragraphMain);
	}

 3、通过浏览器调用方法查看效果

;