网页截图 根据关键字定位 然后截取图片


maven

< dependency > < groupId > com.hynnet </ groupId > < artifactId > DJNativeSwing </ artifactId > < version > 1.0.0 </ version > </ dependency >
< dependency > < groupId > com.hynnet </ groupId > < artifactId > DJNativeSwing-SWT </ artifactId > < version > 1.0.0 </ version > </ dependency > 
< dependency > < groupId > org.eclipse.swt.org.eclipse.swt.win32.win32.x86_64.4.3.swt </ groupId > < artifactId > org.eclipse.swt.win32.win32.x86_64 </ artifactId > < version > 4.3 </ version > </ dependency >



public class TestPrint extends JPanel {
private static final long serialVersionUID = 1L ;
    // 行分隔符
final static public String LS = System. getProperty ( "line.separator" , "/n" ) ;
// 文件分割符
final static public String FS = System. getProperty ( "file.separator" , "//" ) ;
// 当网页超出目标大小时 截取
final static public int maxWidth = 2000 ;
final static public int maxHeight = 1400 ;

/**
* @param file 预生成的图片全路径
* @param url 网页地址
* @return boolean
*/
public TestPrint ( final String file , final String url , final String WithResult) {
super ( new BorderLayout()) ;
JPanel webBrowserPanel = new JPanel( new BorderLayout()) ;
final JWebBrowser webBrowser = new JWebBrowser( null ) ;
webBrowser.setBarsVisible( false ) ;
webBrowser.navigate(url) ;
webBrowserPanel.add(webBrowser , BorderLayout. CENTER ) ;
add(webBrowserPanel , BorderLayout. CENTER ) ;
JPanel panel = new JPanel( new FlowLayout()) ;
webBrowser.addWebBrowserListener( new WebBrowserAdapter() {
// 监听加载进度
public void loadingProgressChanged (WebBrowserEvent e) {
// 当加载完毕时
if (e.getWebBrowser().getLoadingProgress() == 100 ) {
String result = (String) webBrowser .executeJavascriptWithResult( WithResult ) ;
int index = result == null ? - 1 : result.indexOf( ":" ) ;
NativeComponent nativeComponent = webBrowser .getNativeComponent() ;
Dimension originalSize = nativeComponent.getSize() ;
Dimension imageSize = new Dimension(Integer. parseInt (result.substring( 0 , index)) ,
Integer. parseInt (result.substring(index + 1 ))) ;
imageSize. width = Math. max (originalSize. width , imageSize. width + 50 ) ;
imageSize. height = Math. max (originalSize. height , imageSize. height + 50 ) ;
nativeComponent.setSize(imageSize) ;
BufferedImage image = new BufferedImage(imageSize. width , imageSize. height ,
BufferedImage. TYPE_INT_RGB ) ;
nativeComponent.paintComponent(image) ;
nativeComponent.setSize(originalSize) ;
// 当网页超出目标大小时
if (imageSize. width > maxWidth || imageSize. height > maxHeight ) {
// 截图部分图形
image = image.getSubimage( 0 , 0 , maxWidth , maxHeight ) ;
// 此部分为使用缩略图
/*
* int width = image.getWidth(), height = image
* .getHeight(); AffineTransform tx = new
* AffineTransform(); tx.scale((double) maxWidth /
* width, (double) maxHeight / height);
* AffineTransformOp op = new AffineTransformOp(tx,
* AffineTransformOp.TYPE_NEAREST_NEIGHBOR); // 缩小 image
* = op.filter(image, null);
*/
}
try {
// 输出图像
ImageIO. write (image , "jpg" , new File( file )) ;
} catch (IOException ex) {
ex.printStackTrace() ;
}
// 退出操作
//System.exit(0);
}
}
}) ;
add(panel , BorderLayout. SOUTH ) ;
}

// javascript 脚本获得网页全屏后大小
public static String getScreenWidthHeight () {
StringBuffer jsDimension = new StringBuffer() ;
jsDimension.append( "var width = 0;" ).append( LS ) ;
jsDimension.append( "var height = 0;" ).append( LS ) ;
jsDimension.append( "if(document.documentElement) {" ).append( LS ) ;
jsDimension.append( " width = Math.max(width, document.documentElement.scrollWidth);" ).append( LS ) ;
jsDimension.append( " height = Math.max(height, document.documentElement.scrollHeight);" ).append( LS ) ;
jsDimension.append( "}" ).append( LS ) ;
jsDimension.append( "if(self.innerWidth) {" ).append( LS ) ;
jsDimension.append( " width = Math.max(width, self.innerWidth);" ).append( LS ) ;
jsDimension.append( " height = Math.max(height, self.innerHeight);" ).append( LS ) ;
jsDimension.append( "}" ).append( LS ) ;
jsDimension.append( "if(document.body.scrollWidth) {" ).append( LS ) ;
jsDimension.append( " width = Math.max(width, document.body.scrollWidth);" ).append( LS ) ;
jsDimension.append( " height = Math.max(height, document.body.scrollHeight);" ).append( LS ) ;
jsDimension.append( "}" ).append( LS ) ;
jsDimension.append( "return width + ':' + height;" ) ;
return jsDimension.toString() ;
}

public static void printUrlScreen2jpg ( final ArrayList<Map<String , String>> mapList , final int width , final int height) {
NativeInterface. open () ;
SwingUtilities. invokeLater ( new Runnable() {
public void run () {
for ( int i = 0 ; i < mapList .size() ; i++) {
String withResult = "var temp = '" + mapList .get(i).get( "keyWord" ) + "'; var rng = document.body.createTextRange(); rng.findText(temp); rng.moveStart('character',-800); rng.scrollIntoView(); var width = " + width + ";var height = " + height + ";return width +':' + height;" ;
if ( width == 0 || height == 0 )
withResult = getScreenWidthHeight () ;
JFrame frame = new JFrame( " 网页截图 " ) ;
// 加载指定页面,最大保存为 640x480 的截图
frame.getContentPane().add( new TestPrint( "E:/zhf/print/" + System. currentTimeMillis () + ".jpg" , mapList .get(i).get( "url" ) , withResult) ,
BorderLayout. CENTER ) ;
frame.setSize( 640 , 480 ) ;
// 仅初始化,但不显示
frame.invalidate() ;
frame.pack() ;
frame.setVisible( false ) ;
}
}
}) ;
}

public static Logger log = Logger. getLogger (TestPrint. class ) ;

public static void main (String[] args) {
ArrayList<Map<String , String>> list = new ArrayList<>() ;
list.add( new HashMap<String , String>() {{
put( "keyWord" , " 百年前连云港有了国内第一条陇海铁路。百年后依然只是这条铁路。。呵呵 " ) ;
}}) ;
TestPrint. printUrlScreen2jpg (list , 1400 , 900 ) ;
}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值