pdfbox使用记录

pdfbox详细介绍见:https://iowiki.com/pdfbox/pdfbox_index.html

pdfbox使用记录

 maven所需jar

<dependency>
   <groupId>org.apache.pdfbox</groupId>
   <artifactId>pdfbox</artifactId>
   <version>2.0.11</version>
</dependency>
	/**
	 * 批量下载报告
	 * @param seqno 用户编号
	 * @param orientation 字体
	 * @param hasCover 封皮
	 * @param def
	 * @param showDoctor 医院
	 * @param sites
	 * @param outpath pdf路径
	 * @return  java.util.HashMap<java.lang.String,java.lang.Object>
	 * @date    2021/6/9 14:57
	 * @throws
	 */
	public HashMap<String, Object> downloadReportMergeReport(CheckTaskExtend ct ,String orientation,Integer hasCover,Integer def,
															 String showDoctor,String sites,String outpath,String pageNums,String reportPage) {
		HashMap<String, Object> p=new HashMap<String, Object>();
		File file = null;
		try {
			String basePath = webservice.getProperty("local.address");
			String seqno = ct.getSeqno();
			String rsid = ct.getRsid();
			Map<String,Object> customReport = new HashMap<String, Object>();
			String hospitalId = ct.getHospitalId();
			// 判断是否有代理
			String angecy = "";
			if (rsid != null) {
				angecy = checkOrderMapper.selectByPrimaryKey(rsid).getContractPartnerCode();
			}
			if (angecy != null && !"".equals(angecy.trim())) {
				customReport = dao.selectCustomReport(angecy);
				if (customReport != null && customReport.size() > 0) {
					hospitalId = angecy;
				}
			}
			if(customReport == null || customReport.size() == 0 ){
				if(hospitalId == null || hospitalId.trim().equals("") ||
						(ct.getFeeType() != null && !"JG".equals(ct.getFeeType()) && !"JY".equals(ct.getFeeType()) )){ // JG ???
					hospitalId = "000014";
				}
				if(def == 1){
					hospitalId = "00000";
				}
				customReport = dao.selectCustomReport(hospitalId);
			}
			if(customReport!=null){
				if(StringUtils.isBlank(showDoctor) || "0".equals(showDoctor)){
					String showDoctorDepts = (String) customReport.get("showDoctorDepts");
					if(StringUtils.isNotBlank(showDoctorDepts)){
						String[] ss = showDoctorDepts.split(",");
						if(ArrayUtils.contains(ss, ct.getDeptId())){
							showDoctor="1";
						}else{
							showDoctor="0";
						}
					}
				}
				if("1".equals(customReport.get("hasCover").toString())){
					hasCover = 1;
				}
			}
			StringBuilder headerb = new StringBuilder("--header-html " + basePath +"report/getHeader.do?hasCover="+hasCover);
			StringBuilder footerb = new StringBuilder("--footer-html " + basePath +"report/getFooterMerge.do?hasCover="+hasCover);
			headerb.append("&hospitalId="+hospitalId+"&taskCodeDate="+ct.getTaskCodeDate());
			footerb.append("&hospitalId="+hospitalId+"&taskCodeDate="+ct.getTaskCodeDate()+"&reportPage=" + reportPage);
			String header = headerb.toString();
			String footer = footerb.toString();
			String downloadFIleName = "";
			downloadFIleName += ct.getPatient()==null?"NA":ct.getPatient() + "-";
			downloadFIleName += ct.getHospital()==null?"NA":ct.getHospital() + "-";
			downloadFIleName += ct.getDept()==null?"NA":ct.getDept() + "-";
			downloadFIleName += ct.getUsername()==null?"NA":ct.getUsername() + "-";
			downloadFIleName += ct.getSalesman()==null?"NA":ct.getSalesman()+ "-";
			downloadFIleName += ct.getFeeTypeName()==null?"NA":ct.getFeeTypeName()+ "-";
			downloadFIleName += ct.getResult()==null?"NA":ct.getResult();
			downloadFIleName += ".pdf";
//			downloadFIleName = URLEncoder.encode(downloadFIleName.replaceAll(" ", ""), "UTF-8");
//			String outpath = request.getServletContext().getRealPath("pdf");
			File outdir = new File(outpath);
			if(!outdir.exists()){
				outdir.mkdirs();
			}
			String fileName = outdir + File.separator + downloadFIleName;
			file = new File(fileName);
			if(file.exists()){
				file.delete();
			}
			String oss = System.getProperty("os.name");
			String sys = "";
			if (oss.toLowerCase().startsWith("win")) {
				sys = "D:\\develop\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
			} else {
				sys = "/usr/local/bin/wkhtmltopdf";
			}
			String url = basePath + "task/reportHb.do?rsid="+rsid+"&def="+def+"&showDoctor="+showDoctor+"&sites="+sites+"&hospitalId="+hospitalId  ;
			//String url = basePath + "reportsystem/reportTemp/reportUeTemp/report_hb.jsp?seqno=" + seqno + "&def=" + def + "&showDoctor=" +
			//		showDoctor + "&sites=" + sites + "&hospitalId=" + hospitalId + "&" + urlParamsByMap ;
			String exe = sys+" --javascript-delay 5000 --orientation "+orientation;
			String style="--footer-spacing 5 --header-spacing 0 --disable-smart-shrinking";
			//String catalogue =basePath + "reportsystem/reportTemp/menu_hb.jsp?pageNums="+pageNums;
            //  目录页总页码数
			Integer catalogueNum = (Integer) 3;
            //  目录页总页码数 -删除1页空白页
			int	catalogueNumPage = (catalogueNum - 1 <= 0) ? 0 : (catalogueNum - 1);
			String catalogue ="cover " +basePath + "task/reportMenuHb.do?"+pageNums+"&def=" + def +"&catalogueNum=" + catalogueNumPage + "&showDoctor=" +showDoctor + "&sites=" + sites;
			Log.debug("计算的菜单页数==="+catalogueNumPage);
			String coverType = "";
			if(customReport!=null && customReport.get("coverType")!=null && !customReport.get("coverType").toString().equals("")){
				coverType=(String) customReport.get("coverType");
			}
			String cover1 = "cover " + basePath + "report/getReportCover.do?seqno="+seqno+"&coverType="+coverType+"&basePath="+basePath+"&isHbReport=1";
			String cover2 = "";
			String feeType = "";
			if (!StringUtils.isBlank(ct.getFeeType())) {
				feeType = ct.getFeeType();
			}
			if(coverType!=null && !"".equals(coverType.trim())){
				cover2 = "cover " + basePath + "reportsystem/cover/"+coverType+"/endpage.jsp?hospitalId="+hospitalId+"&feeType="+feeType;
			}else{
				cover2 = "cover " + basePath + "reportsystem/cover/endpage.jsp?hospitalId="+hospitalId+"&feeType="+feeType;
				String chipCustomer = ct.getChipCustomer();
			}
			String coverBlank = "cover " + basePath + "reportsystem/reportTemp/blank.html";
			String shell = exe+" "+header+" "+footer+" "+url+" "+style+" "+ fileName;
			int mod = 0;
			Log.debug(shell);
			if (oss.toLowerCase().startsWith("win")) {
				WkHtmlToPdf.convert(shell);
			} else {
				PdfUtil.excutePerl(shell);
			}
			try {
				long size = 0;
				int temp = 0;
				while(true && temp < 100) {
					temp++;
					if (file.exists() ) {
						size = file.length();
						Thread.sleep(1000);
					} else {
						Thread.sleep(1000);
						continue;
					}
					if (size != 0 && size == file.length()) {
						break;
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
            //加载生成的pdf计算总页码
			PDDocument pdoc = PDDocument.load(file);
			mod = pdoc.getNumberOfPages();
			Log.debug("计算的报告页数:"+mod);
			pdoc.close();
            //删除pdf重新生成
			file.delete();
			int modpage=0;
			if(hasCover == 1){
                //计算添加封皮、目录页后的总页码 mod参数作为打印不满四倍数时的补充页
                //pdf总页+目录总页然后计算是否需要补页 其中mod参数传到前台作为需要补的页数
				modpage=mod+catalogueNumPage;
				url = url +"&mod=" + (modpage%4 == 0 ? 0 : 4-modpage%4);
				footerb.append("&newtopage=" +(mod+(modpage%4 == 0 ? 0 : 4-modpage%4)));
				footerb.append("&catalogueNum=" + catalogueNumPage );
				footer = footerb.toString();
				shell = exe+" "+header+" "+footer+" "+cover1+" "+coverBlank+ " "+catalogue+" "+url+" "+style+" "+coverBlank+" "+cover2+" "+ fileName;
			}else{
				footerb.append("&newtopage=" + mod);
				footerb.append("&catalogueNum=" + catalogueNumPage );
				footer = footerb.toString();
				shell = exe+" "+header+" "+footer+" "+catalogue+" "+style+" "+ fileName;
			}
			if (oss.toLowerCase().startsWith("win")) {
				WkHtmlToPdf.convert(shell);
			} else {
				PdfUtil.excutePerlError(shell);
			}
			while(!file.exists()){
				Thread.sleep(1000);
			}
		} catch (Exception e) {
			e.printStackTrace();
			p.put("status", "1");
			StringWriter sw = new StringWriter();
			PrintWriter pw = new PrintWriter(sw, true);
			e.printStackTrace(pw);
			pw.flush();
			sw.flush();
			p.put("msg", "下载失败" + sw.toString());
			return p;
		}
		p.put("status", "0");
		p.put("msg", "下载成功");
		return p;
	}

 计算页码的页脚方法

 /**
     * 获取自定义页脚
     *
     * @param pdata hasCover=0,不含封面,hasCover=1要封面
     * @return
     */
    @RequestMapping("getFooterMerge")
    public Object getFooterMerge(@RequestParam Map<String, Object> pdata) {
        if (pdata.get("newtopage") != null) {
            pdata.put("topage", pdata.get("newtopage"));
        }
        String params = "";//用于重定向时带上参数
        if (pdata != null && pdata.size() > 0) {
            params = "?";
            for (String key : pdata.keySet()) {
                params += key + "=" + pdata.get(key) + "&";
            }
            params = params.substring(0, params.length() - 1);
        }
        return "redirect:/reportsystem/reportTemp/footer_hb.html" + params;
    }

footer_hb.html页码计算页脚的函数

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title> footer </title>
    <script type="text/javascript" src="../js/jquery.min.js" ></script>
    <script>

        function subst() {//hospitalId
            var vars={};
            var params=window.location.search.substring(1).split('&');
            for ( var i in params) {
                var z = params[i].split('=', 2);
                vars[z[0]] = decodeURI(z[1]);
            }
            console.log(params)
            $.ajax({
                type: "POST",
                url:'../../report/showCustomReport.do',
                data: {"hospitalId":vars.hospitalId},
                success: function(result){
                    //console.log(result);
                    if(result.status==0){
                        var data = result.data;
                        for (var i in data) {//页脚
                            if(i=="footerLeft"||"footerMiddle"||"footerRight"){
                                if(data[i]=="显示页码"){
                                    $("#"+i).html('<span class="corBox"><span id="page">1</span> / <span id="newtopage">1</span></span>');
                                }else{
                                    $("#"+i).html(data[i]);
                                }
                            }
                        }
                        if(!vars.hasOwnProperty('page') && !vars.hasOwnProperty('newtopage')){
                            vars['page']=0;
                            vars['newtopage']=0;
                        }
                 
                        for (var i in vars) {//页码计算

                            if(i=='page'){
                                $("#"+i).text(vars[i] -2*vars.hasCover - vars.catalogueNum*1);
                            }else if(i=='newtopage'){
                                $("#"+i).text(vars[i]);
                            }
                        }

                    }
                },error:function(){

                }
            });

        }
    </script>
    <style>
        *{
            padding:0; margin:0; font-size:12px;
        }
        a,a:active,a:link,a:visited,a:hover{
            list-style: none; color:#333; text-decoration: none;
        }
        .list {
            width: 33.3333%; line-height: 16px; min-height: 50px; vertical-align: middle; font-size: 12px;
        }
        .list1{
            text-align:left;
            width: 40%;
        }
        .list2{
            text-align:center;
            width: 20%;
        }
        .list3{
            text-align:right;
            width: 40%;
        }
        .corBox{
            display:inline-block;
            width: 60px;
            height: 25px;
            border-radius: 20px;
            line-height: 25px;
            //color: #fff;
        }
    </style>
</head>

<body onload="subst()">
<div>
    <table width="100%" clas="f-tab">
        <tr>
            <td class="list list1" id="footerLeft"></td>
            <td class="list list2" id="footerMiddle"></td>
            <td class="list list3" id="footerRight"></td>
        </tr>
    </table>

    <!-- <div class="list list1">
        <a>xxxxxxxx中心有限公司</a><br>
        <a>https://xxxxx</a>
    </div>
    <div class="list list2"  id="">
        <span id="page"></span> / <span id="newtopage"></span>
    </div>
    <div class="list list3">
       xxx<br>
        xxxx<br>
        xxx<br>
    </div>
    <div style="clear:both"></div> -->
</div>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/qq_34316431/article/details/118417476
今日推荐