Html轉(zhuǎn)Pdf(Image)的方案應(yīng)該很多,這里介紹的是docker的一個微服務(wù)的方式逊朽,利用了工具wkhtmltopdf。
一叽讳、Docker微服務(wù)
Docker微服務(wù)首先是一種服務(wù)追他,暴露一個接口給使用者(一個application),使用者通過端口請求并獲得服務(wù)岛蚤。
- 首先邑狸,創(chuàng)建一個鏡像,一般是自建Dockerfile涤妒,用
docker build -t serverImageName -f Dockerfile .
或者使用他人的鏡像docker pull serverImageName
单雾。 - 其次,運(yùn)行一個容器作為服務(wù)她紫,常用
docker run -d --name serverContainerName -p hostPort:DockerPort serverImageName:version
(':version'可以省略硅堆,默認(rèn)是latest版本)。 - 調(diào)用
- 應(yīng)用容器犁苏,
docker run --link serverContainerName:alias applicationImageName
.容器的數(shù)據(jù)通信通過參數(shù)--link解決硬萍。 - PHP程序調(diào)用:get('alias:hostPort'),可以用php-curl-class等。
- 其他調(diào)用围详,比如瀏覽器調(diào)用nginx(httpd)朴乖。
- 應(yīng)用容器犁苏,
推薦閱讀: 搭建LNMP環(huán)境,加深對docker的了解.(在本教程中助赞,mysql就是一個微服務(wù)供php7通過參數(shù)link的當(dāng)時調(diào)用买羞,php7是個微服務(wù)被nginx通過參數(shù)link調(diào)用,nginx是個微服務(wù)雹食,被瀏覽器調(diào)用)
我一直覺得最好的教程還是官方教程畜普,不懂的用有道等翻譯,英語慢慢學(xué)群叶。
二吃挑、工具wkhtmltopdf、wkhtmltoimage
官網(wǎng) 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微服務(wù)完整實例
簡單實現(xiàn)一個(無須第三方框架的):
POST http://html2pdf-serve/index.php
輸入:html(string),options(array),type(pdf|image)
輸出:pdf和圖片源碼
- 創(chuàng)建項目app
- 下載wkhtmltox-0.12.4_linux-generic-amd64.tar.xz到app目錄下(省去耗時的下載過程)
- 新建composer.json:
{
"require": {
"biaoqianwo/php-htmltopdf-htmltoimage": "^1.1"
}
}
然后執(zhí)行composer install
赎离。
或者composer require biaoqianwo/php-htmltopdf-htmltoimage
如果主機(jī)沒有安裝composer的話逛犹,怎么辦?就需要用到composer的鏡像。請自行學(xué)習(xí)虽画。
- 新建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,內(nèi)容如下:
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
然后,創(chuàng)建一個鏡像 docker build -t biaoqianwo/html2pdf .
然后舞蔽,開啟微服務(wù)(運(yùn)行一個容器):docker run --publish 8080:80 --name html2pdf-server biaoqianwo/html2pdf
這樣,就可以通過接口(比如postman码撰,cURL等工具)測試了渗柿。
進(jìn)一步優(yōu)化
新建一個run.sh,將上述過程放到一個shell腳本中完成,實現(xiàn)bash run.sh
開始一個微服務(wù)灸拍。
#!/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'}