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="width: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>\n" +
" <table style=\"border-collapse:separate; border-spacing:0px 3px;border-top: black 1px solid;border-bottom: black 1px solid\" width=\"100%\">\n" +
" <tr style=\"\">\n" +
" <td><span style=\"font-size:9pt;\">號碼:</span><span id=\"orderNumber\" style=\"font-size: 9pt;\">" + model.getInt("id") + "</span></td>\n" +
" </td>\n" +
" <td><span style=\"font-size:9pt;\">等級:</span><span style=\"font-size: 9pt;\"> </span>" + goEmpty(model.getStr("levels")) + "</td>\n" +
" </tr>\n" +
" </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, "&", "&"); strData = replaceString(strData, "<", "<"); strData = replaceString(strData, ">", ">"); strData = replaceString(strData, "'", "'"); strData = replaceString(strData, "\"", """); return strData; } /** * 還原字符串中特殊字符 */ public static String decodeString(String strData) { strData = replaceString(strData, "<", "<"); strData = replaceString(strData, ">", ">"); strData = replaceString(strData, "'", "'"); strData = replaceString(strData, """, "\""); strData = replaceString(strData, "&", "&"); return strData; } }
到這里所以有的代碼都張貼完畢,可以進行看到結果的