許多專案都需要將Excel檔案轉換為PDF格式,無論是產生報表、共用資料或建立文件。起初,我像許多開發者一樣,認為這將是一個易於自動化的任務。然而,尋找免費可靠的解決方案的歷程卻充滿挑戰:各種限制、相容性問題以及昂貴的商業工具。
最終,我克服了這些困難,建立了自己的Excel轉PDF轉換器,並將其作為開源工具提供給其他可能面臨同樣困境的開發者。
令人沮喪的經驗
商業工具
最初的搜尋結果指向了Aspose.Cells、Syncfusion等付費解決方案。雖然它們功能強大,但許可證費用高昂,對於小型或個人專案來說成本過高。
線上服務
免費的線上轉換器似乎是一個不錯的選擇,但它們不適合自動化。這些工具通常存在隱私問題(因為檔案上傳到第三方伺服器)、檔案大小限制,且不提供程式設計API。
開源函式庫
我還探索了開源函式庫,但大多數函式庫缺乏將Excel檔案轉換為PDF的功能。即使是那些具備此功能的函式庫,也往往不可靠或不支援現代Microsoft Office格式。
無頭模式的LibreOffice
經過幾週的搜索,我偶然發現了使用無頭模式下的LibreOffice 的方法。 LibreOffice是一個免費的開源辦公室套件,可以將多種文件格式(包括Excel)轉換為PDF。在無頭模式下運行時,它會透過命令列操作,非常適合自動化。
我的解決方案的工作原理
為了方便開發者使用,我建立了一個輕量級的基於Go的HTTP伺服器,充當REST API。此伺服器封裝了LibreOffice的功能,並允許任何程式語言透過HTTP請求與之互動。
主要功能
- 支援多種檔案格式: 支援.xlsx、.xls、.csv、.docx、.pptx等多種格式。
- 自動清理: 臨時檔案在一小時後自動刪除,以節省磁碟空間。
- 自訂字型: 可以透過複製GitHub倉庫或使用Docker磁碟區來安裝自訂字型。
- 跨語言整合: 可與任何支援HTTP的程式語言一起使用。
臨時目錄方法
我沒有依賴系統的暫存目錄,而是選擇使用自訂的./tmp目錄。這確保了行為的一致性,因為系統暫存目錄有時權限不可預測。
實作細節
工作流程
-
檔案上傳: 用戶端透過POST要求,使用
/convert
端點上傳Excel檔案。 - 暫存: 伺服器將檔案儲存到./tmp目錄中,檔案名稱基於時間戳記。
- 轉換: 在無頭模式下呼叫LibreOffice將檔案轉換為PDF,並將結果儲存到同一目錄中。
- 檔案清理: 後台goroutine刪除超過一小時的檔案。
- 回應: 將轉換後的PDF作為HTTP回應傳回。
入門指南
GitHub倉庫
您可以在https://www.php.cn/link/5b1add8961a1cfa07e60838ffd0f83e7找到原始碼。
Docker映像
專案也提供Docker映像:wteja/pdf-converter。
運行Docker容器
<code>docker pull wteja/pdf-converter docker run -p 5000:5000 wteja/pdf-converter</code>
與其他語言整合的範例
由於服務透過HTTP公開,您可以使用任何程式語言與之互動。
C#
var client = new HttpClient(); var fileContent = new ByteArrayContent(File.ReadAllBytes("example.xlsx")); var formData = new MultipartFormDataContent { { fileContent, "file", "example.xlsx" } }; var response = await client.PostAsync("http://localhost:5000/convert", formData); var pdfBytes = await response.Content.ReadAsByteArrayAsync(); File.WriteAllBytes("output.pdf", pdfBytes);
Node.js
const axios = require("axios"); const FormData = require("form-data"); const fs = require("fs"); const form = new FormData(); form.append("file", fs.createReadStream("example.xlsx")); axios.post("http://localhost:5000/convert", form, { headers: form.getHeaders() }) .then(response => fs.writeFileSync("output.pdf", response.data)) .catch(console.error);
Python
import requests with open("example.xlsx", "rb") as f: response = requests.post("http://localhost:5000/convert", files={"file": f}) with open("output.pdf", "wb") as f: f.write(response.content)
Go
package main import ( "bytes" "io" "mime/multipart" "net/http" "os" ) func main() { file, _ := os.Open("example.xlsx") defer file.Close() body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, _ := writer.CreateFormFile("file", "example.xlsx") io.Copy(part, file) writer.Close() req, _ := http.NewRequest("POST", "http://localhost:5000/convert", body) req.Header.Set("Content-Type", writer.FormDataContentType()) resp, _ := http.DefaultClient.Do(req) defer resp.Body.Close() out, _ := os.Create("output.pdf") defer out.Close() io.Copy(out, resp.Body) }
挑戰與權衡
鏡像大小
由於LibreOffice的依賴項,Docker映像大小為2.67 GB。雖然我測試了Alpine等更小的鏡像,但它們包含的是舊版本的LibreOffice,與現代Microsoft Office格式不相容。 Debian雖然提供了最新的LibreOffice,但生成的鏡像更大(約3 GB)。
為什麼值得
與商業解決方案的成本相比,較大的鏡像大小是可以接受的權衡。設定完成後,該鏡像可以在多個項目中重複使用,而無需支付額外的許可證費用。
結論
尋找免費的Excel轉PDF轉換器的挫折感促使我使用無頭模式下的LibreOffice建立了自己的解決方案。雖然它並非完美無缺,但它是免費的、可靠的且靈活的。如果您面臨同樣的挑戰,我希望這個專案能為您節省時間和精力。
請在GitHub上查看該項目,或從Docker Hub拉取Docker映像。請告訴我它對您的效果如何,或者您是否有改進建議。
以上是尋找免費的 Excel 到 PDF 轉換器的鬥爭:我的旅程和解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

whentestinggocodewithinitfunctions,useexplicitseTupfunctionsorseParateTestFileSteSteTepteTementDippedDependendendencyOnInItfunctionsIdeFunctionSideFunctionsEffect.1)useexplicitsetupfunctionStocontrolglobalvaribalization.2)createSepEpontrolglobalvarialization

go'serrorhandlingurturnserrorsasvalues,與Javaandpythonwhichuseexceptions.1)go'smethodensursexplitirorhanderling,propertingrobustcodebutincreasingverbosity.2)

AnefactiveInterfaceingoisminimal,clear and promotesloosecoupling.1)minimizeTheInterfaceForflexibility andeaseofimplementation.2)useInterInterfaceForabStractionToswaPimplementations withoutchangingCallingCode.3)

集中式錯誤處理在Go語言中可以提升代碼的可讀性和可維護性。其實現方式和優勢包括:1.將錯誤處理邏輯從業務邏輯中分離,簡化代碼。 2.通過集中處理錯誤,確保錯誤處理的一致性。 3.使用defer和recover來捕獲和處理panic,增強程序健壯性。

Ingo,替代詞InivestoIniTfunctionsIncludeCustomInitializationfunctionsandsingletons.1)customInitializationfunctions hownerexpliticpliticpliticconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconconcontirization curssetupssetupssetups.2)單次固定無元素限制ininconconcurrent

Gohandlesinterfacesandtypeassertionseffectively,enhancingcodeflexibilityandrobustness.1)Typeassertionsallowruntimetypechecking,asseenwiththeShapeinterfaceandCircletype.2)Typeswitcheshandlemultipletypesefficiently,usefulforvariousshapesimplementingthe

Go語言的錯誤處理通過errors.Is和errors.As函數變得更加靈活和可讀。 1.errors.Is用於檢查錯誤是否與指定錯誤相同,適用於錯誤鏈的處理。 2.errors.As不僅能檢查錯誤類型,還能將錯誤轉換為具體類型,方便提取錯誤信息。使用這些函數可以簡化錯誤處理邏輯,但需注意錯誤鏈的正確傳遞和避免過度依賴以防代碼複雜化。

tomakegoapplicationsRunfasterandMorefly,useProflingTools,leverageConCurrency,andManageMoryfectily.1)usepprofforcpuorforcpuandmemoryproflingtoidentifybottlenecks.2)upitizegorizegoroutizegoroutinesandchannelstoparalletaparelalyizetasksandimproverperformance.3)


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),