java开发html转pdf 解决方案

本文介绍了一种将HTML转换为PDF的方法,包括所需jar包、HTML示例、Java代码实现及注意事项。通过设置字体确保中文正常显示,并提供了一个简单的示例项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    之前在工作中遇到过一个需求,是将用户填写的申报,由固定模板的来生成pdf,后来想到先把内容生成html,

然后再把html格式的内容转换成pdf。

    之前在网上找了很多,有很多内容都是转载的,后来折腾了好几天才试出一个真实能用的,所以在这里记录一下。方便以后查阅,也希望能帮到别人。

1.所需jar包

 core-renderer.jar ,iText-2.0.8.jar

2、示例html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head >
<meta charset="utf-8" /> 
<style> 
	 body{ padding:0; margin:0; font-family:SimSun; color: red} 

</style>
 </head>	
		
<body>
 <h1>2233322dsss--你好--dss2</h1>
 
  <img alt="w2" width="100px" height="100px" src="http://tva4.sinaimg.cn/crop.0.0.180.180.50/9907976cjw1e8qgp5bmzyj2050050aa8.jpg"/>
 </body>
 </html>

html中要注意的是字体的设置,

font-family:SimSun;

在下面的java代码中,也需要加载对应的字体,不然会出现中文显示不出来的情况

3、java代码

package wqb.pdf.test;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.pdf.BaseFont;

/**
 * html转pdf
 * 
 * @author wqb
 *
 */
public class PdfDemoTest {

	public static void main(String[] args) throws Exception {

		//读取html的流
		InputStream inputStream = PdfDemoTest.class.getResourceAsStream("test.html");
		
		//流转换成字符串
		StringBuffer out = new StringBuffer();
		byte[] b = new byte[4096];
		for (int n; (n = inputStream.read(b)) != -1;) {
			out.append(new String(b, 0, n));
		}

		String html = out.toString();
		String pdffile = "C:\\wqb\\test.pdf";

		OutputStream os = new FileOutputStream(pdffile);
		ITextRenderer renderer = new ITextRenderer();
		renderer.setDocumentFromString(html);
		// writer.setPageEvent(header);
		ITextFontResolver fontResolver = renderer.getFontResolver();
		// 添加字体支持,路径可以自身项目的实际情况设置,我这里是本地项目,而且为了方便测试,就写成固定的了
		// 实际项目中,可以获取改字体所在真实的服务器的路径,这个方法是本地地址和网络地址都支持的
		// 这里面添加的是宋体
		fontResolver.addFont("C:\\software\\eclipse-neon\\workspace\\htmlToPdfDemo\\bin\\SIMSUN.TTC",
				BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

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

	}
}

4、实际效果

总结:示例代码比较简单,只是单纯的实现了导出pdf而已。在真实业务场景中,html的内容一般是用template或者Velocity 生成。并且字体的路径也不能写死,可以根据自己的项目情况采用合适的读取办法。

需要注意的是字体,一定要设置!!!

对html的规范要求极高,例如:页面中<mate></mate> 等标签必须闭合!!!

示例代码下载地址

比较缺分,所以资源要分了。谅解

------------------------------------------------------码农专用分割线------------------------------------------------------

        上面描述的方法,适用环境是传统的mvc模式的java项目,同时比较适合简单的内容的pdf,局限性比较强。在目前这种前后端分离的大环境下,已经不是太试用了。

        在后面做的项目中,发现了下面一款开源的可独立部署的 web打印和html转pdf工具,比较适合在前后分离的项目 中使用 ,推荐给大伙。我在实际上面中用到了,效果非常好,强烈推荐

bookjs-eazy: WEB打印,HTML转PDF工具。适配chrome headless和wkhtmltopdf docker镜像在线生成PDF 1. 只需专注用H5构件你的PDF内容,而无需关心分页及内容截断问题,内容满了,自动换页,支持预览、WEB打印、页码/目录、自定义页眉页脚。2.前后端皆可生成PDF,命令行PDF生成工具 - Gitee.com

bookjs-easy 的独立部署的pdf下载服务,使用nodejs部署或者直接用docker

screenshot-api-server: 使用node express和puppeteer搭建的WEB截图API服务 网页截图 & pdf 生成 API服务 & docker镜像

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值