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 = _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().exec(cmd);
process.waitFor();
调⽤代码:
⾸先删除所有已⽣成的图⽚,获取1份pdf⽂件(系统针对单客户使⽤,正常不会产⽣多个),处理,最后清空pdf⽂件。
String pic_path = "/pic";
String pdf_path = "/pdf";
File file = FirstFile(pdf_path);
PdfUtils.Path(), pic_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 mirrors.aliyun/ubuntu/ bionic main restricted universe multiverse' > ./sources.list
echo 'deb mirrors.aliyun/ubuntu/ bionic-security main restricted universe multiverse' >> ./sources.list
echo 'deb mirrors.aliyun/ubuntu/ bionic-updates main restricted universe multiverse' >> ./sources.list
echo 'deb mirrors.aliyun/ubuntu/ bionic-proposed main restricted universe multiverse' >> ./sources.list
echo 'deb mirrors.aliyun/ubuntu/ bionic-backports main restricted universe multiverse' >> ./sources.list
echo 'deb-src mirrors.aliyun/ubuntu/ bionic main restricted universe multiverse' >> ./sources.list
echo 'deb-src mirrors.aliyun/ubuntu/ bionic-security main restricted universe multiverse' >> ./sources.list
echo 'deb-src mirrors.aliyun/ubuntu/ bionic-updates main restricted universe multiverse' >> ./sources.list
echo 'deb-src mirrors.aliyun/ubuntu/ bionic-proposed main restricted universe multiverse' >> ./sources.list
echo 'deb-src mirrors.aliyun/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 pypi.douban/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>
// 查询镜像
容器安装vim命令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、运⾏测试
可以使⽤接⼝调⽤等⽅式,由于涉及具体业务,就不写了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。