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>