今天看到某網(wǎng)友關(guān)于“如何以Java實現(xiàn)網(wǎng)頁截圖技術(shù)”的咨詢帖,由于出現(xiàn)該咨詢的地點非常不適合較長回復(fù),故以博文形式回答。
事實上,如果您想以Java實現(xiàn)網(wǎng)頁截圖,也就是“輸入一段網(wǎng)址,幾秒鐘過后就能截取一張網(wǎng)頁縮略圖”的效果。那么,您至少有3種方式可以選擇。
1、最直接的方式——使用Robot
方法詳解:該方法利用Robat提供的強(qiáng)大桌面操作能力,硬性調(diào)用瀏覽器打開指定網(wǎng)頁,并將網(wǎng)頁信息保存到本地。
優(yōu)勢:簡單易用,不需要任何第三方插件。
缺點:不能同時處理大量數(shù)據(jù),技術(shù)含量過低,屬于應(yīng)急型技巧。
實現(xiàn)方法:使用如下代碼即可。
2、最常規(guī)的方式——利用JNI,調(diào)用第三方C/C++組件
方法詳解:目前來講,Java領(lǐng)域?qū)τ诰W(wǎng)頁截圖組件的開發(fā)明顯不足(商機(jī)?),當(dāng)您需要完成此種操作時,算得上碰到了Java的軟肋。但是,眾所周知Java也擁有強(qiáng)大的JNI能力,可以輕易將C/C++開發(fā)的同類組件引為己用。
優(yōu)勢:實現(xiàn)簡單,只需要封裝對應(yīng)的DLL文件,就可以讓Java實現(xiàn)同類功能。
劣勢:同其他JNI實現(xiàn)一樣,在跨平臺時存在隱患,而且您的程序?qū)⒉辉賹儆诩僇ava應(yīng)用。
實現(xiàn)方法:可參見此用例,具體封裝何種C/C++組件請自行選擇。
PS:示例來源于ACA HTML to Image Converter項目(http://www.acasystems.com/en/web-thumb-activex/faq-convert-html-to-image-in-java.htm ),這是一個收費的HTML轉(zhuǎn)Image第三方組件,但封裝方式在Java中大同小異。
引用JNI封裝:
CPP部分的實現(xiàn):
以該組件圖像化yahoo界面的效果圖:
3、最扎實的方法——自行解析HTML標(biāo)記,并將其圖像化
方法詳解:眾所周知,HTML之所以在瀏覽器中以具體的網(wǎng)頁格式出現(xiàn),并非服務(wù)器端傳了一整個應(yīng)用到客戶端,而是源自于瀏覽器對于客戶端自行解析的結(jié)果。因此,只要我們將對應(yīng)的解析一一實現(xiàn),那么將網(wǎng)頁圖形化,就將不是什么難事。
優(yōu)勢:純Java實現(xiàn),一勞永逸,一旦開發(fā)完成則永遠(yuǎn)通用,而且有一定的商用價值。
劣勢:開發(fā)費時,且需要針對不同語法做精確分析,才能保證輸出的基本正確。尤其在涉及到JavaScript解析時,難度將尤其增大。
實現(xiàn)方法:目前尚無具體案例可供參考。但是,由于Java有jdic之類的瀏覽器項目存在(https://jdic.dev.java.net/ ),而Java圖形界面又屬繪制生成。從理論上說,我們可以將所有具備Graphics的組件圖形化保存。
而如果自行解析,那么您需要建立HTML解析器(或使用第三方的,萬幸Java在這方面的組件很多),了解Java2D機(jī)制,了解何時該使用drawString繪制文字,何時又該使用drawImage插入圖片等等。
補充:
這是一個利用內(nèi)置瀏覽器截圖的示例,使用了DJNativeSwing組件。
示例工程下載地址(Eclipse工程,含lib):http://greenvm.googlecode.com/files/Screenshot.7z
浙公網(wǎng)安備 33010602011771號