Docker微服務之Html轉Pdf,Html轉Image

weixin_33762321發表於2017-08-30

Html轉Pdf(Image)的方案應該很多,這裡介紹的是docker的一個微服務的方式,利用了工具wkhtmltopdf。

一、Docker微服務

Docker微服務首先是一種服務,暴露一個介面給使用者(一個application),使用者通過埠請求並獲得服務。

  • 首先,建立一個映象,一般是自建Dockerfile,用 docker build -t serverImageName -f Dockerfile .
    或者使用他人的映象docker pull serverImageName
  • 其次,執行一個容器作為服務,常用docker run -d --name serverContainerName -p hostPort:DockerPort serverImageName:version(':version'可以省略,預設是latest版本)。
  • 呼叫
    • 應用容器,docker run --link serverContainerName:alias applicationImageName.容器的資料通訊通過引數--link解決。
    • PHP程式呼叫:get('alias:hostPort'),可以用php-curl-class等。
    • 其他呼叫,比如瀏覽器呼叫nginx(httpd)。

推薦閱讀: 搭建LNMP環境,加深對docker的瞭解.(在本教程中,mysql就是一個微服務供php7通過引數link的當時呼叫,php7是個微服務被nginx通過引數link呼叫,nginx是個微服務,被瀏覽器呼叫)
我一直覺得最好的教程還是官方教程,不懂的用有道等翻譯,英語慢慢學。

二、工具wkhtmltopdf、wkhtmltoimage

官網 https://wkhtmltopdf.org/

介紹

wkhtmltopdf and wkhtmltoimage are open source (LGPLv3) command line tools to render HTML into PDF and various image formats using the Qt WebKit rendering engine. These run entirely "headless" and do not require a display or display service.

linux上的安裝

cd /tmp
wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
tar xf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz && rm wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
ln -s -T /tmp/wkhtmltox/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf && \
chmod a+x /usr/local/bin/wkhtmltopdf &&  \
ln -s -T /tmp/wkhtmltox/bin/wkhtmltoimage /usr/local/bin/wkhtmltoimage && \
chmod a+x /usr/local/bin/wkhtmltoimage

使用

wkhtmltopdf http://google.com google.pdf or wkhtmltopdf /tmp/google.html google.local.pdf

可選項options

wkhtmltopdf --lowquality --quiet --load-error-handling ignore --load-media-error-handling ignore http://google.com google.pdf
更多參看:https://wkhtmltopdf.org/usage/wkhtmltopdf.txt 或者wkhtmltoimage -h

三、PHP包php-htmltopdf-htmltoimage

將wkhtmltopdf封裝成一個PHP包,github地址:https://github.com/biaoqianwo/php-htmltopdf-htmltoimage

四、docker微服務完整例項

簡單實現一個(無須第三方框架的):
POST http://html2pdf-serve/index.php
輸入:html(string),options(array),type(pdf|image)
輸出:pdf和圖片原始碼

  • 建立專案app
  • 下載wkhtmltox-0.12.4_linux-generic-amd64.tar.xz到app目錄下(省去耗時的下載過程)
  • 新建composer.json:
{
    "require": {
        "biaoqianwo/php-htmltopdf-htmltoimage": "^1.1"
    }
}

然後執行composer install
或者composer require biaoqianwo/php-htmltopdf-htmltoimage
如果主機沒有安裝composer的話,怎麼辦?就需要用到composer的映象。請自行學習。

  • 新建index.php檔案:
<?php
require __DIR__ . '/vendor/autoload.php';

use Biaoqianwo\Html2Pdf\Html2Pdf;
use Biaoqianwo\Html2Pdf\Html2Image;

$post = $_POST;
$html = $post['html'];
$options = $post['options'];
$type = $post['type'];

if ($type == 'image') {
    // Image
    $generator = new Html2Image('/usr/local/bin/wkhtmltoimage');
    $result = $generator->getOutputFromHtml($html, $options);
} else {
    // Pdf
    $generator = new Html2Pdf('/usr/local/bin/wkhtmltopdf');
    $result = $generator->getOutputFromHtml($html, $options);
}
echo $result;

  • 書寫Dockerfile,內容如下:
FROM php:7.1-apache

MAINTAINER 704872038@qq.com

RUN apt-get update

# Install dependencies needed for wkhtmltopdf
RUN apt-get install -y libxrender1 libfontconfig1 libxext6 fonts-arphic-bkai00mp fonts-arphic-bsmi00lp \
 fonts-arphic-gbsn00lp fonts-arphic-gkai00mp fonts-dejavu-core fonts-droid fonts-liberation fonts-lmodern \
 fonts-tibetan-machine xfonts-utils xfonts-75dpi xfonts-100dpi

ENV TIMEZONE="Asia/Shanghai"

# Set PHP timezone (both cli and apache)
RUN echo "date.timezone=\"${TIMEZONE}\"" > /usr/local/etc/php/conf.d/timezone.ini

# Make logs dir writable for apache user
RUN mkdir -p /var/www/html/logs
RUN chown -R www-data:www-data /var/www/html/logs

# Copy project files to the image
COPY . /var/www/html

# Install wkhtmltopdf
RUN tar xf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz && rm wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
RUN ln -s -T /var/www/html/wkhtmltox/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf && \
 chmod a+x /usr/local/bin/wkhtmltopdf && \
 ln -s -T /var/www/html/wkhtmltox/bin/wkhtmltoimage /usr/local/bin/wkhtmltoimage && \
 chmod a+x /usr/local/bin/wkhtmltoimage

# Make logs dir mountable
VOLUME /var/www/html/logs

然後,建立一個映象 docker build -t biaoqianwo/html2pdf .
然後,開啟微服務(執行一個容器):docker run --publish 8080:80 --name html2pdf-server biaoqianwo/html2pdf
這樣,就可以通過介面(比如postman,cURL等工具)測試了。

進一步優化

新建一個run.sh,將上述過程放到一個shell指令碼中完成,實現bash run.sh開始一個微服務。

#!/bin/sh
# Install php dependencies
composer install
composer cleanable

# Use 'latest' tag if it is unset, or explicitly set to null.
docker build --tag=biaoqianwo/html2pdf:${TAG:-'latest'} .

# run a container
docker run \
    --detach \
    --publish 8080:80 \
    biaoqianwo/html2pdf:${TAG:-'latest'}

相關文章