寻找免费的 Excel 到 PDF 转换器的斗争:我的旅程和解决方案
许多项目都需要将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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Go语言在构建高效且可扩展的系统中表现出色,其优势包括:1.高性能:编译成机器码,运行速度快;2.并发编程:通过goroutines和channels简化多任务处理;3.简洁性:语法简洁,降低学习和维护成本;4.跨平台:支持跨平台编译,方便部署。

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

Golang和C 在性能竞赛中的表现各有优势:1)Golang适合高并发和快速开发,2)C 提供更高性能和细粒度控制。选择应基于项目需求和团队技术栈。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。

C 更适合需要直接控制硬件资源和高性能优化的场景,而Golang更适合需要快速开发和高并发处理的场景。1.C 的优势在于其接近硬件的特性和高度的优化能力,适合游戏开发等高性能需求。2.Golang的优势在于其简洁的语法和天然的并发支持,适合高并发服务开发。

GoimpactsdevelopmentPositationalityThroughSpeed,效率和模拟性。1)速度:gocompilesquicklyandrunseff,ifealforlargeprojects.2)效率:效率:ITScomprehenSevestAndArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增强开发的简单性:3)SimpleflovelmentIcties:3)简单性。

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。
