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://www.pswp.cn/diannao/79203.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79203.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79203.shtml

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

相關文章

MoogDB數據庫日常維護技巧與常見問題解析

在當今的數據驅動世界中&#xff0c;數據庫作為信息存儲與管理的核心組件&#xff0c;扮演著舉足輕重的角色。MoogDB作為一款高性能、易擴展的數據庫解決方案&#xff0c;越來越受到開發者和企業的青睞。為了確保MoogDB的穩定性與高性能&#xff0c;定期的日常維護及對常見問題…

JAVA多線程的幾種實現方式

?1. 繼承 Thread 類? ?原理?&#xff1a;通過繼承 Thread 類并重寫 run() 方法定義線程任務&#xff0c;調用 start() 啟動線程?。?代碼示例?&#xff1a; public class MyThread extends Thread {Overridepublic void run() {System.out.println("線程 " g…

爬蟲(基本知識介紹,urllib庫的說明)

爬蟲 爬蟲基礎&#xff08;一些基本原理的梳理&#xff09; scheme://[username:password]hostname[:port][/path][;parameters][?query][#fragment] 注&#xff1a; parameters 和 query 混用&#xff0c;并且現在 query 用的多 ?query 查詢 &#xff0c;用來查詢某類資源…

探秘串口服務器廠家:背后的故事與應用

在科技飛速發展的今天&#xff0c;串口服務器作為連接串口設備與網絡的橋梁&#xff0c;在工業自動化、智能交通、智能家居等眾多領域發揮著關鍵作用。你是否好奇&#xff0c;那些生產串口服務器的廠家究竟有著怎樣的故事&#xff1f;它們的產品背后又蘊含著怎樣的原理呢&#…

工廠能耗系統智能化解決方案 —— 安科瑞企業能源管控平臺

安科瑞顧強 政策背景與“雙碳”戰略驅動 2025年《政府工作報告》明確提出“單位國內生產總值能耗降低3%左右”的目標&#xff0c;要求通過產業結構升級&#xff08;如高耗能行業技術革新或轉型&#xff09;、能源結構優化&#xff08;提高非化石能源占比&#xff09;及數字化…

BI面向模型開發和面向報表開發,有什么區別?

在數字化時代&#xff0c;商業智能&#xff08;BI&#xff09;已成為企業決策不可或缺的工具。BI項目實施時&#xff0c;通常有兩種開發模式&#xff1a;面向模型開發和面向報表開發。雖然兩者都旨在通過數據驅動決策&#xff0c;但在開發邏輯、目標價值和技術路徑上存在顯著差…

OpenHarmony人才認證證書

OpenHarmony人才認證體系目前支持初級工程師認證&#xff0c;要求了解OpenHarmony開源項目、生態進展及系統移植等基礎知識&#xff0c;熟練掌握OpenHarmony的ArkUI、分布式軟總線、分布式硬件、分布式數據管理等基礎能力使用&#xff0c;具備基礎的開發能力。 考試流程可參考O…

映射網絡路路徑和ftp路徑原理是什么,如何使用,有什么區別

文章目錄 一、原理1. 映射網絡路徑2. FTP路徑 二、使用方法1. 映射網絡路徑2. FTP路徑 三、主要區別1. 協議與功能2. 安全性與權限3. 適用場景 四、如何選擇&#xff1f;五、注意事項 映射網絡路徑&#xff08;如SMB/CIFS或NFS&#xff09;和FTP路徑&#xff08;FTP/FTPS/SFTP&…

Windows 圖形顯示驅動開發-WDDM 1.2功能—Windows 8 中的 DirectX 功能改進(一)

Windows 8包括 Microsoft DirectX 功能改進&#xff0c;使開發人員、最終用戶和系統制造商受益。 功能改進在以下幾個方面&#xff1a; 像素格式 (5551、565、4444) &#xff1a;在低功耗硬件配置下&#xff0c;DirectX 應用程序的性能更高。雙精度著色器功能&#xff1a;高級…

GitHub 趨勢日報 (2025年04月15日)

本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星總星數語言1yeongpin/cursor-free-vip[Support 0.48.x]&#xff08;Reset Cursor AI MachineID & Auto Sign Up / In & Bypass Higher…

2025年推薦使用的開源大語言模型top20:核心特性、選擇指標和開源優勢

李升偉 編譯 隨著人工智能技術的持續發展&#xff0c;開源大型語言模型&#xff08;LLMs&#xff09;正變得愈發強大&#xff0c;使最先進的AI能力得以普及。到2025年&#xff0c;開源生態系統中涌現出多個關鍵模型&#xff0c;它們在各類應用場景中展現出獨特優勢。 大型語言…

回收鍍錫廢水的必要性(筆記)

鍍錫廢水若直接排放&#xff0c;將對環境、經濟和社會造成多重危害&#xff0c;其回收處理具有迫切性和深遠意義。以下從環境、資源、法規、技術與實踐、可持續發展五大維度展開分析&#xff1a; 一、環境危害的緊迫性&#xff1a;重金屬與污染物的致命威脅 成分復雜&#xf…

14.2 - VDMA彩條顯示實驗之動態時鐘

文章目錄 1 實驗任務2 系統框圖3 硬件設計4 軟件設計4.1 dynclk_api.h文件4.2 math_compat.h文件4.3 dynclk_api.c文件4.4 main.c文件 1 實驗任務 參見14.1。 2 系統框圖 參見14.1。 3 硬件設計 注意事項&#xff1a;基于14.1做如下改動 使能Clocking Wizard IP核的Dynam…

在邊緣端進行tensorflow模型的部署(小白初探)

1.配置tensorflow的環境 &#xff08;我是安裝GPU版本的&#xff09; 建議參考這個博主的文章&#xff0c;確實非常快速&#xff01; 十分鐘安裝Tensorflow-gpu2.6.0本機CUDA12 以及numpymatplotlib各包版本協調問題_tensorflow cuda12-CSDN博客 2.學習自制數據集 &#xf…

windows下使用nginx + waitress 部署django

架構介紹 linux一般采用nginx uwsgi部署django&#xff0c;在Windows下&#xff0c;可以取代uwsgi的選項包括Waitressa、Daphnea、Hypercoma和Gunicorna(通過WSLa 運行)。windows服務器一般采用nginx waitress 部署django&#xff0c;,他們的關系如下 django是WEB應用…

利用pnpm patch命令實現依賴包熱更新:精準打補丁指南

需求場景 在Element Plus的el-table組件二次開發中&#xff0c;需新增列顯示/隱藏控件功能。直接修改node_modules源碼存在兩大痛點&#xff1a; 團隊協作時修改無法同步 依賴更新導致自定義代碼丟失 解決方案選型 通過patch-package工具實現&#xff1a; &#x1f4e6; 非…

ThinkPad T520 無法讀到硬盤 問題排查思路

錯誤提示&#xff1a;2100:detection error on hdd0(Main hdd) 1、判斷錯誤提示含義 表示電腦在啟動時無法檢測到主硬盤&#xff08;HDD0&#xff09;。 2、 常見原因&#xff1a; 硬盤松動或接觸不良 → 特別是筆記本在移動或震動后&#xff0c;硬盤排線松了。 硬盤損壞 →…

Doris部署生產集群最低要求的部署方案

Doris生產集群最低部署方案&#xff08;2025年4月版&#xff09; 一、節點規劃與數量 1. FE節點&#xff08;Frontend&#xff09; 數量&#xff1a;至少 3個節點&#xff08;1個Follower 2個 Observer&#xff09;&#xff0c;確保高可用&#xff08;HA&#xff09;。角色分…

游戲引擎學習第227天

今天的計劃 今天的工作重點是進行吸引模式&#xff08;attract mode&#xff09;的開發&#xff0c;主要是處理游戲的進出和其他一些小的細節問題&#xff0c;這些是之前想要整理和清理的部分。我做了一些工作&#xff0c;將游戲代碼中的不同部分分離到邏輯上獨立的區域&#…

spark-SQL數據加載和保存

數據加載與保存 通用方式&#xff1a; 通過 spark.read.load 和 df.write.save 實現數據加載與保存。可利用 format 指定數據格式&#xff0c;如 csv 、 jdbc 等&#xff1b; option 用于設置特定參數&#xff0c;像 jdbc 格式下的數據庫連接信息&#xff1b; load 和 save 則…