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
)
;
}
}