java使用phantomjs实现网页截图
一个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 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();
}
}
}
截图效果: