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、运行测试

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

知止而后有定;定而后能静;静而后能安;安而后能虑;虑而后能得。
原文地址:https://www.cnblogs.com/SamNicole1809/p/15371284.html