利用itext将html页面转成pdf(不模糊)

1.maven项目进入依赖

  <dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>core-renderer</artifactId>
    <version>R8pre2</version>
</dependency>


<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>2.0.8</version>
</dependency>


<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.4.4</version>
</dependency>

 2.将html页面进行封装

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ include file="../../../common.jsp" %>
    <link rel="stylesheet" type="text/css" href="${basePath}css/bootstrap-table.css"/>
        <link rel="stylesheet" type="text/css" href="${basePath}css/bootstrap.min.css"/>
        <script type="text/javascript" src="${basePath}js/jquery-1.9.1.min.js"></script>
        <script type="text/javascript" src="${basePath}js/jquery-ui-1.10.4.custom.min.js"></script>
        <script type="text/javascript" src="<%=basePath %>js/jquery.PrintArea.js"></script>
<script src="${basePath}js/html2canvas/html2canvas.js"></script>
 <script src="${basePath}js/html2canvas/jspdf.debug.js"></script>
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.0.272/jspdf.debug.js"></script> -->
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
.table{
border:1px solid #cad9ea;
color:#666;
margin-bottom: 10px;
margin-top: 10px;
}
.table th {
background-repeat:repeat-x;
height:30px;
}
.table td,.table th{
border:1px solid #cad9ea;
padding:0 0.5em 0;
}
.table tr.alter{
background-color:#f5fafe;
}
.imgStyle{
    margin-bottom:0.5em;
    width: 220px;
    height: 150px;
 }
textarea{
 margin-bottom: 4px;
}
#stamp{
    background-color: #008CBA; /* Green */
    border: none;
    color: white;
    padding: 4px 25px;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    font-size: 13px;
    margin: 4px 2px;
    cursor: pointer;
}
#picture{
    position: absolute;
    right: 200px;
    top: 650px;
}
html{
  height:60%
}
</style>
<style type="text/css" media="print">
.noprint { display:none;}
</style>
<script type="text/javascript">
$(document).ready(function(){     //通过AJAX后台取数据
    
    //获取当前的时间
       var day = new Date();
       Year= day.getFullYear();//支持IE和火狐浏览器.
        Month= day.getMonth()+1;
        Day = day.getDate();
//         $('#year').text(Year);
//         $('#month').text(Month);
//         $('#day').text(Day);
//         $('#year2').text(Year);
//         $('#month2').text(Month);
//         $('#day2').text(Day);
    
//         var a=new Date(new Date());
//         var year1=a.getFullYear();////         var month1=a.getMonth()+1;//月份(月份是从0~11,所以显示时要加1)
// //             month1=month1<10?'0'+month1:month1;
//         var day1=a.getDate();//日期
// //              day1=day1<10?"0"+day1:day1;
//         var str1=year1+'年'+month1+'月'+day1+'日'; 
//         $('#year2').text(str1);
//         $('#year').text(str1);
        
    //var driver_bespeak_id = ${requestScope.driver_bespeak_id};
    //获取驾驶员预约号
//     $.post(
//     "getYuyueDataByAjax.action"
//     ,{
//         driver_bespeak_id : ${requestScope.driver_bespeak_id},
//     }
//     ,function(data){
        
//         $("#username").text(data.username);
        
//     });
});
</script>

<script type="text/javascript">  //页面格式改成页签的格式

    var hkey_root,hkey_path,hkey_key;  
    hkey_root="HKEY_CURRENT_USER";  
    hkey_path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\";

    $(document).ready(function(){    //后续操作
        $("#stamp").click(function(){
    
            
            debugger;
            var printHtml = "<?xml version='1.0' encoding='UTF-8'?>";
            printHtml += "<html xmlns='http://www.w3.org/1999/xhtml'>";
            printHtml +="<head>";
            printHtml +="<title>页面打印</title>";
            printHtml +="<style media= 'print' >";
            printHtml +=" @page{size: A4 portrait;};";/* 可以控制打印方向,portrait: 纵向打印,  landscape: 横向。  */
            printHtml +=" .page { page-break-after: always; } </style> ";
            printHtml +=" </head> ";
            printHtml +="  <body bgcolor='white' style='font-family:SimSun; height:100%;' screen_capture_injected='true' ryt11773='1'>  ";
            printHtml +="  <h4 style='font-size:30px;font-family:SimSun;text-align: center;'><b>3333333</b></h4>";
            printHtml +="  <div style='padding-left:430px;'><img style='position:relative;width:200px;height:60px;'  alt='' src='${basePath}/face/QRCode/${CarInfo.carId}.png'/></div>";
            printHtml +="  <h4 style='font-size:22px;font-family:SimSun;padding-left: 45px;'>车辆管理所:</h4> ";
            printHtml +="  <h4 style='font-size:22px;font-family:SimSun;padding-left: 130px;'><span style='float:left;'>兹有津</span><span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;width:120px;'>  ${CarInfo.carNum} </span><span style='float:left;'>车辆所有人</span><span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;width:200px;'><c:if test='${CarInfo.belongs==1}'> ${CarInfo.manCompany}</c:if><c:if test='${CarInfo.belongs==2}'> ${CarInfo.terrace}</c:if> <c:if test='${CarInfo.belongs==3}'>  ${CarInfo.manCompany}</c:if></span></h4><br/>";
            printHtml +="  <h4 style='font-size:22px;font-family:SimSun;padding-left: 60px;margin-top:20px;'><span style='float:left;'>333</span><span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;width:170px;'>  ${CarInfo.labels}</span><span style='float:left;'> 33</span> <span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;width:207px;'>  ${CarInfo.engineNum}</span></h4><br/>";
            printHtml +="  <h4 style='font-size:22px;font-family:SimSun;padding-left: 60px;margin-top:20px;'>33,33性质变更为“33”。</h4>";
            printHtml +="  <h4 style='font-size:22px;font-family:SimSun;padding-left: 60px;'><span style='float:left;'>333:</span><span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;width:270px;'> 33。</span></h4>";
            printHtml +="  <h4 style='font-size:20px;font-family:SimSun;padding-right:80px;'><span style='padding-left: 460px;'><span>(33)</span></span></h4>";
            printHtml +="  <div style='padding-left:460px;margin-top:-70px;'><img style='position:relative;margin-top:-100px;' width='140px;' height='140px;'  src='${basePath}images/stamp.png'/></div>";
            printHtml +="  <h4 style='font-size:20px;font-family:SimSun;padding-right:80px;margin-top:-10px;'><span style='padding-left: 70px;'><span id='year'>${time }</span></span></h4>";  
            printHtml +="  <hr style='height:1px;border:none;border-top:1px dashed black;' /><br/>";  
            printHtml +="  <h4 style='font-size:30px;font-family:SimSun;text-align: center;'><b>33</b></h4>";
            printHtml +="  <div style='padding-left:430px;'><img style='position:relative;width:200px;height:60px;'  alt='' src='${basePath}/face/QRCode/${CarInfo.carId}.png'/></div>";
            printHtml +="  <h4 style='font-size:22px;font-family:SimSun;padding-left: 45px;'>33:</h4> ";
            printHtml +="  <h4 style='font-size:22px;font-family:SimSun;padding-left: 130px;'><span style='float:left;'>33</span><span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;width:120px;'>  ${CarInfo.carNum} </span><span style='float:left;'>33</span><span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;width:200px;'><c:if test='${CarInfo.belongs==1}'> ${CarInfo.manCompany}</c:if><c:if test='${CarInfo.belongs==2}'> ${CarInfo.terrace}</c:if> <c:if test='${CarInfo.belongs==3}'>  ${CarInfo.manCompany}</c:if></span></h4><br/>";
            printHtml +="  <h4 style='font-size:22px;font-family:SimSun;padding-left: 60px;margin-top:20px;'><span style='float:left;'>33</span><span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;width:170px;'>  ${CarInfo.labels}</span><span style='float:left;'> 发动机号   </span> <span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;width:207px;'>  ${CarInfo.engineNum}</span></h4><br/>";
            printHtml +="  <h4 style='font-size:22px;font-family:SimSun;padding-left: 60px;margin-top:20px;'>33,33性质变更为“33”。</h4>";
            printHtml +="  <h4 style='font-size:22px;font-family:SimSun;padding-left: 60px;'><span style='float:left;'>备注:</span><span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;width:270px;'> 3333。</span></h4>";
            printHtml +="  <h4 style='font-size:20px;font-family:SimSun;padding-right:80px;'><span style='padding-left: 460px;'><span>(333)</span></span></h4>";
            printHtml +="  <div style='padding-left:460px;margin-top:-70px;'><img style='position:relative;margin-top:-100px;' width='140px;' height='140px;'  src='${basePath}images/stamp.png'/></div>";
            printHtml +="  <h4 style='font-size:20px;font-family:SimSun;padding-right:80px;margin-top:-10px;'><span style='padding-left: 70px;'><span id='year'>${time }</span></span></h4>";  
            
            printHtml +=" </body>";
            printHtml +="</html>";
            var path = $("#path").val();
            $.ajax({  
                    type:"POST",  
                    url:"downPdf.action",  
                    data:{"printHtml":printHtml,"path":path},  
                    success:function(data){
                   if(data == 1){
                       alert("下载成功");
                   }
                    }
                    });
            

        });
});
    function browseFolder(path) {
        try {
            var Message = "我的电脑"; //选择框提示信息
            var Shell = new ActiveXObject("Shell.Application");
            var Folder = Shell.BrowseForFolder(0, Message, 64, 17); //起始目录为:我的电脑
            //var Folder = Shell.BrowseForFolder(0, Message, 0); //起始目录为:桌面
            if (Folder != null) {
                Folder = Folder.items(); // 返回 FolderItems 对象
                Folder = Folder.item(); // 返回 Folderitem 对象
                Folder = Folder.Path; // 返回路径
                if (Folder.charAt(Folder.length - 1) != "\\") {
                    Folder = Folder + "\\";
                }
                document.getElementById(path).value = Folder;
                return Folder;
            }
        }
        catch (e) {
            alert(e.message);
        }
    }

        function PageSetup_Null(){
            try{  
                 var RegWsh = new ActiveXObject("WScript.Shell") ;  
                 hkey_key="header" ;  
                 RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"") ;  
                 hkey_key="footer" ;  
                 RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"") ;  
                 }  
                catch(e){}  
        }
    
</script>

</head>
<body>
<div class="container" style="height:60%">
     <div id="zhongxin"  style="margin-left:10%">
        
        <div style="padding-top:30px;"></div>
        <div class="panel panel-default"  id="part1" style="border:none;">   <!-- 第一部分 -->
            <br>
             
       <div id="prin" class="noprint" style="margin-left:-400px">
        <input id="path" type="text" name="path" size="30" style="float:right;" disabled="disabled">
    <input type=button value="选择" onclick="browseFolder('path')" style="float:right;margin-right:-270px;">  
       <center><button id="stamp" class="noprint"  style="float:right;margin-right:-370px;margin-top:-1px;" ><center>下载pdf</center></button></center>
       </div> 
      
    
</body>
</html>

3.action

/**
			 * html下载pdf
			 * @param request
			 * @return
			 */
			@RequestMapping("/downPdf")
			@ResponseBody
			public int downPdf(HttpServletRequest request) {
				try{
					String printHtml = request.getParameter("printHtml");
					String path = request.getParameter("path");
				System.out.println("开始转换pdf");
				PdfUtil.htmlToPdf(path+"content.pdf",printHtml);
				return 1;
				}catch (Exception e) {
				System.out.println(e.getMessage());
				return 2;
				}
				}

 4.工具类

//导入的包
	import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.pdf.BaseFont;


public class PdfUtil {
	
	/**
	* 把URL转换为PDF
	* 
	* @param outputFile
	*            , 示例:/data/fs/inspector/BJ20150522001.pdf
	* @param url
	*            ,示例:http :xxxx
	* @return
	* @throws Exception
	*/
	public static boolean htmlToPdf(String outputFile, String url)throws Exception {
	File outFile = new File(outputFile);
	if (!outFile.exists()) {
	outFile.getParentFile().mkdirs();
	}


	OutputStream os = new FileOutputStream(outputFile);

	DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
	Document doc = builder.parse(new ByteArrayInputStream(url.getBytes("UTF-8")));

	//Document document = new Document(PageSize.A4, 50, 50, 50, 50);
	ITextRenderer renderer = new ITextRenderer();

	renderer.setDocument(doc, null);

	//renderer.setDocument(url);
	String fontPath = PdfUtil.class.getClassLoader().getResource("").toString().replaceAll("file:/", "")+ "simsun.ttc";
	System.out.println(fontPath);


	// 解决中文支持问题
	ITextFontResolver fontResolver = renderer.getFontResolver();
	fontResolver.addFont(fontPath, BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
	renderer.layout();
	renderer.createPDF(os);
	os.flush();
	os.close();


	System.out.println("文件转换成功");
	return true;
	}
}

猜你喜欢

转载自www.cnblogs.com/itcx1213/p/9299367.html