java使用phantomjs实现网页截图

本文介绍了一个使用SpringBoot和PhantomJS实现的网页截图服务。该服务可通过HTTP请求接收URL和尺寸参数,返回指定大小的页面截图。核心组件包括CaptureImgService接口及其实现类CaptureImgServiceImpl,利用PhantomJS插件进行截图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个springboot的简单demo,通过phantomjs插件实现对访问页面截图功能,下图是项目结构
在这里插入图片描述
主要涉及以下几个类
在这里插入图片描述

package com.example.demo.service;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * Created by HuangYanfei on 2018/11/8.
 */
public interface CaptureImgService {

    String captureImg(HttpServletRequest re, String url, String size) throws IOException;
}

package com.example.demo.service.impl;

import com.example.demo.service.CaptureImgService;
import com.example.demo.service.ScreenCaptureService;
import com.example.demo.util.DateUtils;
import com.example.demo.util.ResourceUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Date;

/**
 * Created by HuangYanfei on 2018/11/8.
 */
@Service
public class CaptureImgServiceImpl implements CaptureImgService {

//    @Value("${temp.path}")
    private String pdfPath = "E:/pdfpath/";

    @Autowired
    private ResourceUtil resourceUtil;

    @Autowired
    private ScreenCaptureService phantomSer;

    @Override
    /**
     * 截屏
     **/
    public String captureImg(HttpServletRequest re, String url, String size) throws IOException {
        String img = "";
        String plugin = resourceUtil.getFilePath("files/sysplugins/phantomjs");
        String os = System.getProperty("os.name").toLowerCase();
        if (os.contains("windows")) {
            plugin = resourceUtil.getFilePath("files/sysplugins/phantomjs.exe");
        }
        String js = resourceUtil.getFilePath("files/sysplugins/rasterize.js");

        File file = new File(this.pdfPath);
        if (!file.exists()) {
            file.mkdirs();
        }

        img = this.pdfPath + DateUtils.format(new Date(), "yyyyMMddHHmmss") + System.nanoTime() + ".png";

        File pluginFile = new File(plugin);
        if (!pluginFile.canExecute()) {
            pluginFile.setExecutable(true);
        }

        File jsFile = new File(js);

        if (!phantomSer.exec(plugin, jsFile.getAbsolutePath(), url, img, size)) {
            return null;
        }

        return img;
    }
}

package com.example.demo.service;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * Created by HuangYanfei on 2018/11/8.
 */
public interface CaptureImgService {

    String captureImg(HttpServletRequest re, String url, String size) throws IOException;
}

package com.example.demo.service.impl;

import com.example.demo.service.ScreenCaptureService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

@Service("phantomServiceImpl")
public class PhantomServiceImpl implements ScreenCaptureService {

    private static final Logger LOGGER = LoggerFactory.getLogger(PhantomServiceImpl.class);

    @Override
    public boolean exec(String... args) {



        LOGGER.info(Arrays.toString(args).replaceAll(","," "));

        Process process = null;

        StringBuilder msg = new StringBuilder();

        try {
            process = Runtime.getRuntime().exec(args);
            BufferedReader input = new BufferedReader(
                    new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = input.readLine()) != null) {
                LOGGER.warn(line);
            }
            input.close();
        } catch (IOException e) {
            LOGGER.error(e.getMessage(), e);
            msg.append("error");
        }
        return !msg.toString().endsWith("error");
    }


}
package com.example.demo.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;

/**
 * Created by HuangYanfei on 2018/9/29.
 */
@Component
public class ResourceUtil {
    @Autowired
    private ResourceLoader resourceLoader;

    /**
     * 根据文件名字获取路径
     *
     * @param fileNameAndPath
     * @return
     */
    public String getFilePath(String fileNameAndPath) throws IOException {
        File file = resourceLoader.getResource("file:"+ fileNameAndPath).getFile();
        if(!file.exists()) {
            file = resourceLoader.getResource("classpath:"+ fileNameAndPath).getFile();
        }
        return file.getAbsolutePath();
    }
}

测试一下:

package com.example.demo.service.impl;

import com.example.demo.service.CaptureImgService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.net.URLEncoder;

/**
 * Created by HuangYanfei on 2018/11/8.
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class CaptureImgServiceImplTest {

    @Autowired
    CaptureImgService captureImgService;
    @Test
    public void test(){
        try {
            captureImgService.captureImg(null, "https://www.baidu.com/" , "800px*800px");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

截图效果:在这里插入图片描述

插件可以从我的百度云盘获取,也可以自行下载
链接:https://pan.baidu.com/s/11WOYHQ7auy-woDr8hClcxA
提取码:pbc5

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值