使用 itext 和 flying-saucer 实现 html 转 PDF

前言:工作中,需要将存储的 html 代码转化成pdf,用于数据固化以及方便的在各平台展示,经研究,使用 flying-saucer 来实现这一需求。

构建方式:

  • maven 构建
<!-- FlyingSaucer依赖 https://mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf -->
<dependency>
	<groupId>org.xhtmlrenderer</groupId>
	<artifactId>flying-saucer-pdf</artifactId>
	<version>9.0.1</version>
</dependency>
  • jar 包构建
    访问以下链接获取相关jar包,所需 jar 为 iText-2.1.7.jar,flying-saucer-core-9.0.1.jar 和 flying-saucer-pdf.jar

itext:https://github.com/itext/itextpdf

flying-saucer:https://github.com/flyingsaucerproject/flyingsaucer

代码实现

package com.xymy.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;

public class HtmlToPdf {

    public static void main(String[] args) throws Exception {
        htmlFileToPDF();
        
        htmlStringToPdf();
    }

    /**
     * htmlStringToPdf:(html字符串转换成pdf). <br/> 
     * @author xymy
     * @date 2018年11月8日下午2:59:07
     * @throws Exception
     */
    private static void htmlStringToPdf() throws Exception {
        ITextRenderer renderer = new ITextRenderer();  
        ITextFontResolver fontResolver = renderer.getFontResolver();  
        fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        String outFile = "C:/Users/xymy/Desktop/test2.pdf";
        OutputStream os = new FileOutputStream(outFile);
        String htmlstr = "<body style=\"font-family: SimSun\">" + " <p>    </p><div><div style=\"font-family: C39HrP60DhTt;font-size: 60px;POSITION: absolute; LEFT: 500px;  TOP: 80px;display:none;\"></div><div>\n" + 
            "   <div class=\"box_border\" style=\"border: thin solid rgb(0, 0, 0);\">\n" + 
            "   <div class=\"title\" style=\"width: 95%; margin-bottom: 20px;\"><p style=\"width: 100%; text-align: center; font-size: 16px; color: rgb(0, 0, 0);\">\n" + 
            "   \n" + 
            "   \n" + 
            "               \n" + 
            "                   \n" + 
            "                   不予行政许可通知书(客户联)                  \n" + 
            "               \n" + 
            "           </p></div><div class=\"top\" style=\"border-bottom: 1px dashed rgb(51, 51, 51); min-height: 150px; padding-bottom: 3px;\"><p>负责部门名称:测试单位-审批局            \n" + 
            "</p><p>办件流水号:2018124442</p>\n" + 
            "\n" + 
            "               <p>\n" + 
            "                   \n" + 
            "               </p>\n" + 
            "           \n" + 
            "           \n" + 
            "               <p>\n" + 
            "               项目名称:测试项目zwd003             </p>\n" + 
            "           \n" + 
            "           \n" + 
            "           <p>\n" + 
            "               \n" + 
            "                   \n" + 
            "                   \n" + 
            "                   \n" + 
            "                       企业名称:\n" + 
            "                   \n" + 
            "                   \n" + 
            "                   世界500强          \n" + 
            "</p><p>\n" + 
            "   \n" + 
            "       \n" + 
            "                   \n" + 
            "                   \n" + 
            "                       企业地址:\n" + 
            "                   \n" + 
            "                   \n" + 
            "                   广州          \n" + 
            "</p><p>客户联系方式:13751327669<span class=\"span_2\" style=\"margin-left: 120px;\">客户联系人:测试</span></p><p>\n" + 
            "               代理人:</p></div><div class=\"content\" style=\"margin-top: 15px; border-bottom: 1px dashed rgb(51, 51, 51); padding-bottom: 2px; min-height: 350px;\"><p>审批事项名称:新企业事项-ylp</p><p>\n" + 
            "   <strong>本部门已于\n" + 
            "                   2018-01-15 14:34:16\n" + 
            "                       将此件办理完毕。                </strong>\n" + 
            "           </p><p>\n" + 
            "   批准结果:\n" + 
            "               \n" + 
            "                   \n" + 
            "                   不批准             \n" + 
            "           \n" + 
            "</p><p>\n" + 
            "   \n" + 
            "       \n" + 
            "   </p>\n" + 
            "\n" + 
            "               \n" + 
            "               \n" + 
            "                   <p class=\"content_p3\">\n" + 
            "                       不批准理由:                  </p>\n" + 
            "               <p class=\"content_p4\">\n" + 
            "                   可以办理                </p>\n" + 
            "               \n" + 
            "           \n" + 
            "\n" + 
            "   <p class=\"content_p6\">\n" + 
            "       <strong>(若对本决定不服,可以直接到本决定之日起60日内,依法申请行政复议,也可以在三个月内依法向人民法院提出行政诉讼。)</strong>\n" + 
            "   </p>\n" + 
            "\n" + 
            "       </div><div class=\"footer\" style=\"margin-top: 15px; width: 100%; padding-bottom: 25px; bottom: 0px;\">        <p>部门窗口负责人:审批局单位管理员<span class=\"footer_span4\" style=\"margin-left: 182px;\">经办日期:2018-01-15 14:25:51</span></p><p>经办人:窗口测试001<span class=\"footer_span3\" style=\"margin-left: 150px; display: inline-block;\">监督电话:020-66666666</span></p><p>部门窗口联系电话:020-22222222</p><p style=\"margin-left:410px;margin-top:40px\">(部门行政审批专用章盖印)</p><p>打印人:窗口测试001<span class=\"footer_span3\" style=\"margin-left: 150px; display: inline-block;\">打印日期:</span>2018-01-15 14:34:21</p></div> \n" + 
            "   </div></div></div><div style=\"page-break-before:always\"><br/></div><div><div style=\"font-family: C39HrP60DhTt;font-size: 60px;POSITION: absolute; LEFT: 500px;margin-top:50px;z-index:-1;display:none;\"></div><div>\n" + 
            "   <div class=\"box_border\" style=\"border: thin solid rgb(0, 0, 0);\">\n" + 
            "   <div class=\"title\" style=\"width: 95%; margin-bottom: 20px;\"><p style=\"width: 100%; text-align: center; font-size: 16px; color: rgb(0, 0, 0);\">\n" + 
            "   \n" + 
            "   \n" + 
            "               \n" + 
            "                   \n" + 
            "                   不予行政许可通知书(存根联)                  \n" + 
            "               \n" + 
            "           </p></div><div class=\"top\" style=\"border-bottom: 1px dashed rgb(51, 51, 51); min-height: 150px; padding-bottom: 3px;\"><p>负责部门名称:测试单位-审批局            \n" + 
            "</p><p>办件流水号:2018124442</p>\n" + 
            "\n" + 
            "               <p>\n" + 
            "                   \n" + 
            "               </p>\n" + 
            "           \n" + 
            "           \n" + 
            "               <p>\n" + 
            "               项目名称:测试项目zwd003             </p>\n" + 
            "           \n" + 
            "           \n" + 
            "           <p>\n" + 
            "               \n" + 
            "                   \n" + 
            "                   \n" + 
            "                   \n" + 
            "                       企业名称:\n" + 
            "                   \n" + 
            "                   \n" + 
            "                   世界500强          \n" + 
            "</p><p>\n" + 
            "   \n" + 
            "       \n" + 
            "                   \n" + 
            "                   \n" + 
            "                       企业地址:\n" + 
            "                   \n" + 
            "                   \n" + 
            "                   广州          \n" + 
            "</p><p>客户联系方式:13751327669<span class=\"span_2\" style=\"margin-left: 120px;\">客户联系人:测试</span> </p><p>\n" + 
            "               代理人:</p></div><div class=\"content\" style=\"margin-top: 15px; border-bottom: 1px dashed rgb(51, 51, 51); padding-bottom: 2px; min-height: 350px;\"><p>审批事项名称:新企业事项-ylp</p><p>\n" + 
            "   <strong>本部门已于\n" + 
            "                   2018-01-15 14:34:16\n" + 
            "                       将此件办理完毕。                </strong>\n" + 
            "           </p><p>\n" + 
            "   批准结果:\n" + 
            "               \n" + 
            "                   \n" + 
            "                   不批准             \n" + 
            "           \n" + 
            "</p><p>\n" + 
            "   \n" + 
            "       \n" + 
            "   </p>\n" + 
            "\n" + 
            "               \n" + 
            "               \n" + 
            "                   <p class=\"content_p3\">\n" + 
            "                       不批准理由:                  </p>\n" + 
            "               <p class=\"content_p4\">\n" + 
            "                   可以办理                </p>\n" + 
            "               \n" + 
            "           \n" + 
            "\n" + 
            "   <p class=\"content_p6\">\n" + 
            "       <strong>(若对本决定不服,可以直接到本决定之日起60日内,依法申请行政复议,也可以在三个月内依法向人民法院提出行政诉讼。)</strong>\n" + 
            "   </p>\n" + 
            "\n" + 
            "       </div><div class=\"footer\" style=\"margin-top: 15px; width: 100%; padding-bottom: 25px; bottom: 0px;\">        <p>部门窗口负责人:审批局单位管理员<span class=\"footer_span4\" style=\"margin-left: 182px;\">经办日期:2018-01-15 14:25:51</span></p><p>经办人:窗口测试001<span class=\"footer_span3\" style=\"margin-left: 150px; display: inline-block;\">监督电话:020-66666666</span></p><p>部门窗口联系电话:020-22222222</p><p style=\"margin-left:410px;margin-top:40px\">(客户签署姓名及日期)</p><p>打印人:窗口测试001<span class=\"footer_span3\" style=\"margin-left: 150px; display: inline-block;\">打印日期:</span>2018-01-15 14:34:21</p></div> \n" + 
            "   </div></div></div><p>\n" + 
            "\n" + 
            "   </p>" + "</body>";
        renderer.setDocumentFromString(htmlstr);
        renderer.layout();  
        renderer.createPDF(os);
        os.close();
    }

    /**
     * htmlFileToPDF:(html文件转换成pdf). <br/> 
     * @author xymy
     * @date 2018年11月8日下午2:59:42
     * @throws Exception
     */
    private static void htmlFileToPDF() throws Exception {
        String inputFile = "C:/Users/xymy/Desktop/test.html";
        String outFile = "C:/Users/xymy/Desktop/test1.pdf";
        OutputStream os = new FileOutputStream(outFile);
        ITextRenderer renderer = new ITextRenderer();
        ITextFontResolver fontResolver = renderer.getFontResolver();
        fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        String url = new File(inputFile).toURI().toURL().toString();
        renderer.setDocument(url);
        renderer.layout();
        renderer.createPDF(os);
        os.close();
    }

}

附:test.html

<!DOCTYPE html>
<html>
<head lang="en">
    <title>Spring Boot Demo - PDF</title>
    
    <style>
        @page {
            size: 210mm 297mm; /*设置纸张大小:A4(210mm 297mm)、A3(297mm 420mm) 横向则反过来*/
            margin: 0.25in;
            padding: 1em;
            @bottom-center{
                content:"";
                font-family: SimSun;
                font-size: 12px;
                color:red;
            };
            @top-center { content: element(header) };
        }
    </style>
</head>
<body style="font-family: SimSun">
<p>	</p><div><div style="font-family: C39HrP60DhTt;font-size: 60px;POSITION: absolute; LEFT: 500px;  TOP: 80px;display:none;"></div><div>
	<div class="box_border" style="border: thin solid rgb(0, 0, 0);">
	<div class="title" style="width: 95%; margin-bottom: 20px;"><p style="width: 100%; text-align: center; font-size: 16px; color: rgb(0, 0, 0);">
	
	
				
					
					不予行政许可通知书(客户联)					
				
			</p></div><div class="top" style="border-bottom: 1px dashed rgb(51, 51, 51); min-height: 150px; padding-bottom: 3px;"><p>负责部门名称:测试单位-审批局			
</p><p>办件流水号:2018124442</p>

				<p>
					
				</p>
			
			
				<p>
				项目名称:测试项目zwd003				</p>
			
			
			<p>
				
					
					
					
						企业名称:
					
					
					世界500强			
</p><p>
	
		
					
					
						企业地址:
					
					
					广州			
</p><p>客户联系方式:13751327669<span class="span_2" style="margin-left: 120px;">客户联系人:测试</span></p><p>
 				代理人:</p></div><div class="content" style="margin-top: 15px; border-bottom: 1px dashed rgb(51, 51, 51); padding-bottom: 2px; min-height: 350px;"><p>审批事项名称:新企业事项-ylp</p><p>
	<strong>本部门已于
					2018-01-15 14:34:16
						将此件办理完毕。				</strong>
			</p><p>
	批准结果:
				
					
					不批准				
			
</p><p>
	
		
	</p>

				
				
					<p class="content_p3">
						不批准理由:					</p>
				<p class="content_p4">
					可以办理				</p>
				
			

	<p class="content_p6">
		<strong>(若对本决定不服,可以直接到本决定之日起60日内,依法申请行政复议,也可以在三个月内依法向人民法院提出行政诉讼。)</strong>
	</p>

		</div><div class="footer" style="margin-top: 15px; width: 100%; padding-bottom: 25px; bottom: 0px;">		<p>部门窗口负责人:审批局单位管理员<span class="footer_span4" style="margin-left: 182px;">经办日期:2018-01-15 14:25:51</span></p><p>经办人:窗口测试001<span class="footer_span3" style="margin-left: 150px; display: inline-block;">监督电话:020-66666666</span></p><p>部门窗口联系电话:020-22222222</p><p style="margin-left:410px;margin-top:40px">(部门行政审批专用章盖印)</p><p>打印人:窗口测试001<span class="footer_span3" style="margin-left: 150px; display: inline-block;">打印日期:</span>2018-01-15 14:34:21</p></div> 
	</div></div></div><div style="page-break-before:always"><br/></div><div><div style="font-family: C39HrP60DhTt;font-size: 60px;POSITION: absolute; LEFT: 500px;margin-top:50px;z-index:-1;display:none;"></div><div>
	<div class="box_border" style="border: thin solid rgb(0, 0, 0);">
	<div class="title" style="width: 95%; margin-bottom: 20px;"><p style="width: 100%; text-align: center; font-size: 16px; color: rgb(0, 0, 0);">
	
	
				
					
					不予行政许可通知书(存根联)					
				
			</p></div><div class="top" style="border-bottom: 1px dashed rgb(51, 51, 51); min-height: 150px; padding-bottom: 3px;"><p>负责部门名称:测试单位-审批局			
</p><p>办件流水号:2018124442</p>

				<p>
					
				</p>
			
			
				<p>
				项目名称:测试项目zwd003				</p>
			
			
			<p>
				
					
					
					
						企业名称:
					
					
					世界500强			
</p><p>
	
		
					
					
						企业地址:
					
					
					广州			
</p><p>客户联系方式:13751327669<span class="span_2" style="margin-left: 120px;">客户联系人:测试</span> </p><p>
 				代理人:</p></div><div class="content" style="margin-top: 15px; border-bottom: 1px dashed rgb(51, 51, 51); padding-bottom: 2px; min-height: 350px;"><p>审批事项名称:新企业事项-ylp</p><p>
	<strong>本部门已于
					2018-01-15 14:34:16
						将此件办理完毕。				</strong>
			</p><p>
	批准结果:
				
					
					不批准				
			
</p><p>
	
		
	</p>

				
				
					<p class="content_p3">
						不批准理由:					</p>
				<p class="content_p4">
					可以办理				</p>
				
			

	<p class="content_p6">
		<strong>(若对本决定不服,可以直接到本决定之日起60日内,依法申请行政复议,也可以在三个月内依法向人民法院提出行政诉讼。)</strong>
	</p>

		</div><div class="footer" style="margin-top: 15px; width: 100%; padding-bottom: 25px; bottom: 0px;">		<p>部门窗口负责人:审批局单位管理员<span class="footer_span4" style="margin-left: 182px;">经办日期:2018-01-15 14:25:51</span></p><p>经办人:窗口测试001<span class="footer_span3" style="margin-left: 150px; display: inline-block;">监督电话:020-66666666</span></p><p>部门窗口联系电话:020-22222222</p><p style="margin-left:410px;margin-top:40px">(客户签署姓名及日期)</p><p>打印人:窗口测试001<span class="footer_span3" style="margin-left: 150px; display: inline-block;">打印日期:</span>2018-01-15 14:34:21</p></div> 
	</div></div></div><p>

	</p>
</body>
</html>

至此,html 转换成 pdf 就实现了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值