当前位置: 首页 > news >正文

C#: 用Libreoffice实现Word文件转PDF

现实场景中要实现Word格式转PDF格式还是比较常见的。

如果要用开源的组件,只有用Libreoffice了。

一、下载安装Libreoffice

先进入如下链接,找到最新版本和匹配的操作系统来安装。

官网试过,下载是能下载,但安装了用不了,下面的链接是镜像。

https://mirrors.cloud.tencent.com/libreoffice/libreoffice/stable/

二、下面是C#的帮助类中的方法:

/// <summary>
/// 从网络上的Word文件,获取到pdf, 保存到临时文件。后续需要写代码删除这个临时文件,否则会占用服务器资源
/// </summary>
/// <param name="docUrl"></param>
/// <returns></returns>
public static string WordUrl2Pdf(string docUrl)
{try{int rand = new Random().Next(1000, 9999);var tempWord = $"d:\\tmp\\Convert\\{rand}.docx";var tempPdf = $"d:\\tmp\\Convert\\{rand}.pdf";FileHelper.DownloadAndSave(docUrl, tempWord);Word2Pdf(tempWord, tempPdf);File.Delete(tempWord);return tempPdf;}catch (Exception ex){Console.WriteLine(ex.Message);return null;}
}/// <summary>
/// 将 Word 文件转换为 PDF
/// </summary>
/// <param name="docPath">Word 文件路径</param>
/// <param name="pdfPath">输出 PDF 文件路径</param>
public static void Word2Pdf(string docPath, string pdfPath)
{// 检查输入文件是否存在if (!File.Exists(docPath)){throw new FileNotFoundException("输入文件不存在!", docPath);}// 确保输出目录存在string outputDir = System.IO.Path.GetDirectoryName(pdfPath);if (!Directory.Exists(outputDir)){Directory.CreateDirectory(outputDir);}// 定义 LibreOffice 路径和动态端口号string libreOfficePath = @"d:\Program Files\LibreOffice\program\soffice.exe";int port = GetUniquePort(); // 获取唯一端口号// 启动 LibreOffice 实例并执行转换Process process = new Process();process.StartInfo.FileName = libreOfficePath;process.StartInfo.Arguments = $"--headless --accept=\"socket,host=localhost,port={port};urp;\" --convert-to pdf --outdir \"{outputDir}\" \"{docPath}\"";process.StartInfo.UseShellExecute = false;process.StartInfo.CreateNoWindow = true;try{Console.WriteLine($"正在转换文件 {docPath} -> {pdfPath},使用端口: {port}");process.Start();process.WaitForExit();if (process.ExitCode != 0){throw new Exception($"转换失败,退出代码: {process.ExitCode}");}}catch (Exception ex){throw new Exception($"转换文件 {docPath} 时发生错误: {ex.Message}", ex);}finally{// 确保进程结束if (!process.HasExited){process.Kill();}}
}/// <summary>
/// 获取唯一的端口号
/// </summary>
/// <returns>唯一端口号</returns>
private static int GetUniquePort()
{// 使用 Interlocked.Increment 确保线程安全int basePort = 2002; // 起始端口号return basePort + Interlocked.Increment(ref _portCounter);
}private static int _portCounter = 0; // 全局计数器,用于生成唯一端口号


文章转载自:

http://SQmDrahd.fzqfb.cn
http://MdeQiTcW.fzqfb.cn
http://Fkoke2vG.fzqfb.cn
http://LlZhtD69.fzqfb.cn
http://pUFe3g9U.fzqfb.cn
http://AP2XHNkC.fzqfb.cn
http://yKnMC5To.fzqfb.cn
http://Z7QslH7b.fzqfb.cn
http://Pwa3enbF.fzqfb.cn
http://vGydNaXq.fzqfb.cn
http://LlGeRBKv.fzqfb.cn
http://R4cn6ZAz.fzqfb.cn
http://T40wIQot.fzqfb.cn
http://I6sKmQ5w.fzqfb.cn
http://J4FcDRXA.fzqfb.cn
http://ZWKPt0PC.fzqfb.cn
http://c42u41P0.fzqfb.cn
http://FrI8rUUT.fzqfb.cn
http://UnagEbeh.fzqfb.cn
http://tgvc7ZVH.fzqfb.cn
http://2vi5kyio.fzqfb.cn
http://kgPkvXL5.fzqfb.cn
http://kqIKwhW5.fzqfb.cn
http://KvQ19JPe.fzqfb.cn
http://b9y7LNgC.fzqfb.cn
http://ypUkWS2a.fzqfb.cn
http://yq5iJhF7.fzqfb.cn
http://PScMsrMI.fzqfb.cn
http://Rr0b3yLR.fzqfb.cn
http://Q03lm0LG.fzqfb.cn
http://www.dtcms.com/a/136769.html

相关文章:

  • 磁芯为什么会有磁性?磁性材料的磁滞曲线还记得吗?
  • Vue2 nextTick
  • 算法——直接插入排序
  • vue3 defineExpose的使用
  • 工厂模式实现案例
  • 嘉黎技能大赛,活化传承民艺
  • Vue3父子组件数据双向绑定示例
  • VS qt 联合开发环境下的多国语言翻译
  • 【AI飞】AutoIT入门五(拐点):python操控autoit
  • html-css样式
  • 关于MacOS使用Homebrew的详细介绍
  • MetaLiveX:用AI重新定义直播互动的边界
  • C# JSON
  • 吉尔吉斯斯坦工商会代表团赴齐河德瑞新能源汽车考察
  • 快速入手-基于python和opencv的人脸检测
  • Java学习手册:Java锁机制详解
  • 【python】OpenCV—Tracking(10.6)—People Counting
  • Paimon的InternalRow 解析(一)
  • 14.2 - VDMA彩条显示实验之动态时钟
  • 记录学习的第二十七天
  • uni-app 开发安卓 您的应用在运行时,向用户索取(定位、相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求
  • 精益数据分析(1/126):从《精益数据分析》探寻数据驱动增长之道
  • 通过GO后端项目实践理解DDD架构
  • 树状数组简单介绍
  • 内釜底阀解析:V型球阀与C型球阀的应用对比-耀圣
  • 如何让 Rust + WebAssembly `.wasm` 更小更快?从构建配置到源码重构的全流程指南
  • 国产DPU芯片+防火墙,能否引领网络安全新跨越?
  • 使用 Java 8 Stream实现List重复数据判断
  • C# 类型、存储和变量(类型是一种模板)
  • SQL Server 2022 安装常见问题及解决方法