动态生成的html页面转pdf并且打印预览

来源:互联网 发布:java开发平台哪个好 编辑:程序博客网 时间:2024/05/21 19:38

文章说明

程序的功能:

       通过js动态生成html页面并将该页面传送到后台转成pdf,再通过前台将pdf打印预览

先大约讲述一下具体实现过程

1、在js页面将你自己需要拼装好html页面通过ajax传到后台

2、通过itext将html页面转成pdf

3、js将pdf打印预览


具体代码

代码下载地址http://download.csdn.net/detail/a1968640005/9894741

1、js 拼接html页面并且将html传后台的代码

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:297mm 210mm;};";
printHtml +=" .page { page-break-after: always; } </style> ";
printHtml +=" <style type='text/css'>";
printHtml +=" .tab td {  border-bottom: 1 solid #000000;  border-left: 1 solid #000000;  border-right: 0 solid #ffffff;  border-top: 0 solid #ffffff;  } ";
printHtml +=" .tab {  border-color: #000000 #000000 #000000 #000000;  border-style: solid;  border-top-width: 2px;  border-right-width: 2px;   border-bottom-width: 1px;  border-left-width: 1px;  }  ";
printHtml +="  .hr {  font-family: '宋体';  font-size: 9pt;  } ";
printHtml +="  </style> ";
printHtml +=" </head> ";
printHtml +="  <body bgcolor='white' style='font-family:SimSun; height:100%;' screen_capture_injected='true' ryt11773='1'>  ";
printHtml +=" <table cellspacing='0' cellpadding='0' width='100%' align='center' > ";
printHtml +=" <tr>  <td align='center' colspan='2' style='font-size: 24px'>  <b id ='pdf_text'>深圳农村商业银行活期对账单</b>  </td>  ";
printHtml +="   <td align='right'  style='font-size: 14px'>    第1页, 共2页  </td>  </tr> ";
printHtml +="  <tr>  <td align='left' >子账户:600117332664</td> <td align='left'  >户名:王树</td> <td align='center'  >起始日期:20170607</td>  </tr>  ";
printHtml +=" <tr> <td align='left' colspan='2' >开户行:深圳农商行 </td> <td align='center' >终止日期:20170607 </td> </tr> ";
printHtml +="  <tr> ";
printHtml +="  <td colspan='3'>";
printHtml +=" <table class='tab' cellSpacing='0' cellPadding='0' width='100%' border='1' > ";
printHtml +=" <tr align='center' height='23'>  <td width='10%' height='23' colspan='3'>子账户:000117332670</td> <td width='10%' colspan='4' >币种:000117332670</td> <td width='10%' colspan='4' >产品类型:个人人民币</td>   </tr> ";
printHtml +="  <tr align='center' height='23'>  <td width='5%' height='23'>交易日期</td>  <td width='5%'>摘要</td>  <td width='12%'>借方交易金额</td>  <td width='12%'>贷方交易金额</td>   <td width='12%'>账户余额</td>";  
printHtml +=" <td width='12%'>对方户名</td>  <td width='12%'>对方行号</td>  <td width='7%'>凭证类型</td>  <td width='8%'>凭证号码</td>  <td width='10%'>交易机构</td>  <td width='10%'>备注</td> </tr> ";
for(var i = 0 ;i<= 20;i++){
printHtml +=" <tr style='font-size: 13px' align='center' height='23'>  <td align='center'>20160101</td>  <td align='center'>自助汇款</td>  <td  align='right' id ='pdf_text2' > 22.00</td>  <td align='right' >213123123.00</td>   <td align='right'>490000000.00</td>  ";
printHtml +=" <td align='center'>足足</td>  <td align='center' >中国工商银行</td>  <td align='center'>存折</td>  <td align='center'>1147755</td>  <td align='center'>00003</td> <td align='center'>拿去花</td> </tr>  ";
}
printHtml +="    </table>   </td>  </tr>  </table>  ";

printHtml +=" <div class='page' style = 'page-break-after: always'></div>";

var printHtml2 =" <table cellspacing='0' cellpadding='0' width='100%' align='center' > ";
printHtml2 +=" <tr>  <td align='center' colspan='2' style='font-size: 24px'>  <b id ='pdf_text'>深圳农村商业银行活期对账单</b>  </td>  ";
printHtml2 +="  <td align='right'  style='font-size: 14px'>    第2页, 共2页  </td>  </tr> ";
printHtml2 +="  <tr>  <td align='left' >子账户:600117332664</td> <td align='left'  >户名:王树</td> <td align='center'  >起始日期:20170607</td>  </tr>  ";
printHtml2 +=" <tr> <td align='left' colspan='2' >开户行:深圳农商行 </td> <td align='center' >终止日期:20170607 </td> </tr> ";
printHtml2 +="  <tr> ";
printHtml2 +="  <td colspan='3'>";
printHtml2 +=" <table class='tab' cellSpacing='0' cellPadding='0' width='100%' border='1' > ";
printHtml2 +=" <tr align='center' height='23'>  <td width='10%' height='23' colspan='3'>子账户:000117332670</td> <td width='10%' colspan='4' >币种:000117332670</td> <td width='10%' colspan='4' >产品类型:个人人民币</td>   </tr> ";
printHtml2 +="  <tr align='center' height='23'>  <td width='5%' height='23'>交易日期</td>  <td width='5%'>摘要</td>  <td width='12%'>借方交易金额</td>  <td width='12%'>贷方交易金额</td>   <td width='12%'>账户余额</td>";  
printHtml2 +=" <td width='12%'>对方户名</td>  <td width='12%'>对方行号</td>  <td width='7%'>凭证类型</td>  <td width='8%'>凭证号码</td>  <td width='10%'>交易机构</td>  <td width='10%'>备注</td> </tr> ";
for(var i = 0 ;i <= 20;i++){
printHtml2 +=" <tr style='font-size: 13px' align='center' height='23'>  <td align='center'>20160101</td>  <td align='center'>自助汇款</td>  <td  align='right' id ='pdf_text2' > 22.00</td>  <td align='right' >213123123.00</td>   <td align='right'>490000000.00</td>  ";
printHtml2 +=" <td align='center'>足足</td>  <td align='center' >中国工商银行</td>  <td align='center'>存折</td>  <td align='center'>1147755</td>  <td align='center'>00003</td> <td align='center'>拿去花</td> </tr>  ";
}
printHtml2 +="    </table>   </td>  </tr>  </table>  ";
     
printHtml += printHtml2 ;

printHtml +=" </body>";
printHtml +="</html>";
       
$.ajax({  
        type:"POST",  
        url:"/ArchivesManagementSystem/userAction!checkLogin.action",  
        dataType:"json",  
        data:{"printHtml":printHtml,"printHtml2":printHtml2},  
        success:function(data){
        print2();
        }
        });

     

2、html转pdf代码

该功能需要3个包 core-renderer 、iText-2.0.8、itextpdf-5.4.5
   //action 层
   public String checkLogin() {
try{
System.out.println("开始转换pdf");
PdfUtil.htmlToPdf("C:/tomacat/webapps/ArchivesManagementSystem/print/print.pdf",printHtml);
return SUCCESS;
}catch (Exception e) {
System.out.println(e.getMessage());
return fail;
}
}


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



import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.Sides;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;


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




import com.lowagie.text.pdf.BaseFont;


import org.w3c.dom.Document;


/**
* 把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;
}




3、将pdf打印预览

在打印的html页面上需要  推荐博文  http://www.cnblogs.com/imfjj/p/5946289.html
添加   <iframe style="display:none" name = 'printIframe2' id="printIframe" src="/Print/print/print.pdf"></iframe>

js代码
function print2(){ 
          //添加ifrme标签
$("#addiframe").html("<iframe style='display:none' name = 'printIframe2' id='printIframe' src='/ArchivesManagementSystem/print/print.pdf'>");
        //打印预览
$("#printIframe")[0].contentWindow.print();


4、出现问题

1、设置页面大小
2、中文汉字显示问题
推荐博文 http://www.cnblogs.com/reese-blogs/p/5546806.html


效果图