Java生成pdf文件

这篇博客介绍了如何使用Maven依赖来构建Java项目,特别是针对iTextPDF库,用于生成包含中文和CSS样式的PDF报告。通过解析JSON数据,生成HTML字符串,并利用iTextPDF和相关库将其转换为PDF文件。示例代码展示了从模板创建PDF,包括设置字体、样式和表格布局的过程。
摘要由CSDN通过智能技术生成

maven引用

<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>itextpdf</artifactId>
  <version>5.5.11</version>
</dependency>
<!-- 支持中文 -->
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>itext-asian</artifactId>
  <version>5.2.0</version>
</dependency>
<!-- 支持css样式渲染 -->
<dependency>
  <groupId>org.xhtmlrenderer</groupId>
  <artifactId>flying-saucer-pdf-itext5</artifactId>
  <version>9.1.16</version>
</dependency>
<!-- 转换html为标准xhtml包 -->
<dependency>
  <groupId>net.sf.jtidy</groupId>
  <artifactId>jtidy</artifactId>
  <version>r938</version>
</dependency>
<dependency>
  <groupId>com.itextpdf.tool</groupId>
  <artifactId>xmlworker</artifactId>
  <version>5.5.13.2</version>
</dependency>

Java代码

/**
 * 导出PDF
 * @param jsonStr
 * @return
 * @throws IOException
 */
@RequestMapping(value = "/exportPDF")
public ResponseEntity<byte[]> exportPDF(String jsonStr) throws IOException {

	// 查询数据
	JSONObject key = JSONObject.parseObject(jsonStr);
	JSONObject jo = projectService.loadPVReport(key);
	JSONArray ja = jo.getJSONArray("data");

	String tempPath = this.getClass().getResource("/templates").toString().substring(6);
	String templateFileName = tempPath + File.separator + "PVReportTemplate.xlsx";

	Calendar calendar = Calendar.getInstance();
	int year = calendar.get(Calendar.YEAR);
	String fileName = year + "年度工程项目_" + (int)(Math.random()*1000) + ".pdf";
	String filePath = FileUtils.getFilePath("/temp") + "/" + fileName;

	try {

		StringBuffer html = new StringBuffer();
		html.append("<!DOCTYPE html>");
		html.append("<html lang=\"en\">").append("<head>").append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />")
				.append("<style type=\"text/css\" mce_bogus=\"1\">body {font-family: SimSun;} @page {size: 297mm 210mm;} th, td { border: 1px solid #000; font-size: 10px;} .numberTD { width: 70px; text-align: right;}</style>")
				.append("</head>")
				.append("<body>").append("<table style=\"width: 100%; border-collapse: collapse;\" cellspacing=\"0\" cellpadding=\"5\" border-collapse=\"collapse\">")
				.append("<tr><th colspan=\"11\" style=\"font-size: 20px; text-align: center;\">").append(year).append("年度工程项目</th></tr>");
		html.append("<tr><td colspan=\"11\">部室:").append(key.getString("deptName")).append("</td></tr>");

		html.append("<tr><td colspan=\"11\" style=\"color: red;\">备注:1、只统计在建项目和中标未开工项目;2、未开工项目备注预计开工时间;3、运维项目备注合同起止日期;4、备注栏简要说明项目性质,如:“安防监控机电设备安装”、“收费系统运营维护”等。</td></tr>");

		html.append("<tr><td colspan=\"2\" style=\"text-align: center; border: 0;\">制表:</td><td style=\"border: 0;\"></td><td style=\"border: 0;\"></td>");
		html.append("<td colspan=\"2\" style=\"text-align: center; border: 0;\">复核(签字):</td><td style=\"border: 0;\"></td><td style=\"border: 0;\"></td>");
		html.append("<td style=\"border: 0;\"></td><td style=\"border: 0;\"></td><td style=\"border: 0;\"></td></tr></table>");

		html.append("</body></html>");

		OutputStream os = new FileOutputStream(filePath);
		ITextRenderer renderer = new ITextRenderer();
		ITextFontResolver fontResolver = renderer.getFontResolver();
		fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
		renderer.setDocumentFromString(html.toString());

		renderer.layout();
		renderer.createPDF(os);
		os.close();

	} catch (Exception e) {
		e.printStackTrace();
	}

	InputStream is = new FileInputStream(filePath);
	byte[] body = new byte[is.available()];
	is.read(body);
	HttpHeaders headers = new HttpHeaders();
	headers.add("Content-Disposition", "attchement;filename=" + URLEncoder.encode(fileName, "utf-8"));
	HttpStatus statusCode = HttpStatus.OK;
	ResponseEntity<byte[]> entity = new ResponseEntity<>(body, headers, statusCode);
	return entity;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值