搜尋
首頁後端開發Golang尋找免費的 Excel 到 PDF 轉換器的鬥爭:我的旅程和解決方案

The Struggle of Finding a Free Excel to PDF Converter: My Journey and Solution

許多專案都需要將Excel檔案轉換為PDF格式,無論是產生報表、共用資料或建立文件。起初,我像許多開發者一樣,認為這將是一個易於自動化的任務。然而,尋找免費可靠的解決方案的歷程卻充滿挑戰:各種限制、相容性問題以及昂貴的商業工具。

最終,我克服了這些困難,建立了自己的Excel轉PDF轉換器,並將其作為開源工具提供給其他可能面臨同樣困境的開發者。


令人沮喪的經驗

商業工具

最初的搜尋結果指向了Aspose.Cells、Syncfusion等付費解決方案。雖然它們功能強大,但許可證費用高昂,對於小型或個人專案來說成本過高。

線上服務

免費的線上轉換器似乎是一個不錯的選擇,但它們不適合自動化。這些工具通常存在隱私問題(因為檔案上傳到第三方伺服器)、檔案大小限制,且不提供程式設計API。

開源函式庫

我還探索了開源函式庫,但大多數函式庫缺乏將Excel檔案轉換為PDF的功能。即使是那些具備此功能的函式庫,也往往不可靠或不支援現代Microsoft Office格式


無頭模式的LibreOffice

經過幾週的搜索,我偶然發現了使用無頭模式下的LibreOffice 的方法。 LibreOffice是一個免費的開源辦公室套件,可以將多種文件格式(包括Excel)轉換為PDF。在無頭模式下運行時,它會透過命令列操作,非常適合自動化。


我的解決方案的工作原理

為了方便開發者使用,我建立了一個輕量級的基於Go的HTTP伺服器,充當REST API。此伺服器封裝了LibreOffice的功能,並允許任何程式語言透過HTTP請求與之互動。

主要功能

  1. 支援多種檔案格式: 支援.xlsx、.xls、.csv、.docx、.pptx等多種格式。
  2. 自動清理: 臨時檔案在一小時後自動刪除,以節省磁碟空間。
  3. 自訂字型: 可以透過複製GitHub倉庫或使用Docker磁碟區來安裝自訂字型。
  4. 跨語言整合: 可與任何支援HTTP的程式語言一起使用。

臨時目錄方法

我沒有依賴系統的暫存目錄,而是選擇使用自訂的./tmp目錄。這確保了行為的一致性,因為系統暫存目錄有時權限不可預測。


實作細節

工作流程

  1. 檔案上傳: 用戶端透過POST要求,使用/convert端點上傳Excel檔案。
  2. 暫存: 伺服器將檔案儲存到./tmp目錄中,檔案名稱基於時間戳記。
  3. 轉換: 在無頭模式下呼叫LibreOffice將檔案轉換為PDF,並將結果儲存到同一目錄中。
  4. 檔案清理: 後台goroutine刪除超過一小時的檔案。
  5. 回應: 將轉換後的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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
測試代碼依賴於INET功能的代碼測試代碼依賴於INET功能的代碼May 03, 2025 am 12:20 AM

whentestinggocodewithinitfunctions,useexplicitseTupfunctionsorseParateTestFileSteSteTepteTementDippedDependendendencyOnInItfunctionsIdeFunctionSideFunctionsEffect.1)useexplicitsetupfunctionStocontrolglobalvaribalization.2)createSepEpontrolglobalvarialization

將GO的錯誤處理方法與其他語言進行比較將GO的錯誤處理方法與其他語言進行比較May 03, 2025 am 12:20 AM

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

設計有效界面的最佳實踐設計有效界面的最佳實踐May 03, 2025 am 12:18 AM

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

集中式錯誤處理策略集中式錯誤處理策略May 03, 2025 am 12:17 AM

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

init in Init函數的替代方案,用於go中的包裝初始化init in Init函數的替代方案,用於go中的包裝初始化May 03, 2025 am 12:17 AM

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

與GO接口鍵入斷言和類型開關與GO接口鍵入斷言和類型開關May 02, 2025 am 12:20 AM

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

使用errors.is和錯誤。使用errors.is和錯誤。May 02, 2025 am 12:11 AM

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

在GO中進行性能調整:優化您的應用程序在GO中進行性能調整:優化您的應用程序May 02, 2025 am 12:06 AM

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

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

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

mPDF

mPDF

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