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、运行测试
可以使用接口调用等方式,由于涉及具体业务,就不写了。