Java调用PhantomJs将网页转换成PDF或者长图片

PhantomJS 是一个基于WebKit的服务器端 JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。PhantomJS可以用于页面自动化,网络监测,网页截屏,以及无界面测试等。

需要先安装好phantomjs
Java调用PhantomJs将网页转换成PDF或者长图片

执行使用到JS渲染加载,代码:

var page = require('webpage').create(),
    system = require('system'),
    address, output, size;

if (system.args.length < 3 || system.args.length > 5) {
    console.log('Usage: rasterize.js URL filename');
    phantom.exit(1);
} else {
    address = system.args[1];
    output = system.args[2];

    console.log(page.settings.userAgent );

    // 不加分页的话,只输出一页pdf,底部会有大量空白。
    //google "phantomjs render pdf bottom blank" 可以看到别人也报过这种bug
    // 最终查找Phantomjs generates multiple page PDF 竟然解决了问题
    page.paperSize = { format: 'A4', orientation: 'portrait', margin: '0.8cm' };
    // page.viewportSize = { width: 600, height: 800 };
    console.log("open page now");
    page.open(address, function (status) {

        //evaluate注册一个回调函数,页面加载完就执行。用来操作页面中的DOM元素

        //修改微信公众号文章中图片lazy load的方式
        var size = page.evaluate(function () {
            //此函数在目标页面执行的,上下文环境非本phantomjs,所以不能用到这个js中其他变量

            //这个控制台打印的效果在phantomjs执行界面看不到
            console.log('start image lazy loading');
            var imgs = document.getElementsByTagName('img');
            var size = 0;

            console.log(size);

            for (var i = imgs.length - 1; i >= 0; i--) {
              var data_src = imgs[i].getAttribute("data-src");
              if (data_src){
                imgs[i].setAttribute("src", data_src);
                size++;
              }
            }
            return size;

        } );
        console.log("change lazy load img number:" + size);

        // 预留一定的渲染时间
        window.setTimeout(function () {
            page.render(output);
            page.close();
            console.log('render ok');
            phantom.exit();
        }, 5000);
    });
};

手动执行命令

./phantomjs getPdf.js https://cftweb.3g.qq.com/privacy/privacyPolicy?content_id=73fa6604b9102a6d4ed976999335fa22 /temp/test.pdf

Java调用PhantomJs将网页转换成PDF或者长图片

查看执行后PDF结果,最终生成的pdf渲染效果良好,无排版错乱

Java调用PhantomJs将网页转换成PDF或者长图片

通过java代码调用方式

package cn.utils;

import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.Objects;

/**
 * @author bing
 * @version 1.0.0
 * @ClassName PhantomJsUtils.java
 * @Description TODO
 * @createTime 2022年05月31日 15:04:00
 */
@Slf4j
public class PhantomJsUtils {

    public static String getImage(String phantomjsPath, String url,String outPahth) {
        String osName = System.getProperty("os.name");
        String suffix = Objects.nonNull(osName) && osName.toLowerCase().contains("windows") ? ".exe" : "";
        phantomjsPath = phantomjsPath+ File.separator + "PhantomJS" + File.separator;
        String cmdStr = phantomjsPath  +"phantomjs"+ suffix + " "+ phantomjsPath + "getPdf.js " + url +" "+ outPahth;
        Runtime rt = Runtime.getRuntime();
        log.info("phantomjs={}", cmdStr);
        try {
            File path = new File(phantomjsPath);
            Process ps = rt.exec(cmdStr, (String[])null, path);
            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
            StringBuilder sb = new StringBuilder();

            String line;
            while((line = br.readLine()) != null) {
                sb.append(line);
            }

            String result = sb.toString();
            return result;
        } catch (Exception e) {
            log.warn("phantomjs error {}", e.getMessage(), e);
            return "";
        }
    }

    public static void main(String[] args) {
        String phantomPahth = "F:/temp/"; //工具目录
        String url = "https://cftweb.3g.qq.com/privacy/privacyPolicy?content_id=73fa6604b9102a6d4ed976999335fa22"; //网页内容
        String outPahth = "F:/temp//test.png"; //图片输出目录

        String result = getImage(phantomPahth, url, outPahth);
        System.out.println(result);
    }

}

发布者:小站,转转请注明出处:http://blog.gzcity.top/4592.html

(1)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月25日 17:33
下一篇 2022年6月1日 17:39

相关推荐

  • 2022年Web前端开发流程和学习路线(详尽版)

    前言 前端侧重于人机交互和用户体验,后端侧重于业务逻辑和大规模数据处理。理论上,面向用户的产品里,所有问题(包括产品、设计、后端、甚至看不见的问题)的表现形式,都会暴露在前端,而只有部分问题(数据问题、计算问题、安全问题等)暴露在后端,这就意味着前端起到了至关重要的承载和连接作用。前端技术的更新日新月异;前端框架的技术选型百家争鸣;视觉审美的潮流不断更替;可…

    2022年7月6日
    37040
  • 关于Apache log4j存在远程代码执行漏洞的预警

    12月9日晚,互联网上公开了Apache log4j2的一个严重级别的远程代码执行漏洞。由于Apache log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求触发远程代码执行漏洞,而无需特殊配置。Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受此漏洞影响。鉴于该框架应用范围极广,且漏洞利…

    2022年8月3日
    320110
  • 【Vue学习总结】2. Vue目录结构分析

    接上篇《1.Vue环境搭建、运行第一个项目》 上一篇我们主要讲解了Vue的环境的搭建,本篇我们主要来分析Vue项目的目录结构。 一、Vue项目文件目录详情介绍 下面就是上一篇我们搭建的一个样例工程的完整结构(install后): 其中包括了node_modules、build、config、src、static以及test文件夹,还有index.html的超…

    2022年7月6日
    29010
  • Java复制文件&文件夹工具类

    Java复制文件&文件夹工具类 package cn.utils; import java.io.*; /** * 复制文件夹 * */ public class CopyDirUtil { /** * 复制文件夹 * * @param resource 源路径 * @param target 目标路径 */ public static void c…

    2022年6月17日
    24.0K50200
  • Linux命令汇总 | vim | shell | 进阶【2022版】

    Linux大全 一、Linux上下五千年 1.1 历史长河 Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布。 它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程…

    2022年6月24日
    29900

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(1条)

  • Binance úcet
    Binance úcet 2025年2月9日 04:34

    Your point of view caught my eye and was very interesting. Thanks. I have a question for you.