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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 目标定位 你已经对图片分类有所了解。例如通过这张图片可以识…