java使用phantomjs实现网页截图

一个springboot的简单demo,通过phantomjs插件实现对访问页面截图功能,下图是项目结构
java使用phantomjs实现网页截图
主要涉及以下几个类
java使用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 2017-05-22.
 */
@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();
        }
    }
}

截图效果:java使用phantomjs实现网页截图