欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java整合itext?pdf實(shí)現(xiàn)自定義PDF文件格式導(dǎo)出方式

 更新時(shí)間:2025年07月09日 17:20:40   作者:一頭生產(chǎn)的驢  
Spring?Boot整合iTextPDF實(shí)現(xiàn)自定義PDF導(dǎo)出,按周次和星期顯示打卡記錄打勾,需定義數(shù)據(jù)VO、表格結(jié)構(gòu),確保所有單元格填充(含空值),測(cè)試接口生成格式正確的PDF文件

背景需求

使用PDF導(dǎo)出指定人員對(duì)應(yīng)周次的打卡記錄,每周對(duì)應(yīng)星期幾打卡過就打“√”。

如下圖:

1、導(dǎo)入依賴

導(dǎo)入itextpdf依賴

<!--       itex PDF -->
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>itextpdf</artifactId>
  <version>5.5.13.3</version>
</dependency>

2、使用代碼自定義導(dǎo)出

2.1 定義pdf數(shù)據(jù)vo對(duì)象

    // vo對(duì)象
    @Data
	class DataVo {
		/**
		 * 周次
		 */
		private String week;

		/**
		 * 打卡次數(shù)
		 */
		private int count;

		/**
		 * 周幾
		 */
		private List<Integer> days;
	}

2.2 itextpdf相關(guān)代碼

定義表格的列數(shù),同時(shí)定義每列的大小或者格式,然后再依次填充每個(gè)單元格數(shù)據(jù)

注意:需要保證填充每個(gè)單元格,即使沒數(shù)據(jù)也要填充空的數(shù)據(jù),否則出現(xiàn)文件格式不對(duì)

    // itext pdf文件構(gòu)建
	@PostMapping("/pdfExport")
	public void exportPdf(HttpServletResponse response, MyAttendanceStatisticsDto dto) {
		// 封裝好的業(yè)務(wù)數(shù)據(jù)
		List<DataVo> vos = new ArrayList<>();
		for (int i = 1; i <= 5; i++) {
			DataVo vo = new DataVo();
			vo.setWeek("第"+i+"周");
			vo.setCount(3);
			vo.setDays(CollUtil.newArrayList(i,6,7));
			vos.add(vo);
		}
        
		if(CollUtil.isNotEmpty(vos)) {
			Rectangle pageSize = PageSize.A4.rotate();
			Document document = new Document(pageSize);

			try {
				String title = "文件名"+ RandomUtil.randomString(5);
				String fileName = URLEncoder.encode("文件名"+ RandomUtil.randomString(5), "UTF-8");

				// 設(shè)置響應(yīng)文件類型PDF
				response.setContentType("application/pdf");
				response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".pdf");

				// 創(chuàng)建 PdfWriter 實(shí)例,將 PDF 內(nèi)容寫入 HTTP 響應(yīng)流,1.7版本
				PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
				writer.setPdfVersion(PdfWriter.PDF_VERSION_1_7);
				document.open();

				// 中文字體
				BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
				Font font = new Font(baseFont, 12);

				// 添加文檔標(biāo)題,居中,間距20,添加到文檔中
				Paragraph pdfTitle = new Paragraph(title, font);
				pdfTitle.setAlignment(Element.ALIGN_CENTER);
				pdfTitle.setSpacingAfter(20f);
				document.add(pdfTitle);

				// 9 列的表格,寬度占滿整個(gè)頁(yè)面
				PdfPTable table = new PdfPTable(9);
				table.setWidthPercentage(100);

				// 單獨(dú)設(shè)置前兩2寬度
				float[] columnWidths = new float[9];
				columnWidths[0] = 3f;
				columnWidths[1] = 2f;
				for (int i = 2; i < 9; i++) {
					columnWidths[i] = 1f;
				}
				table.setTotalWidth(columnWidths);

				// 添加帶斜線的單元格
				PdfPCell splitCell = new PdfPCell();
				// 綁定斜線事件
				splitCell.setCellEvent(new DiagonalLineEvent());
				// 設(shè)置單元格高度
				splitCell.setFixedHeight(30f);

				Paragraph day = new Paragraph("日", font);
				day.setAlignment(Element.ALIGN_RIGHT);
				splitCell.addElement(day);

				Paragraph month = new Paragraph("周", font);
				month.setAlignment(Element.ALIGN_LEFT);
				month.setSpacingBefore(-15f);
				splitCell.addElement(month);

				table.addCell(splitCell);
				// 添加第二列表頭“周打卡數(shù)”
				PdfPCell cell2 = new PdfPCell(new Phrase("周打卡數(shù)", font));
				cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
				cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);
				table.addCell(cell2);

				for (int i = 1; i <= 7; i++) {
					PdfPCell cell = new PdfPCell(new Phrase(String.valueOf(i), font));
					cell.setHorizontalAlignment(Element.ALIGN_CENTER);
					cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
					table.addCell(cell);
				}

				for (DataVo vo : vos) {
					PdfPCell monthCell = new PdfPCell(new Phrase(vo.getWeek(), font));
					monthCell.setFixedHeight(20f);
					monthCell.setHorizontalAlignment(Element.ALIGN_CENTER);
					monthCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
					table.addCell(monthCell);

					PdfPCell totalCell = new PdfPCell(new Phrase(String.valueOf(vo.getCount()), font));
					totalCell.setHorizontalAlignment(Element.ALIGN_CENTER);
					totalCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
					table.addCell(totalCell);

					List<Integer> days = vo.getDays();
					for (int i = 1; i <= 7; i++) {
						PdfPCell cell = null;
						if (days.contains(i)) {
							cell = new PdfPCell(new Phrase("√", font));
						} else {
							cell = new PdfPCell(new Phrase("", font));
						}
						cell.setHorizontalAlignment(Element.ALIGN_CENTER);
						cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
						table.addCell(cell);
					}
				}
				document.add(table);
			} catch (Exception e) {
				log.error("導(dǎo)出pdf文件"+e);
			} finally {
				if (document.isOpen()) {
					document.close();
				}
			}
		}
	}

3、測(cè)試結(jié)果

調(diào)用接口測(cè)試,響應(yīng)pdf文件打開如下:

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)抽獎(jiǎng)算法的示例代碼

    SpringBoot實(shí)現(xiàn)抽獎(jiǎng)算法的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何通過SpringBoot實(shí)現(xiàn)抽獎(jiǎng)算法,文中的示例代碼簡(jiǎn)潔易懂,具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下
    2023-06-06
  • windows上部署Javaweb項(xiàng)目完整圖文教程

    windows上部署Javaweb項(xiàng)目完整圖文教程

    這篇文章主要介紹了windows上部署Javaweb項(xiàng)目的相關(guān)資料,通過圖文詳細(xì)講解了配置項(xiàng)目參數(shù)、替換Eclipse相關(guān)設(shè)置、部署war包、調(diào)整server.xml配置及端口,最后通過Tomcat啟動(dòng)項(xiàng)目并訪問,需要的朋友可以參考下
    2025-06-06
  • response.setContentType()參數(shù)以及作用詳解

    response.setContentType()參數(shù)以及作用詳解

    這篇文章主要介紹了response.setContentType()參數(shù)以及作用詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java實(shí)現(xiàn)有限狀態(tài)機(jī)的推薦方案分享

    Java實(shí)現(xiàn)有限狀態(tài)機(jī)的推薦方案分享

    有限狀態(tài)機(jī)又稱有限狀態(tài)自動(dòng)機(jī),簡(jiǎn)稱狀態(tài)機(jī),是表示有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)模型,這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)有限狀態(tài)機(jī)的推薦方案,需要的朋友可以參考下
    2021-11-11
  • Java線程阻塞工具LockSupport用法詳解

    Java線程阻塞工具LockSupport用法詳解

    Java中的LockSupport是一個(gè)用于線程同步的工具類,它提供了一種基于線程的阻塞和喚醒機(jī)制,LockSupport可以讓線程在特定條件下阻塞掛起,等待其他線程發(fā)送信號(hào)來喚醒它,本文將通過一個(gè)小案例給大家介紹一下LockSupport怎么用,讓你永遠(yuǎn)記住它
    2023-08-08
  • SpringBoot中實(shí)現(xiàn)接收文件和對(duì)象

    SpringBoot中實(shí)現(xiàn)接收文件和對(duì)象

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)接收文件和對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Spring Boot(五)之跨域、自定義查詢及分頁(yè)

    Spring Boot(五)之跨域、自定義查詢及分頁(yè)

    這篇文章主要介紹了Spring Boot(五)之跨域、自定義查詢及分頁(yè)的的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 如何用java編寫一個(gè)rmi

    如何用java編寫一個(gè)rmi

    RMI能讓一個(gè)Java程序去調(diào)用網(wǎng)絡(luò)中另一臺(tái)計(jì)算機(jī)的Java對(duì)象的方法,那么調(diào)用的效果就像是在本機(jī)上調(diào)用一樣。下面我們來詳細(xì)了解一下吧
    2019-06-06
  • SpringBoot發(fā)送短信驗(yàn)證碼的實(shí)例

    SpringBoot發(fā)送短信驗(yàn)證碼的實(shí)例

    第三方短信發(fā)送平臺(tái)有很多種,各個(gè)平臺(tái)有各自的優(yōu)缺點(diǎn),在選擇的時(shí)候可以根據(jù)自己的具體實(shí)際情況定奪,本文主要介紹了SpringBoot發(fā)送短信驗(yàn)證碼的實(shí)例,感興趣的可以了解一下
    2022-02-02
  • spring boot 測(cè)試單元修改數(shù)據(jù)庫(kù)不成功的解決

    spring boot 測(cè)試單元修改數(shù)據(jù)庫(kù)不成功的解決

    這篇文章主要介紹了spring boot 測(cè)試單元修改數(shù)據(jù)庫(kù)不成功的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論