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

相关推荐

  • Java压缩zip文件存在文件或者目录乱码问题,压缩过滤乱码文件

    平时工作中有时候遇到要压缩的文件里面存在乱码,但是又不能一时半会儿能解决的。目前给临时的方案,在压缩的时候把乱码过滤掉,如果不过滤。通过Java来压缩或者解压的适合可能存在问题。 代码如下: package cn.utils; import java.io.File; import java.io.FileInputStream; import java.i…

    2022年7月14日
    6.3K14690
  • Intellij IDEA激活码,IDEA稳定专属激活码

    2018.2~2023版本用这个,下面激活码直接复制粘贴到activation code即可激活软件,如果是新的版本,换新激活码的时候code with me也要激活一次 FDXL1Y2811-eyJsaWNlbnNlSWQiOiJGRFhMMVkyODExIiwibGljZW5zZWVOYW1lIjoiQmVub2l0IE1lbmVuZGV6IiwiYXN…

    2023年4月13日
    1.4K800
  • Java操作SFTP工具类,文件上传下载删除,获取列表目录

    Java操作SFTP工具类,文件上传下载删除,获取列表目录 需要依赖的Maven包 <!– SFTP –> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>…

    2022年6月1日
    827770
  • 为什么不建议在Docker中部署数据库

    说明近些年来,docker凭借着容器化技术和便捷的操作征服了大多数开发者的心,恨不得将所有的软件环境,应用都部署到docker容器中,但数据库真的适合容器化吗?这是一个值得思考的问题,下面讨论和列举数据库不适合部署到容器的若干理由,仅供参考。 一、数据安全问题入门docker的都知道,容器是可以随时创建和销毁的,当执行rm操作删除容器时,容器内的数据就会丢失…

    学习笔记 2022年6月24日
    31310
  • fastdfs的一些常见错误 getStoreStorage fail, errno code: 2

    错误1:getStoreStorage fail, errno code: 2 这个错误是storage没有启动 或者是配置错误 ,这是其中一个可能 我这里出现这个问题是因为没有启动 storage 启动会去连接 tracker server 所以你要是出现启动 storage的时候一直在等待(或者说卡死)的情况下 是因为他一直在连接tracker serv…

    2022年7月11日
    5.2K10810

发表回复

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