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、運行測試

可以使用接口調用等方式,由於涉及具體業務,就不寫了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM