English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
phantomJs를 사용하여 html 웹 페이지를 이미지로 출력하는 것을 구현합니다
I. 배경
小程序에서 이미지를 생성하고 친구 사진에 공유하는 방법은 어떻게 하나요? 현재 프론트엔드에서는 만족스러운 해결책이 없어서 백엔드에서 지원해야 합니다. 그렇다면 어떻게 할 수 있을까요?
이미지 생성은 매우 간단합니다
간단한 시나리오는 JDK를 사용하여 지원할 수 있습니다. 일반적으로 복잡한 로직은 없습니다
이전에 awt를 사용하여 이미지 합성 로직을 작성했습니다: 이미지 합성
일반적이고 복잡한 템플릿
간단한 것은 직접 지원할 수 있지만, 복잡한 것은 백엔드에서 지원하는 것이 더 나쁩니다. github에서도 html 렌더링을 지원하는 오픈소스 라이브러리를 검색했지만, 방법이 잘못되었는지 모르겠지만 만족스러운 결과는 없었습니다
현재 복잡한 템플릿을 어떻게 지원해야 하나요?
이 글의 가이드와는phantomjs를 사용하여 html 렌더링을 구현하고 pdf, 이미지 생성, dom 파싱을 지원합니다. 그 다음은phantomjs를 사용하여 웹 페이지를 이미지로 변환하는 서비스를 구축하는 방법을 설명합니다
II. 前提準備
1. phantom.js インストール
# 1. ダウンロード ## mac システム wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-macosx.zip ## 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 # バージョンを出力すると正常
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>
出発
main으로phantomjs를呼び出してhtmlを画像に変換するロジックは以下の通りです
public class Html2ImageByJsWrapper { private static PhantomJSDriver webDriver = getPhantomJs(); private static PhantomJSDriver getPhantomJs() { //必要パラメータの設定 DesiredCapabilities dcaps = new DesiredCapabilities(); //ssl証明書サポート dcaps.setCapability("acceptSslCerts", true); //스크린샷 지원 dcaps.setCapability("takesScreenshot", true); //CSS 검색 지원 dcaps.setCapability("cssSelectorsEnabled", true); //자바스크립트 지원 dcaps.setJavascriptEnabled(true); //드라이버 지원(두 번째 매개변수는 PhantomJS 엔진이 있는 경로를 나타냅니다,which/whereis phantomjs를 통해 확인할 수 있습니다)( // fixme 여기서 실행이 적혀 있지만, 시스템에 설치되어 있는지 확인하고 해당 경로를 가져올 수 있습니다. 또는 경로를 지정할 수 있습니다. dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "/usr/local/bin/phantomjs"); //비주얼 브라우저 객체 생성 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); } }
테스트 케이스
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"); }
생성된 이미지는 붙이지 않았습니다. 관심이 있으면 직접 제 웹사이트에서 실제 테스트할 수 있습니다.
III. 네트워크 실제 테스트
아리yun 서버에 간단한 웹 애플리케이션을 배포했으며 html 출력 이미지 기능을 지원합니다.乞丐版을 구매했기 때문에, 앞면 템플릿이 매우 스릴리해서 열리는 데 시간이 걸립니다.
작업 시연:
V. 프로젝트
프로젝트 주소:
quick-media
QuickMedia는 이미지, 오디오 비디오, QR 코드 처리 등 멀티미디어 서비스에 대한 개방형 프로젝트입니다.
위 코드는 우리의 테스트를 통과했습니다. 모르시거나 논의하고 싶은 점이 있으면 아래에 댓글을 달아 주세요.呐喊 강의에 대한 지원에 감사합니다.