Java調(diào)用py或者exe文件實(shí)現(xiàn)Word轉(zhuǎn)PDF
前言
有次上班時小伙伴和我吐槽Java實(shí)現(xiàn)word轉(zhuǎn)pdf太麻煩,我靈機(jī)一動Java調(diào)用python,python實(shí)現(xiàn)轉(zhuǎn)換操作不就行了。
開發(fā)環(huán)境
Java:JDK1.8
python:3.12
代碼
Python代碼
import docx2pdf
import sys
import glob
import os
import comtypes
import comtypes.client
def w2ps(d):
word_file = d
pdf_file = d.replace('.docx', '.pdf').replace('.doc', '.pdf')
docx2pdf.convert(word_file, pdf_file)
print(f"轉(zhuǎn)換完成,PDF文件已保存為:{pdf_file}")
def each():
# 獲取當(dāng)前工作目錄
current_directory = os.getcwd()
# 使用glob查找所有.doc文件
doc_files = glob.glob(os.path.join(current_directory, '*.doc'))
doc_files1 = glob.glob(os.path.join(current_directory, '*.docx'))
# 遍歷文件列表并打印文件路徑
if len(doc_files) > 0:
# 初始化 Word 應(yīng)用程序
word = comtypes.client.CreateObject('Word.Application')
word.Visible = False # 不顯示 Word 界面
for file_path in doc_files:
doc = word.Documents.Open(file_path)
# 導(dǎo)出為 PDF
doc.SaveAs(file_path.replace('.doc', '.pdf'), FileFormat=17) # 17 是 PDF 格式的代碼
doc.Close()
word.Quit()
# w2ps(file_path)
for file_path in doc_files1:
w2ps(file_path)
if __name__ == "__main__":
if len(sys.argv) > 1:
w2ps(sys.argv[1])
else:
each()
sys.exit()Java代碼
import java.io.IOException;
public class PythonCaller {
public static void main111(String[] args) {
String pythonScriptPath = "D:\\WorkSpace\\python\\pycorrector-master\\shany\\W2P.py"; // Python腳本的路徑
String wordFilePath = "E:\\新建文件夾 (22)\\問題排查.docx"; // 要轉(zhuǎn)換的Word文件的路徑
try {
String command = "python " + pythonScriptPath + " \"" + wordFilePath+"\"";
Process process = Runtime.getRuntime().exec(command);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String executablePath = "D:\\新建文件夾\\a\\W2P.exe"; // 替換為你的a.exe文件的實(shí)際路徑
String wordFilePath = "E:\\新建文件夾 (22)\\問題排查.docx"; // 替換為你的Word文件路徑
try {
// 將Word文件路徑作為命令行參數(shù)傳遞給a.exe
String[] command = {executablePath, wordFilePath};
Process process = Runtime.getRuntime().exec(command);
// 等待進(jìn)程完成
int exitCode = process.waitFor();
System.out.println("Process exited with code " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}備注
這里的python文件后來為了防止缺少三方依賴,單獨(dú)打包成exe文件。Java代碼中額外加了對exe文件的調(diào)用。
因?yàn)閐oc轉(zhuǎn)pdf的類庫沒找到,這里處理邏輯改為如果是doc文件,就調(diào)用Microsoft Word進(jìn)行轉(zhuǎn)換。
打包py為exe時,必須指定引入comtypes.client,打包命令如下
pyinstaller --onefile --noconsole --hidden-import=comtypes.stream wwp.py
這段命令解析:把一個叫做wwp.py的文件轉(zhuǎn)換為exe,額外引入comtypes.client,不顯示命令行窗口(--noconsole)
拓展
順手額外寫了一個pdf轉(zhuǎn)word的,功能用法基本一樣
from pdf2docx import Converter
import sys
import glob
import os
def pdf_to_word(pdf_path, word_path):
cv = Converter(pdf_path)
cv.convert(word_path, start=0, end=None)
cv.close()
def p2ws(file_path):
pdf_file = file_path
word_file = file_path.replace('.pdf', '.docx')
pdf_to_word(pdf_file, word_file)
print(f"轉(zhuǎn)換完成,WORD文件已保存為:{pdf_file}")
def each():
# 獲取當(dāng)前工作目錄
current_directory = os.getcwd()
# 使用glob查找所有.doc文件
doc_files = glob.glob(os.path.join(current_directory, '*.pdf'))
# 遍歷文件列表并打印文件路徑
for file_path in doc_files:
p2ws(file_path)
if __name__ == "__main__":
if len(sys.argv) > 1:
p2ws(sys.argv[1])
else:
each()到此這篇關(guān)于Java調(diào)用py或者exe文件實(shí)現(xiàn)Word轉(zhuǎn)PDF的文章就介紹到這了,更多相關(guān)Java Word轉(zhuǎn)PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java實(shí)現(xiàn)Word轉(zhuǎn)PDF的全過程
- Java實(shí)現(xiàn)一鍵將Word文檔轉(zhuǎn)為PDF
- Java實(shí)現(xiàn)WORD和PDF互相轉(zhuǎn)換以及數(shù)據(jù)填充示例
- java將word轉(zhuǎn)pdf的方法示例詳解
- Java將Word文檔轉(zhuǎn)換為PDF文件的幾種常用方法總結(jié)
- Java中Word與PDF轉(zhuǎn)換為圖片的方法詳解
- Java將Word轉(zhuǎn)換成PDF的常用用法
- 探討Java 將Markdown文件轉(zhuǎn)換為Word和PDF文檔
- Java將word文件轉(zhuǎn)成pdf文件的操作方法
- Java實(shí)現(xiàn)word/pdf轉(zhuǎn)html并在線預(yù)覽
- Java實(shí)現(xiàn)一鍵將Word文檔轉(zhuǎn)為PDF的兩種方法
相關(guān)文章
SpringBoot集成Redis之配置、序列化與持久化方式
本文介紹了Redis的基本概念、常用數(shù)據(jù)類型及操作、SpringBoot整合Redis的方法、高級特性與安全性、性能優(yōu)化、測試與部署、數(shù)據(jù)一致性及版本更新等內(nèi)容,通過本文的學(xué)習(xí),讀者可以掌握Redis的使用方法,并在實(shí)際項(xiàng)目中發(fā)揮其優(yōu)勢2024-11-11
SpringMVC參數(shù)傳遞之基本數(shù)據(jù)類型和復(fù)雜對象說明
這篇文章主要介紹了SpringMVC參數(shù)傳遞之基本數(shù)據(jù)類型和復(fù)雜對象說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
運(yùn)行Springboot測試類查詢數(shù)據(jù)庫數(shù)據(jù)顯示白網(wǎng)頁問題及解決方法
Spring Boot應(yīng)用未能啟動的原因是它沒有找到合適的數(shù)據(jù)庫配置具體來說,它需要一個數(shù)據(jù)源(DataSource),但未能在你的配置中找出,也沒有找到任何嵌入式數(shù)據(jù)庫(H2, HSQL 或 Derby),本文給大家分享運(yùn)行Springboot測試類查詢數(shù)據(jù)庫數(shù)據(jù)顯示白網(wǎng)頁問題及解決方法,一起看看吧2023-11-11
解決springboot自定義注解AOP在controller上導(dǎo)致controller注入失敗問題
這篇文章主要介紹了解決springboot自定義注解AOP在controller上導(dǎo)致controller注入失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
深入淺析Java中Static Class及靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類的不同
上次有朋友問我,java中的類可以是static嗎?我給他肯定的回答是可以的,在java中我們可以有靜態(tài)實(shí)例變量、靜態(tài)方法、靜態(tài)塊。當(dāng)然類也可以是靜態(tài)的,下面小編整理了些關(guān)于java中的static class相關(guān)資料分享在腳本之家平臺供大家參考2015-11-11
詳解Java的MyBatis框架中動態(tài)SQL的基本用法
這篇文章主要介紹了詳解Java的MyBatis框架中動態(tài)SQL的基本用法,文中列出了一些常用SQL動態(tài)語句進(jìn)行講解,需要的朋友可以參考下2016-04-04
SpringCloudStream原理和深入使用小結(jié)
Spring?Cloud?Stream是一個用于構(gòu)建與共享消息傳遞系統(tǒng)連接的高度可擴(kuò)展的事件驅(qū)動型微服務(wù)的框架,本文給大家介紹SpringCloudStream原理和深入使用,感興趣的朋友跟隨小編一起看看吧2024-06-06
IntelliJ IDEA 2020.2正式發(fā)布,兩點(diǎn)多多總能助你提效
這篇文章主要介紹了IntelliJ IDEA 2020.2正式發(fā)布,諸多亮點(diǎn)總有幾款能助你提效,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-07-07

