word如何轉換為pdf

pip install pywin32
import os
import win32com.client
import pythoncom  # 新增:用于處理COM線程
import sysdef docx_to_pdf(docx_path, pdf_path=None):"""將Word文檔轉換為PDF格式,修復退出時的COM錯誤"""if not os.path.exists(docx_path):raise FileNotFoundError(f"文件不存在: {docx_path}")if pdf_path is None:pdf_path = os.path.splitext(docx_path)[0] + ".pdf"# 初始化COM線程(避免線程相關的錯誤)pythoncom.CoInitialize()word = Nonedoc = Nonetry:# 創建Word應用對象word = win32com.client.Dispatch("Word.Application")word.Visible = False# 打開文檔(添加只讀參數,避免鎖定文件)doc = word.Documents.Open(docx_path, ReadOnly=True)# 保存為PDFdoc.SaveAs2(pdf_path, FileFormat=17)print(f"轉換成功: {pdf_path}")except Exception as e:print(f"轉換失敗: {str(e)}")finally:# 先關閉文檔(確保文檔先釋放)if doc is not None:doc.Close(SaveChanges=0)  # 0表示不保存更改doc = None  # 顯式釋放對象# 再退出Word(確保文檔關閉后再退出)if word is not None:try:word.Quit()except Exception as e:# 忽略退出時的錯誤(因為轉換已成功)print(f"關閉Word時警告: {str(e)}")word = None  # 顯式釋放對象# 釋放COM資源pythoncom.CoUninitialize()if __name__ == "__main__":# 檢查命令行參數if len(sys.argv) < 2:print("單文件Word轉PDF轉換器")print("用法: python docx_to_pdf.py <Word文件路徑> [輸出PDF路徑]")print("示例1: python docx_to_pdf.py D:\\d\\a.docx")print("示例2: python docx_to_pdf.py D:\\d\\a.docx D:\\d\\output.pdf")sys.exit(1)# 獲取輸入文件路徑input_file = sys.argv[1]# 獲取輸出文件路徑(如果提供了)output_file = sys.argv[2] if len(sys.argv) > 2 else None# 檢查輸入文件是否存在if not os.path.exists(input_file):print(f"錯誤: 輸入文件不存在: {input_file}")sys.exit(1)# 檢查輸入文件是否為Word文檔if not input_file.lower().endswith(('.doc', '.docx')):print(f"錯誤: 輸入文件不是Word文檔: {input_file}")sys.exit(1)# 執行轉換try:docx_to_pdf(input_file, output_file)print("轉換完成!")except Exception as e:print(f"轉換過程中發生錯誤: {str(e)}")sys.exit(1)

然后在java里面調用這個腳本

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;public class PythonScriptCaller {/*** 調用Python腳本實現Word轉PDF* @param scriptPath Python腳本的絕對路徑* @param docxPath 需要轉換的Word文檔路徑* @return 轉換結果(成功/失敗信息)*/public static String callDocxToPdfScript(String scriptPath, String docxPath) {// 構建命令:python 腳本路徑 文檔路徑(通過參數傳遞docx路徑,增強靈活性)String[] command = {"python", scriptPath, docxPath};ProcessBuilder processBuilder = new ProcessBuilder(command);// 合并錯誤流到輸出流,方便統一處理processBuilder.redirectErrorStream(true);Process process = null;StringBuilder result = new StringBuilder();try {// 啟動進程執行命令process = processBuilder.start();// 讀取腳本輸出InputStream inputStream = process.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 適配中文輸出String line;while ((line = reader.readLine()) != null) {result.append(line).append("\n");}// 等待進程執行完成int exitCode = process.waitFor();if (exitCode == 0) {result.append("腳本執行成功,退出碼:").append(exitCode);} else {result.append("腳本執行失敗,退出碼:").append(exitCode);}} catch (IOException e) {result.append("執行腳本時發生IO錯誤:").append(e.getMessage());} catch (InterruptedException e) {result.append("腳本執行被中斷:").append(e.getMessage());Thread.currentThread().interrupt(); // 恢復中斷狀態} finally {if (process != null) {process.destroy(); // 確保進程銷毀}}return result.toString();}// 測試方法public static void main(String[] args) {// 替換為實際的腳本路徑和Word文檔路徑String scriptPath = "D:\\git\\docx_to_pdf\\docx_to_pdf.py";String docxPath = "D:\\d\\a.docx";String result = callDocxToPdfScript(scriptPath, docxPath);System.out.println("轉換結果:\n" + result);}
}

批量遞歸

import os
import win32com.client
import pythoncom
import shutil
import sysdef convert_all_docs_to_pdf(source_dir, target_dir):"""遞歸遍歷源目錄,將所有Word文檔轉換為PDF并保存到目標目錄Args:source_dir: 源目錄路徑target_dir: 目標目錄路徑"""# 確保目標目錄存在if not os.path.exists(target_dir):os.makedirs(target_dir)# 遍歷源目錄for root, dirs, files in os.walk(source_dir):# 計算相對路徑relative_path = os.path.relpath(root, source_dir)if relative_path == '.':relative_path = ''# 創建對應的目標目錄target_subdir = os.path.join(target_dir, relative_path)if not os.path.exists(target_subdir):os.makedirs(target_subdir)# 處理當前目錄下的文件for file in files:if file.endswith(('.doc', '.docx')):# 源文件路徑source_file_path = os.path.join(root, file)# 目標PDF文件路徑(保持相同文件名但擴展名為.pdf)pdf_filename = os.path.splitext(file)[0] + '.pdf'target_file_path = os.path.join(target_subdir, pdf_filename)# 轉換文件print(f"正在轉換: {source_file_path}")docx_to_pdf(source_file_path, target_file_path)print("所有文件轉換完成!")def docx_to_pdf(docx_path, pdf_path=None):"""將Word文檔轉換為PDF格式,修復退出時的COM錯誤"""if not os.path.exists(docx_path):raise FileNotFoundError(f"文件不存在: {docx_path}")if pdf_path is None:pdf_path = os.path.splitext(docx_path)[0] + ".pdf"# 初始化COM線程(避免線程相關的錯誤)pythoncom.CoInitialize()word = Nonedoc = Nonetry:# 創建Word應用對象word = win32com.client.Dispatch("Word.Application")word.Visible = False# 打開文檔(添加只讀參數,避免鎖定文件)doc = word.Documents.Open(docx_path, ReadOnly=True)# 保存為PDFdoc.SaveAs2(pdf_path, FileFormat=17)print(f"轉換成功: {pdf_path}")except Exception as e:print(f"轉換失敗: {str(e)}")finally:# 先關閉文檔(確保文檔先釋放)if doc is not None:doc.Close(SaveChanges=0)  # 0表示不保存更改doc = None  # 顯式釋放對象# 再退出Word(確保文檔關閉后再退出)if word is not None:try:word.Quit()except Exception as e:# 忽略退出時的錯誤(因為轉換已成功)print(f"關閉Word時警告: {str(e)}")word = None  # 顯式釋放對象# 釋放COM資源pythoncom.CoUninitialize()if __name__ == "__main__":# 檢查命令行參數if len(sys.argv) < 3:print("批量轉換Word文檔到PDF")print("用法: python batch_doc_to_pdf.py <源目錄> <目標目錄>")print("示例: python batch_doc_to_pdf.py D:\\d1 D:\\d2")sys.exit(1)source_directory = sys.argv[1]target_directory = sys.argv[2]# 檢查源目錄是否存在if not os.path.exists(source_directory):print(f"錯誤: 源目錄不存在: {source_directory}")sys.exit(1)# 檢查源目錄和目標目錄是否相同(防止誤操作)if os.path.abspath(source_directory) == os.path.abspath(target_directory):print("錯誤: 源目錄和目標目錄不能相同")sys.exit(1)print(f"開始轉換: {source_directory} -> {target_directory}")# 執行轉換convert_all_docs_to_pdf(source_directory, target_directory)

java調用python 批量腳本:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;public class PythonBatchConverter {/*** 調用Python批量轉換腳本實現Word轉PDF* @param scriptPath Python腳本的絕對路徑* @param sourceDir 源目錄路徑* @param targetDir 目標目錄路徑* @return 轉換結果(成功/失敗信息)*/public static String callBatchConversionScript(String scriptPath, String sourceDir, String targetDir) {// 構建命令:python 腳本路徑 源目錄 目標目錄String[] command = {"python", scriptPath, sourceDir, targetDir};ProcessBuilder processBuilder = new ProcessBuilder(command);// 合并錯誤流到輸出流,方便統一處理processBuilder.redirectErrorStream(true);Process process = null;StringBuilder result = new StringBuilder();try {// 啟動進程執行命令process = processBuilder.start();// 讀取腳本輸出InputStream inputStream = process.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 適配中文輸出String line;while ((line = reader.readLine()) != null) {result.append(line).append("\n");}// 等待進程執行完成int exitCode = process.waitFor();if (exitCode == 0) {result.append("批量轉換執行成功,退出碼:").append(exitCode);} else {result.append("批量轉換執行失敗,退出碼:").append(exitCode);}} catch (IOException e) {result.append("執行腳本時發生IO錯誤:").append(e.getMessage());} catch (InterruptedException e) {result.append("腳本執行被中斷:").append(e.getMessage());Thread.currentThread().interrupt(); // 恢復中斷狀態} finally {if (process != null) {process.destroy(); // 確保進程銷毀}}return result.toString();}/*** 調用單個文件轉換腳本實現Word轉PDF* @param scriptPath Python腳本的絕對路徑* @param docxPath 需要轉換的Word文檔路徑* @return 轉換結果(成功/失敗信息)*/public static String callSingleFileScript(String scriptPath, String docxPath) {// 構建命令:python 腳本路徑 文檔路徑String[] command = {"python", scriptPath, docxPath};ProcessBuilder processBuilder = new ProcessBuilder(command);// 合并錯誤流到輸出流,方便統一處理processBuilder.redirectErrorStream(true);Process process = null;StringBuilder result = new StringBuilder();try {// 啟動進程執行命令process = processBuilder.start();// 讀取腳本輸出InputStream inputStream = process.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 適配中文輸出String line;while ((line = reader.readLine()) != null) {result.append(line).append("\n");}// 等待進程執行完成int exitCode = process.waitFor();if (exitCode == 0) {result.append("單文件轉換執行成功,退出碼:").append(exitCode);} else {result.append("單文件轉換執行失敗,退出碼:").append(exitCode);}} catch (IOException e) {result.append("執行腳本時發生IO錯誤:").append(e.getMessage());} catch (InterruptedException e) {result.append("腳本執行被中斷:").append(e.getMessage());Thread.currentThread().interrupt(); // 恢復中斷狀態} finally {if (process != null) {process.destroy(); // 確保進程銷毀}}return result.toString();}// 測試方法 - 批量轉換public static void main(String[] args) {// 替換為實際的腳本路徑和目錄路徑String scriptPath = "D:\\git\\docx_to_pdf\\batch_doc_to_pdf.py";String sourceDir = "D:\\d1";String targetDir = "D:\\d2";String result = callBatchConversionScript(scriptPath, sourceDir, targetDir);System.out.println("批量轉換結果:\n" + result);// 測試單文件轉換String singleFileScriptPath = "D:\\git\\docx_to_pdf\\docx_to_pdf.py";String docxPath = "D:\\d1\\a.docx";String singleResult = callSingleFileScript(singleFileScriptPath, docxPath);System.out.println("單文件轉換結果:\n" + singleResult);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96135.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96135.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96135.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

服務器Linux防火墻怎樣實現訪問控制

在互聯網世界里&#xff0c;Linux服務器就像一座城池&#xff0c;而防火墻便是城池的守衛者。沒有防火墻&#xff0c;外部的任何流量都能毫無阻攔地進入服務器;而有了防火墻&#xff0c;就可以像設關卡一樣&#xff0c;對進出城門的人進行盤查和控制。對企業運維人員來說&#…

【原創理論】Stochastic Coupled Dyadic System (SCDS):一個用于兩性關系動力學建模的隨機耦合系統框架

【原創理論】Stochastic Coupled Dyadic System (SCDS)&#xff1a;一個用于兩性關系動力學建模的隨機耦合系統框架 作者&#xff1a;[望月&#xff0c;GPT5,GPT-O3,Gemini2.5pro] 分類&#xff1a; 人工智能 理論模型 交叉學科 系統科學 人性 愛情 標簽&#xff1a; 關系動力…

星圖云開發者平臺新功能速遞 | 微服務管理器:無縫整合異構服務,釋放云原生開發潛能

在構建現代數字化應用的過程中&#xff0c;開發者常常面臨一個關鍵挑戰&#xff1a;如何高效、安全地集成和復用既有的復雜服務或自有業務系統&#xff1f;這些服務可能是核心算法引擎、遺留業務邏輯模塊&#xff0c;或是特定的SaaS能力。傳統方式下&#xff0c;將它們融入新的…

數據結構:構建 (create) 一個二叉樹

目錄 問題的本質——什么信息才能唯一確定一棵樹&#xff1f; 推導“最佳拍檔”——哪兩種遍歷序列能行&#xff1f; 遞歸思想——如何構建一棵樹&#xff1f; 第1步&#xff1a;確定整棵樹的根節點 第2步&#xff1a;劃分左右子樹的成員 第3步&#xff1a;遞歸構建左右子…

【STM32】HAL庫中的實現(五):ADC (模數轉換)

什么是 ADC&#xff08;模數轉換器&#xff09; ADC&#xff08;Analog to Digital Converter&#xff09;是將 模擬信號&#xff08;電壓&#xff09;轉換成數字信號&#xff08;數值&#xff09; 的器件。 在 STM32 中&#xff0c;ADC 通常具有以下特性&#xff1a;特性描述分…

智慧校園中IPTV融合對講:構建高效溝通新生態

在智慧校園的建設浪潮里&#xff0c;IPTV融合對講系統宛如一顆璀璨的新星&#xff0c;以其獨特的功能和強大的優勢&#xff0c;為校園的溝通與管理帶來了全新的變革&#xff0c;構建起一個高效、便捷、智能的溝通新生態。從日常溝通層面來看&#xff0c;IPTV融合對講系統打破了…

智能合約里的 “拒絕服務“ 攻擊:讓你的合約變成 “死機的手機“

你有沒有遇到過手機突然卡死&#xff0c;點什么都沒反應的情況&#xff1f;在區塊鏈世界里&#xff0c;智能合約也可能遭遇類似的 "罷工"—— 這就是 "拒絕服務攻擊"&#xff08;Denial of Service&#xff0c;簡稱 DoS&#xff09;。今天用大白話講講合約…

安全設計-防止非法移機

前言我們的設備在實際使用過程中&#xff0c;在我們的巡查機制粒度下&#xff0c;發現依然有設備被非法移動到其他非計劃點位。因此&#xff0c;我們需要設計一套及時預警&#xff0c;但是對客戶無感&#xff0c;不影響業務辦理的防范機制。1.方案設計交互圖2.方案說明 2.1方案…

OpenHarmony之三方庫適配深度實踐:從移植到合規的全鏈路指南

1. 為什么要做三方庫適配?——更深層的價值分析 維度 現狀痛點 預期收益 深度價值 生態 成熟開源庫無法直接運行 復用 10+ 年開源沉淀,提升功能覆蓋率 避免生態碎片化:通過標準化適配流程,確保不同廠商對同一庫的實現一致 性能 JS 層重實現耗 CPU 原生 C/C++ 加速 3~10 倍 …

2025年09月計算機二級MySQL選擇題每日一練——第一期

計算機二級中選擇題是非常重要的&#xff0c;所以開始寫一個每日一題的專欄。 答案及解析將在末尾公布&#xff01; 今日主題&#xff1a;MySQL 基礎概念 1、以下關于數據庫的特點中&#xff0c;描述正確的是&#xff08; &#xff09; A. 數據無冗余 B. 數據不可共享&#xff…

JAVA字符串操作——在藍橋杯的基本應用

我們來系統地梳理一下 Java 中的字符串操作。Java 的字符串操作非常豐富&#xff0c;主要涉及到 String、StringBuilder 和 StringBuffer 這三個核心類。 目錄 一、核心類簡介 二、String 類的常用操作 1. 創建字符串 2. 獲取基本信息 3. 比較字符串 4. 查找與判斷 5. 轉…

【深度學習基礎】PyTorch Tensor生成方式及復制方法詳解

目錄PyTorch Tensor生成方式及復制方法詳解一、Tensor的生成方式&#xff08;一&#xff09;從Python列表/元組創建&#xff08;二&#xff09;從NumPy數組創建&#xff08;三&#xff09;特殊初始化方法&#xff08;四&#xff09;從現有Tensor創建&#xff08;五&#xff09;…

動態規劃:入門思考篇

1. 簡單類比 假如我們要求全國人數&#xff0c;那么我們只要知道各個省的人數&#xff0c;然后將各個省的人數相加即可&#xff0c;要想知道各個省的人數&#xff0c;只要將這個省下面所有的市人數相加即可&#xff0c;同樣&#xff0c;如果想要知道各個市的人數&#xff0c;只…

小楊的 X 字矩陣(舉一反三)-洛谷B3865 [GESP202309 二級]

題目描述 小楊想要構造一個 X 字矩陣&#xff08; 為奇數&#xff09;&#xff0c;這個矩陣的兩條對角線都是半角加號 &#xff0c;其余都是半角減號 - 。例如&#xff0c;一個 55 的 X 字矩陣如下&#xff1a; --- --- ---- --- --- 請你幫小楊根據給定的 打印出對應的“X …

數據組合與合并:Pandas 數據整合全指南 +缺失值處理

數據組合與合并&#xff1a;Pandas 數據整合全指南在進行數據分析之前&#xff0c;數據清洗與整合是關鍵步驟。 遵循“整潔數據”&#xff08;Tidy Data&#xff09;原則&#xff1a; 每個觀測值占一行每個變量占一列每種觀測單元構成一張獨立的表格 整理好數據后&#xff0c;常…

c#聯合halcon的基礎教程(案例:亮度計算、角度計算和缺陷檢測)(含halcon代碼)

目錄 1.環境配置 2.案例一&#xff1a;亮度計算 halcon代碼&#xff1a; 主界面代碼&#xff1a; 3.案例二&#xff1a; 角度計算 halcon代碼&#xff1a; 主界面代碼&#xff1a; 4.案例三&#xff1a;缺陷檢測 halcon代碼&#xff1a; 主界面代碼&#xff1a; 通過…

大數據云原生是什么

"云原生"&#xff08;Cloud Native&#xff09;指的是?利用云計算原生優勢&#xff08;彈性、按需服務、自動化、分布式等&#xff09;來設計、構建、部署和運行大數據應用和工作負載的方法論與技術體系?。它不是簡單地“把大數據平臺搬到云上”&#xff0c;而是從…

Pytest項目_day16(yaml和parametrize結合)

查詢手機號歸屬地 我們首先可以在YAML文件中定義測試數據 方式一&#xff0c;使用- 注意&#xff1a;當我們需要一次傳入兩個參數時&#xff0c;需要定義兩層迭代&#xff0c;即兩層列表不夠直觀&#xff0c;容易寫錯 輸出的結果為&#xff1a; 然后我們可以將測試數據傳入test…

【Nginx指南】從核心原理到生產實踐

目錄Nginx指南&#xff1a;從核心原理到生產實踐引言&#xff1a;Nginx在現代架構中的核心地位一、Nginx核心能力與應用場景1.1 多場景適配的全能型中間件1.2 技術優勢&#xff1a;Nginx成為行業標準的關鍵二、Nginx安裝部署&#xff1a;源碼編譯與包管理方案2.1 源碼編譯&…

物體檢測

目錄 1 目標定位 2 地標檢測 3 目標檢測 4 在卷積網絡上實現滑動窗口 5 邊界框預測 6 交并比 7 非極大值抑制 8 錨框 9 YOLO算法 10 用u-net進行語義分割 11 轉置卷積 12 u-net 結構靈感 1 目標定位 你已經對圖片分類有所了解。例如通過這張圖片可以識…