使用phantomjs.exe ,html2pdf.js两个文件生成pdf.
命令行执行命令:

执行命令 :.\phantomjs.exe .\html2pdf.js https://blog.youkuaiyun.com/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.youkuaiyun.com/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();
});
本文介绍了如何使用PhantomJS和html2pdf.js在命令行中将网页转换为PDF,提供了Java方法实现此功能,并展示了在Windows和Linux环境下不同的执行方式。同时,还给出了下载生成PDF的实现细节,包括文件路径处理和错误处理。
641

被折叠的 条评论
为什么被折叠?



