使用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;
    }
}

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

原文地址:https://www.cnblogs.com/www-yang-com/p/14154754.html