• 基于url-to-pdf-api构建docker镜像,制作一个网页另存服务


    基于url-to-pdf-api构建docker镜像,制作一个网页另存服务

    业务背景:

    需要根据一个url路径打印这个网页的内容

    解决方案:

    1.使用wkhtml2pdf

    2.使用puppeteer

    根据网上的资料,wkhtml2pdf 可以安装在linux服务器,通过java api调用linux命令即可使用。但似乎对SPA(单页面应用)支持不是很好。puppeteer是谷歌出品,可以模拟谷歌引擎,支持SPA,打印效果较好。

    源代码下载

    根据某前端大佬指教,可以根据开源的 url-to-pdf-api 进行网页另存,其原理是封装了 puppeteer 进行网页抓取,大喜!!!
    下载url-to-pdf-api源代码(https://github.com/alvarcarto/url-to-pdf-api)
    本地安装node环境即可测试网页打印。但是这个服务需要安装至linux服务器,需要安装node并且通过npm install 安装node_modules,较复杂,使用docker打包成镜像可以解决这个问题。

    docker镜像制作

    开始时,我的Dockerfile写法是这样的

    FROM node:latest
    WORKDIR /app
    
    # copy package.json into the new directory
    COPY package.json /app
    
    # install the dependencies
    RUN npm install
    
    # copy all other files into the app directory
    COPY . /app
    
    #配置环境变量
    ENV HOST 0.0.0.0
    ENV PORT 9005
    ENV NODE_ENV production
    ENV ALLOW_HTTP true
    ENV DEBUG_MODE false
    # open port 9000
    EXPOSE 9005
    
    # run the server
    CMD node ./src/index.js
    #CMD [ "npm", "start"]
    

    但是我在启动镜像实例之后,测试无法使用,查看镜像实例日志,关键的一行错误信息如下:

    Error: Failed to launch the browser process
    

    通过网上的资料,我发现和我问题相似的博客:https://www.jianshu.com/p/2c88eb7459a4
    根据该博客,我修改了Dockerfile,内容如下:

    FROM node:latest
    
    # 注意改 source-sans-pro.zip
    # 这一步是需要先下载source-sans-pro-3.006R.zip的,由于我已经下载并解压,所以写法是这样
    COPY ./source-sans-pro-3.006R/ /usr/share/fonts/
    RUN sed -i 's/deb.debian.org/mirrors.163.com/g' /etc/apt/sources.list && 
        apt update && 
        apt-get install -y dpkg wget unzip
    
    # 2. https://github.com/puppeteer/puppeteer/blob/master/.ci/node10/Dockerfile.linux
    RUN apt-get update && 
        apt-get -y install xvfb gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 
          libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 
          libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 
          libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 
          libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget && 
        rm -rf /var/lib/apt/lists/*
    # create a directory to run docker
    WORKDIR /app
    
    # copy package.json into the new directory
    COPY package.json /app
    
    # install the dependencies
    RUN npm install
    
    # copy all other files into the app directory
    COPY . /app
    
    #配置环境变量
    ENV HOST 0.0.0.0
    ENV PORT 9005
    ENV NODE_ENV production
    ENV ALLOW_HTTP true
    ENV DEBUG_MODE false
    # open port 9000
    EXPOSE 9005
    
    # run the server
    CMD node ./src/index.js
    #CMD [ "npm", "start"]
    

    通过如下链接测试使用:

    http://localhost:9005/api/render?url=https://www.baidu.com
    

    出现问题,截图中的中文都是小方框,乱码。应该是中文字体不正确。
    可以使用两种方式解决:
    1.启动镜像实例后,使用docker cp复制中文字体至镜像内,重启实例
    2.启动实例时挂载宿主机字体目录到镜像实例字体目录

    我选择了第二种方式解决,我的docker 启动镜像实例命令如下:

    docker run -itd -p 9005:9005  -v /usr/share/fonts:/usr/share/fonts --name url2pdf-v6 docker-url2pdf:v6
    

    镜像导出

    由于,需要在其他宿主机中安装该镜像,可以使用docker save导出镜像

    先将镜像文件保存为tar文件
    docker save -o docker-url2pdf.tar docker-url2pdf:v6
    

    使用该命令后,会在当前目录下产生一个docker-url2pdf.tar 文件,但该文件很大,不利于网络传输,可以使用gzip命令进一步压缩

    使用gzip压缩文件
    gzip docker-url2pdf.tar
    

    压缩完成后将文件传输到宿主机后解压文件

    gunzip docker-url2pdf.tar.gz
    

    导入镜像即可使用,导入镜像命令如下:

    docker load < docker-url2pdf.tar
    

    还未解决的问题:

    url-to-pdf-api 在使用的时候支持很多参数,也支持cookie。但是我们在传递cookie时没有成功,尴尬!!!

    参考链接:

    https://github.com/alvarcarto/url-to-pdf-api
    https://www.jianshu.com/p/2c88eb7459a4
    https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#running-puppeteer-in-docker
    https://github.com/adobe-fonts/source-sans

    注意点:

    1.需要找到以下代码并注释掉

    page.on('console', (...args) => logger.info('PAGE LOG:', ...args));
    

    该代码会打印大量日志,影响性能

    2.如果打印出的网页中文乱码,需要查看镜像字体文件是否安装正确,如果不正确可以通过复制字体文件到容器实例内,
    或者启动时挂载宿主机中文字体文件目录即可进行补救。

  • 相关阅读:
    十大Intellij IDEA快捷键
    IDEA 在同一目录创建多个项目
    IDEA2017 使用(二)
    idea使用(一)
    js == 与 === 的区别[转]
    Spring Boot(一)
    微服务实战(一):微服务架构的优势与不足
    phpcms:三、头部包含
    phpcms:二、头部尾部包含
    phpcms:一、安装及新建模板
  • 原文地址:https://www.cnblogs.com/ixan/p/14454884.html
Copyright © 2020-2023  润新知