jdk版本1.8,python版本3.11
1、通过Runtime.getRuntime().exec()执行python代码,文件路径作为参数,返回python输出文件流
Java代码:
import java.io.*;
public class JavaPython {
//通过Runtime实现
public static void main(String[] args) throws IOException,InterruptedException {
BufferedReader reader=null;
BufferedReader error=null;
StringBuilder sbrs = null;
StringBuilder sberror = null;
try {
// python命令,或者解释器所处的绝对路径
String exe = "python";
// python代码文件绝对地址
String command = "D:\\codes\\web\\PdfReaderDemo2.py";
//pdf文件路径,参数
String path = "C:\\Users\\hp\\Desktop\\bionioaio.pdf";
String[] cmdArr = new String[] {exe,command,path};
//执行python命令,python D:\\codes\\web\\PdfReaderDemo2.py C:\\Users\\hp\\Desktop\\bionioaio.pdf
Process process = Runtime.getRuntime().exec(cmdArr);
//获取python中print的数据
reader = new BufferedReader(new InputStreamReader(process.getInputStream(),"gbk"));//获取字符输入流对象
error = new BufferedReader(new InputStreamReader(process.getErrorStream(), "utf-8"));//获取错误信息的字符输入流对象
sbrs = new StringBuilder();
sberror = new StringBuilder();
String line;
StringBuilder finalSbrs = sbrs;
//记录信息 while 循环获取不到数据,使用forEach
//while ((line = reader.readLine()) != null) {
// sbrs.append(line);
//}
reader.lines().forEach(e->{
finalSbrs.append(e+"\n");
// System.out.println(e);
});
//记录错误信息
while ((line = error.readLine()) != null) {
sberror.append(line);
}
// 等待进程完成
int exitCode = process.waitFor();
System.out.println("Exited with sbrs " + sbrs);
System.out.println("Exited with sberror " + sberror);
System.out.println("Exited with error code " + exitCode);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(reader!=null){
reader.close();
}
if(error!=null){
error.close();
}
}
}
}
2、fitz 是 PyMuPDF 库中的一个模块,用于处理 PDF 文档,安装后可以通过 import 导入fitz 读取pdf文件,pip工具来下载和安装第三方库,有时候很慢,可以更换国内的pip镜像源。
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install PyMuPDF
pip install fitz
确定\Python\Lib\site-packages目录下,已成功安装模块
PdfReaderDemo2.py脚本代码
# coding=utf-8
import fitz
import sys
# sys.argv获取python命令后参数,sys.argv[0] 得到的是得到的是python脚本名称
path = sys.argv[1]
#使用 fitz读取文件
pdf_document = fitz.open(path)
# 保存PDF文档的内容
text = ""
# pdf文档内容过长,java获取数据可能报错,可一次获取一页内容
for page_num in range(len(pdf_document)):
page = pdf_document.load_page(page_num)
text += page.get_text()
# 返回指定页面文档内容
# text = pdf_document.load_page(2).get_text()
# 关闭PDF文档
pdf_document.close()
# 打印文档内容
print(text)
本地测试可以读取pdf内容,如有问题,欢迎交流评论!