zoukankan      html  css  js  c++  java
  • 利用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;
         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;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;120px;'>  ${CarInfo.carNum} </span><span style='float:left;'>车辆所有人</span><span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;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;170px;'>  ${CarInfo.labels}</span><span style='float:left;'> 33</span> <span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;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;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;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;120px;'>  ${CarInfo.carNum} </span><span style='float:left;'>33</span><span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;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;170px;'>  ${CarInfo.labels}</span><span style='float:left;'> 发动机号   </span> <span style='padding-bottom: 5px; border-bottom: 1px solid #000;float:left;display:block;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;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;
    	}
    }
    
  • 相关阅读:
    IDEA激活
    Docker安装
    IDEA使用汇总
    tomcat服务器安装
    Java=》volatile的理解
    2020年2月24日09:06:11,Hash散列
    ES的使用
    Python安装技巧
    数据结构与算法Scala
    2019年12月13日_Flume采集数据到kafka配置使用过程
  • 原文地址:https://www.cnblogs.com/itcx1213/p/9299367.html
Copyright © 2011-2022 走看看