url 转pdf工具

使用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();
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值