目录
令人沮丧的经历
商业工具
在线服务
开源库
无头模式下的LibreOffice
我的解决方案的工作原理
主要功能
临时目录方法
实现细节
工作流程
入门指南
GitHub仓库
Docker镜像
运行Docker容器
与其他语言集成的示例
C#
Node.js
Python
Go
挑战与权衡
镜像大小
为什么值得
结论
首页 后端开发 Golang 寻找免费的 Excel 到 PDF 转换器的斗争:我的旅程和解决方案

寻找免费的 Excel 到 PDF 转换器的斗争:我的旅程和解决方案

Jan 12, 2025 pm 04:05 PM

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

热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汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Golang的目的:建立高效且可扩展的系统 Golang的目的:建立高效且可扩展的系统 Apr 09, 2025 pm 05:17 PM

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

Golang和C:并发与原始速度 Golang和C:并发与原始速度 Apr 21, 2025 am 12:16 AM

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

Golang vs. Python:性能和可伸缩性 Golang vs. Python:性能和可伸缩性 Apr 19, 2025 am 12:18 AM

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

表演竞赛:Golang vs.C 表演竞赛:Golang vs.C Apr 16, 2025 am 12:07 AM

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

Golang vs. Python:主要差异和相似之处 Golang vs. Python:主要差异和相似之处 Apr 17, 2025 am 12:15 AM

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

C和Golang:表演至关重要时 C和Golang:表演至关重要时 Apr 13, 2025 am 12:11 AM

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

Golang的影响:速度,效率和简单性 Golang的影响:速度,效率和简单性 Apr 14, 2025 am 12:11 AM

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

Golang和C:性能的权衡 Golang和C:性能的权衡 Apr 17, 2025 am 12:18 AM

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

See all articles