• Springboot调用Python文件 并在docker中打包部署


    Springboot项目,要求在程序中调用Python代码,获取PDF文件中的图片。

    首先把Python代码贴上来(亲测可用):

    pdf_path是PDF文件路径,pic_path是图片目录,执行会获取PDF文件第一页的图片,保存到pic目录中(这是我们的业务需求)。

    import fitz
    import os
    from sys import argv
    
    pdf_path = argv[1]
    pic_path = argv[2]
    
    doc = fitz.open(pdf_path)
    page = doc[0]
    images = page.get_images()
    i = 1
    for image in images:
        pix = fitz.Pixmap(doc, image[0])
        name = "{}.png".format(i)
        if pix.n < 4:
            pix.writePNG(os.path.join(pic_path, name))
        else:
            pix0 = fitz.Pixmap(fitz.csRGB, pix)
            pix0.writePNG(os.path.join(pic_path, name))
        i += 1

    如需遍历,可获取PDF文件总页数,进行遍历。

    doc.page_count

    实际相当于执行:

    python <./***.py> <pdf_path> <pic_path>

    Springboot代码:

    // python3.6 环境中运行python的命令,根个人配置有关,有可能是python3或python
    // /py/pdf2pic.py 部署环境中pdf2pic.py文件的位置
    // pdf_path 部署环境中pdf文件目录的路径
    // pic_path 部署环境中pic文件目录的路径
    String[] cmd = new String[]{"python3.6", "/py/pdf2pic.py", pdf_path, pic_path}; Process process = Runtime.getRuntime().exec(cmd); process.waitFor();

    调用代码:

    首先删除所有已生成的图片,获取1份pdf文件(系统针对单客户使用,正常不会产生多个),处理,最后清空pdf文件。

    String pic_path = "/pic";
    String pdf_path = "/pdf";
    PdfUtils.removeAllFile(pic_path);
    File file = PdfUtils.getFirstFile(pdf_path);
    PdfUtils.pdf2pic(file.getPath(), pic_path);
    PdfUtils.removeAllFile(pdf_path);

    docker部署:(需要一点Linux和Docker基础,详细操作就不一一列出了)

    由于Springboot项目需要依赖Java环境,.py文件执行需要Python环境,没找到非常合适的镜像,因此就自己搭了一个。

    我是基于ubuntu18.04搭建的。

    过程简述如下:(希望给有困惑的朋友,坚定一下方向)

    1、首先下载ubuntu18.04镜像:

    docker pull ubuntu:18.04

    2、运行并进入容器:

    docker run -it ubuntu:18.04

    3、换源:(要不贼慢)

    cd /etc/apt
    echo 'deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse' > ./sources.list
    echo 'deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse' >> ./sources.list
    echo 'deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse' >> ./sources.list
    echo 'deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse' >> ./sources.list
    echo 'deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse' >> ./sources.list
    echo 'deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse' >> ./sources.list
    echo 'deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse' >> ./sources.list
    echo 'deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse' >> ./sources.list
    echo 'deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse' >> ./sources.list
    echo 'deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse' >> ./sources.list
    

    4、更新apt

    apt update

    5、下载vim(可选)

    apt-get install vim

    6、安装Java环境

    // 下载JDK
    apt-get install openjdk-8-jdk
    // 配置环境变量
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

    7、安装Python环境(依赖可以根据需要装,在此不一一列举了,我只需要pdfplumber和pymupdf)

    // 安装Python3.6
    apt-get install python3.6
    // 安装并升级pip3(使用豆瓣源,要不贼慢)
    apt-get install python3-pip
    pip3 install --upgrade pip -i https://pypi.douban.com/simple
    // 安装Python运行相关配置(可选,不装或部分装)
    apt-get install python3-dev build-essential libssl-dev libffi-dev libxml2-dev libxslt1-dev zlib1g-dev

    8、验证环境

    java -version
    python --version

    9、保存镜像

    // 找到ubuntu镜像对应容器的ID
    docker ps -a
    // 保存镜像
    docker commit <ID> <image_name>
    // 查询镜像
    docker images

    10、创建Dockerfile

    引用的是我定义好的镜像,根据业务需要在根目录下创建了pdf、pic和py三个目录,与代码中的文件目录位置是对应的。

    由于是通过jar包运行的,在代码中获取位置是错误的,因此,采用了新建目录的方案。

    FROM java-python-base:v1.0
    VOLUME /tmp
    COPY template-0.0.1-SNAPSHOT.jar app.jar
    RUN bash -c "touch /app.jar && mkdir pdf && mkdir pic && mkdir py"
    EXPOSE 9601
    ENTRYPOINT ["java", "-jar", "app.jar", "--server.port=9601", "/log/app.log"]

    11、打包并将.py文件copy到运行的容器中,其实是可以在打包时直接cp的

    // 打包
    docker build -t java-python-test:v1.0.0 .
    // 运行
    docker run -d -p 9601:9601 java-python-test:v1.0.0
    // 查询运行ID
    docker ps
    // 找到ID并复制.py文件
    docker cp ./pdf2pic.py <ID>:/py/

    12、运行测试

    可以使用接口调用等方式,由于涉及具体业务,就不写了。

    知止而后有定;定而后能静;静而后能安;安而后能虑;虑而后能得。
  • 相关阅读:
    要看的博客
    sleep(0)的妙用
    Spring Cloud:Eureka的多网卡IP选择问题
    SpringBoot整合swagger
    springboot整合redis(注解形式)
    RSA非对称加密
    java split(regex,limit) 使用记录
    windows git支持arc命令
    eclipse安装反编译插件
    使用@Validated分组遇到的坑
  • 原文地址:https://www.cnblogs.com/SamNicole1809/p/15371284.html
Copyright © 2020-2023  润新知