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、運行測試
可以使用接口調用等方式,由於涉及具體業務,就不寫了。