English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Utilizzare phantomJs per esportare le pagine web html in immagini
I. Sfondo
Come generare un'immagine in una小程序 e condividerla nei cerchi di amici? Al momento non ci sono soluzioni migliori per la parte front-end, quindi possiamo solo supportarla con il backend, allora come possiamo farlo?
La generazione di immagini è abbastanza semplice
I scenari semplici possono essere supportati direttamente con jdk, in generale non ci sono logiche troppo complesse
Ho scritto una logica di composizione di immagini prima, utilizzando awt: composizione di immagini
Modelli universali e complessi
I modelli semplici possono essere supportati direttamente, ma i modelli più complessi, lasciare che il backend supporti, è ovviamente meno attraente, ho cercato alcuni repository open source per la rendering di html su github, non so se è il mio metodo sbagliato o altro, non ho trovato risultati soddisfacenti
Ora come supportare i modelli complessi?
Questo è la guida di questo articolo, utilizzare phantomjs per la rendering di html, supporta la generazione di pdf, la generazione di immagini, l'analisi del dom è perfetta, quindi dimostriamo come combinare phantomjs per costruire un servizio di rendering di pagine web in immagini
II. Preparazione preliminare
1. Installazione di phantom.js
# 1. Scaricare ## sistema Mac wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-macosx.zip ## sistema Linux wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 ## windows 系统 ## 就不要玩了,没啥意思 # 2. 解压 sudo su tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 # 如果解压报错,则安装下面的 # yum -y install bzip2 # 3. 安装 ## 简单点,移动到bin目录下 cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin # 4. 验证是否ok phantomjs --version # 输出版本号,则表示ok
2. java依赖配置
maven 配置添加依赖
<!--phantomjs --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.53.1</version> </dependency> <dependency> <groupId>com.github.detro</groupId> <artifactId>ghostdriver</artifactId> <version>2.1.0</version> </dependency> <repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories>
开动
主要调用phantomjs来实现html渲染图片的逻辑如下
public class Html2ImageByJsWrapper { private static PhantomJSDriver webDriver = getPhantomJs(); private static PhantomJSDriver getPhantomJs() { //设置必要参数 DesiredCapabilities dcaps = new DesiredCapabilities(); //ssl证书支持 dcaps.setCapability("acceptSslCerts", true); // supporto della cattura dello schermo dcaps.setCapability("takesScreenshot", true); // supporto della ricerca CSS dcaps.setCapability("cssSelectorsEnabled", true); // supporto JavaScript dcaps.setJavascriptEnabled(true); // supporto del driver (il secondo parametro indica il percorso del tuo motore phantomjs, which/whereis phantomjs può vedere) // fixme qui è stato scritto l'esecuzione, potrebbe essere considerato se il sistema ha installato e ottenere il percorso corrispondente o aprire il percorso specificato dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "/usr/local/bin/phantomjs"); // crea un'istanza del browser senza interfaccia utente return new PhantomJSDriver(dcaps); } public static BufferedImage renderHtml2Image(String url) throws IOException { webDriver.get(url); File file = webDriver.getScreenshotAs(OutputType.FILE); return ImageIO.read(file); } }
test case
public class Base64Util { public static String encode(BufferedImage bufferedImage, String imgType) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, imgType, outputStream); return encode(outputStream); } public static String encode(ByteArrayOutputStream outputStream) { return Base64.getEncoder().encodeToString(outputStream.toByteArray()); } } @Test public void testRender() throws IOException { BufferedImage img = null; for (int i = 0; i < 20; ++i) { String url = "https://my.oschina.net/u/566591/blog/1580020"; long start = System.currentTimeMillis(); img = Html2ImageByJsWrapper.renderHtml2Image(url); long end = System.currentTimeMillis(); System.out.println("cost: " + (end - start)); } System.out.println(Base64Util.encode(img, "png")); }
Non allego le immagini generate, ma chi è interessato può testare direttamente sul mio sito web.
III. Misura di rete
Ho部署了一个简单的web应用在阿里云服务器上,支持html输出图片的功能;由于购买的是乞丐版,使用的前端模板又比较酷炫,所以打开较慢。
Dimostrazione operativa:
V. Progetto
Indirizzo del progetto:
quick-media
QuickMedia è un progetto open source che si concentra sulla gestione di immagini, audio, video e QR code per servizi multimediali.
Il codice sopra menzionato è stato testato da noi, se avete domande o bisogno di discutere, potete lasciare un commento qui sotto. Grazie per il supporto al manuale di urlo.