使用phantomjs.exe ,html2pdf.js两个文件生成pdf.
命令行执行命令:
执行命令 :.\phantomjs.exe .\html2pdf.js https://blog.csdn.net/synshitou/article/details/115318337?spm=1001.2014.3001.5502
生成的pdf:
java 方法下载简历:
package com.qiyee.job.common.utils; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URL; /** * @author syn on 2021-09-02 19:36:00 * @ClassName : com.uu.husky.utils.Html2pdfUtil * @Description : 类描述 */ @Slf4j public class Html2pdfUtil { /** * windows下执行方法 * @param url * @return * @throws IOException */ public static String parseHtml2PdfWindows(String url) { URL resource = Thread.currentThread().getContextClassLoader().getResource(""); String property = resource.getPath() +"download/"; property = property.replaceFirst("/", ""); return getFileHtml(url, property," windows"); } /** * 部署在docker容器中执行 * @param url * @return * @throws IOException */ public static String parseHtml2PdfOnLinux(String url) { String property = "/qiyee/pdf/"; return getFileHtml(url, property," linux"); } private static String getFileHtml(String url,String property,String oSname) { StringBuffer sbf = null; Runtime rt =null; Process p =null; InputStream is=null; BufferedReader br =null; try { rt = Runtime.getRuntime(); String js=property+"phantomjs "; String html=property+"html2pdf.js "; p = rt.exec(js+html+url+oSname); is = p.getInputStream(); br = new BufferedReader(new InputStreamReader(is)); sbf = new StringBuffer(); String tmp = ""; while ((tmp = br.readLine()) != null) { if (tmp.toLowerCase().contains("error")){ continue; } sbf.append(tmp); } } catch (IOException e) { log.error(e.getMessage()); } finally { if (p!=null){ p.destroy(); } try { is.close(); br.close(); } catch (IOException e) { log.error(e.getMessage()); } } String resultstr = sbf.toString(); System.out.println("resultstr:"+resultstr); String[] arr = resultstr.split("\\$"); String result = ""; for(String s : arr){ if(s.endsWith("pdf")){ result = s; } } return result; } /** * 下载简历 * @param response * @param url */ public static void downLoadResumePdf(HttpServletResponse response,String url){ log.info("请求要生成pdf的url:"+url); String fileUrl=""; if (!StringUtils.hasText(url)){ return; } if (OSinfo.isLinux()){ fileUrl = parseHtml2PdfOnLinux(url); } if (OSinfo.isWindows()){ fileUrl = parseHtml2PdfWindows(url); } FileDownloadUtils.download(fileUrl,response); } public static void main(String[] args) throws Exception { long start = System.currentTimeMillis(); String result = parseHtml2PdfOnLinux("https://blog.csdn.net/synshitou/article/details/115318337?spm=1001.2014.3001.5502"); long all = System.currentTimeMillis()- start; System.out.println("pdf生成地址:"+result+",用时:"+all/1000+"秒"); } }
下载的方法:
public static HttpServletResponse download(String path, HttpServletResponse response) { try { // path是指欲下载的文件的路径。 File file = new File(path); // 取得文件名。 String filename = file.getName(); // 取得文件的后缀名。 String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase(); // 以流的形式下载文件。 InputStream fis = new BufferedInputStream(new FileInputStream(path)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 清空response response.reset(); // 设置response的Header response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes())); response.addHeader("Content-Length", "" + file.length()); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); //下载完删除文件 deleteFile(path); } catch (IOException ex) { ex.printStackTrace(); } return response; }
js 文件:
var page = require('webpage').create(); var system = require('system'); 读取命令行参数,也就是js文件路径。 var baseUrl=system.args[0].slice(0,-12); var oSName=system.args[2]; if (system.args.length === 1) { console.log('Usage: loadspeed.js <some URL>'); //这行代码很重要。凡是结束必须调用。否则phantomjs不会停止 phantom.exit(); } page.settings.loadImages = true; //加载图片 page.settings.resourceTimeout = 30000;//超过10秒放弃加载 //截图设置, //page.viewportSize = { // width: 1000, // height: 3000 //}; var address = system.args[1]; page.open(address, function(status) { function checkReadyState() {//等待加载完成将页面生成pdf setTimeout(function () { var readyState = page.evaluate(function () { return document.readyState; }); if ("complete" === readyState) { page.paperSize = { width:'400px',height:'570px',orientation: 'portrait',border: '1cm' }; var timestamp = Date.parse(new Date()); var pdfname = 'HT_'+timestamp + Math.floor(Math.random()*1000000); if (oSName.indexOf("win")==-1){ baseUrl=""; } var outpathstr = baseUrl+"/qiyee/pdf/"+pdfname+".pdf"; page.render(outpathstr); //console.log就是传输回去的内容。 console.log("生成成功"); console.log("$"+outpathstr+"$"); phantom.exit(); } else { checkReadyState(); } },3000); } checkReadyState(); });