zoukankan      html  css  js  c++  java
  • 使用itext进行html拼接生成pdf文件

    1.首先进来的朋友们可以看一下您遇到的问题是否和我的类似,这边我先总结一下,值得写的一些问题:

    1.1:如何从web端进行点击下载pdf。

    1.2:如何使写的html的css样式加粗样式生效。

    1.3:如何进行下载的pdf格式使A4或者A3的设置。

    1.4:如何插入图片。

    如果您有以上问题请继续往下预览-------------

    2.如何从web端进行点击下载pdf:根据公司的业务需求,在页面上可以导出pdf文件。

    如何从web端进行点击下载pdf(先整体流程走一遍):

    2.1:点击打印工单的按钮,便可以下载要生成的pdf文件,html标签如下:

    <a href="javascript:void(0);" id="toprint_btn" style="80px;text-align:center;" onclick="toPrint()">打印工单</a>

    2.2:onclick事件的代码如下,使用window.location.href,将参数进行传送后台

    function toPrint(){
            var ids = $("#planInfoid").val();
                window.location.href="planManagement/toPrint?ids=" + ids;
        }

    2.3:后台进行,根据接收参数从数据库里面查询要打印的数据。然后进行html拼接要生成的pdf格式:

      这里,由于是我司用的是jfinal框架的业务代码,出于保密性,所以只能简洁一下拼接,但是逻辑都是一样的,只是用的框架不一样而已。

     注意:body上一定要加上:font-family:SimSun;  代码,这是显示什么字体,SImSun,是宋体

        拼接的html标签中,一定要有闭合,例如:<input></input>,一定要有</input>,不能写成:<input/>

    /**
    * 打开打印页面
    */
    public void toPrint() {
       //接收参数
    String ids = this.getPara("ids");
    String[] splitIds = ids.split(",");
       // itex工具类
    ItextUtil itextUtil = new ItextUtil();
    String html = "";
        // 获取response
        HttpServletResponse response = this.getResponse();
    for (String id : splitIds) {
    PlanInfo model = PlanInfo.dao.getPlanInfoById(id);
      // 需要拼接的html样式
    html += "<body style = "padding:0; margin:0; font-family:SimSun;" >" +
    "<div id="printForm" style="height:1000px; border: black 2px solid;margin-top:20px;">" +
    " <h2 style="text-align: center;font-size:18px;font-weight: 900">导出pdf信息</h2> " +
    " <table style="border-collapse:separate; border-spacing:0px 3px;border-top: black 1px solid;border-bottom: black 1px solid" width="100%"> " +
    " <tr style=""> " +
    " <td><span style="font-size:9pt;">号码:</span><span id="orderNumber" style="font-size: 9pt;">" + model.getInt("id") + "</span></td> " +
    " </td> " +
    " <td><span style="font-size:9pt;">等级:</span><span style="font-size: 9pt;"> </span>" + goEmpty(model.getStr("levels")) + "</td> " +
    " </tr> " +
    " </table>"+
    " </div>"+
    " </body>";
    }
    try {
          // 导出的名称
    String fileName = new String((new SimpleDateFormat("yyyy-MM-dd").format(new Date())).getBytes(), "UTF-8");
    fileName = "HPT-PM工单"+"-"+fileName;
    itextUtil.htmlCodeComeString(html, response,"a4",fileName);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

     2.3.1:itextUtil工具类:这个工具类,是很全面的,有:拼接字符中有<,>,&,!一些特殊字符的转换,itext用html转成pdf的核心代码。

    package com.wom.utils;
    
    import com.lowagie.text.Document;
    import com.lowagie.text.pdf.BaseFont;
    import com.lowagie.text.pdf.PdfCopy;
    import com.lowagie.text.pdf.PdfImportedPage;
    import com.lowagie.text.pdf.PdfReader;
    import org.xhtmlrenderer.pdf.ITextFontResolver;
    import org.xhtmlrenderer.pdf.ITextRenderer;
    
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import java.io.FileOutputStream;
    import java.net.URL;
    import java.net.URLEncoder;
    
    /***根据HTML生成PDF文档
     * Title:ItextUtil
     */
    public class ItextUtil {
        /**
         *  A4
         */
        public static String getConversionHtmlCode(String htmlCode,String size){
            String css = "";
            css +="<style>";
            css +="@page{size:"+size+"}";
            css +="</style>";
            String 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 http-equiv="Content-Type" content="text/html; charset=utf-8" />"+css+"</head>"+ htmlCode + "</html>";
           // System.out.println("html:"+html);
            return html;
        }
    
        public static void htmlCodeComeString(String htmlCode, HttpServletResponse response,String size,String name) throws Exception {
            response.setContentType("text/html;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(name+ ".pdf", "UTF-8"));
            response.setHeader("Cache-Control", "no-cache");
            ServletOutputStream os = response.getOutputStream();
            ITextRenderer renderer = new ITextRenderer();
            renderer.setDocumentFromString(getConversionHtmlCode(htmlCode,size));
            ITextFontResolver fontResolver = renderer.getFontResolver();
            // 中文黑体字
            URL songti = ItextUtil.class.getResource("songti.ttf");
            URL fontPath = ItextUtil.class.getResource("simsun.ttc");
            fontResolver.addFont(fontPath.toString(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            fontResolver.addFont(songti.toString(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            renderer.getSharedContext().setBaseURL("file:/"+"F:/kedaSoft/hpt_pmos/WebRoot/pages/images/PET-logo.png");
            renderer.layout();
            renderer.createPDF(os);
    
            System.out.println("======转换成功!");
            os.close();
            os.flush();
        }
    
    
        /**
         * 转义特殊字符
         * @param args
         */
        /**
         * 替换一个字符串中的某些指定字符
         * @param strData String 原始字符串
         * @param regex String 要替换的字符串
         * @param replacement String 替代字符串
         * @return String 替换后的字符串
         */
        public static String replaceString(String strData, String regex, String replacement) {
            if (strData == null)
            {
                return null;
            }
            int index;
            index = strData.indexOf(regex);
            String strNew = "";
            if (index >= 0)
            {
                while (index >= 0)
                {
                    strNew += strData.substring(0, index) + replacement;
                    strData = strData.substring(index + regex.length());
                    index = strData.indexOf(regex);
                }
                strNew += strData;
                return strNew;
            }
            return strData;
        }
    
        /**
         * 替换字符串中特殊字符
         */
        public static String encodeString(String strData) {
        if (strData == null)
        {
            return "";
        }
        strData = replaceString(strData, "&", "&amp;");
        strData = replaceString(strData, "<", "&lt;");
        strData = replaceString(strData, ">", "&gt;");
        strData = replaceString(strData, "&apos;", "&apos;");
        strData = replaceString(strData, """, "&quot;");
        return strData;
    }
        /**
         * 还原字符串中特殊字符
         */
        public static String decodeString(String strData) {
            strData = replaceString(strData, "&lt;", "<");
            strData = replaceString(strData, "&gt;", ">");
            strData = replaceString(strData, "&apos;", "&apos;");
            strData = replaceString(strData, "&quot;", """);
            strData = replaceString(strData, "&amp;", "&");
            return strData;
        }
    }

    到这里所以有的代码都张贴完毕,可以进行看到结果的

  • 相关阅读:
    bzoj3687 简单题
    bzoj3992 [SDOI2015]序列统计
    bzoj4602 [Sdoi2016]齿轮
    bzoj4006 [JLOI2015]管道连接
    szoj461【四校联考0430】挑战
    bzoj4037 [HAOI2015]数字串拆分
    javascript 节点的增,删,改,查
    javascript 节点属性详解
    表单操作部分
    文档对象的操作
  • 原文地址:https://www.cnblogs.com/www-yang-com/p/14154754.html
Copyright © 2011-2022 走看看