ホームページ >バックエンド開発 >Golang >無料の Excel から PDF へのコンバーターを見つけるのに苦労: 私の旅と解決策

無料の Excel から PDF へのコンバーターを見つけるのに苦労: 私の旅と解決策

DDD
DDDオリジナル
2025-01-12 16:05:44306ブラウズ

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

多くのプロジェクトでは、レポートの生成、データの共有、ドキュメントの作成など、Excel ファイルを PDF 形式に変換する必要があります。多くの開発者と同様、私も当初、これは簡単に自動化できるタスクだと考えていました。ただし、無料で信頼性の高いソリューションを見つける旅には、制限、互換性の問題、高価な商用ツールなどの課題が伴います。

最終的に、私はこれらの困難を克服し、独自の Excel to PDF コンバータ を構築し、同じジレンマに直面する可能性のある他の開発者がオープンソース ツールとして利用できるようにしました。


悔しい経験

ビジネスツール

最初の検索結果は、Aspose.Cells、Syncfusion などの有料ソリューションを示していました。これらは強力ですが、ライセンス料が高いため、小規模または個人のプロジェクトには法外な費用がかかります。

オンラインサービス

無料のオンラインコンバーターは良い選択のように思えますが、自動化には適していません。これらのツールには、プライバシーの問題 (ファイルがサードパーティのサーバーにアップロードされるため)、ファイル サイズの制限があり、プログラミング API が提供されていないことがよくあります。

オープンソース ライブラリ

オープンソース ライブラリも調査しましたが、ほとんどのライブラリには Excel ファイルを PDF に変換する機能がありませんでした。この機能を備えたライブラリであっても、多くの場合、信頼性が低いか、最新の Microsoft Office 形式をサポートしていません。


ヘッドレス モードの LibreOffice

数週間検索した結果、ヘッドレス モードで LibreOffice を使用する方法を見つけました。 LibreOffice は、Excel などの複数のファイル形式を PDF に変換できる、無料のオープンソース オフィス スイートです。ヘッドレス モードで実行する場合はコマンド ライン経由で動作するため、自動化に最適です。


私のソリューションの仕組み

開発者が使いやすくするために、REST API として機能する軽量の Go ベースの HTTP サーバー を構築しました。このサーバーは LibreOffice の機能をカプセル化し、あらゆるプログラミング言語が HTTP リクエスト経由で LibreOffice と対話できるようにします。

主な機能

  1. 複数のファイル形式をサポート: .xlsx、.xls、.csv、.docx、.pptx およびその他の形式をサポートします。
  2. 自動クリーンアップ: ディスク領域を節約するために、一時ファイルは 1 時間後に自動的に削除されます。
  3. カスタム フォント: カスタム フォントは、GitHub リポジトリのクローンを作成するか、Docker ボリュームを使用してインストールできます。
  4. 言語間の統合: HTTP をサポートする任意のプログラミング言語で動作します。

一時ディレクトリ方式

システムの一時ディレクトリに依存する代わりに、カスタム ./tmp ディレクトリを使用することにしました。システムの一時ディレクトリには予期しないアクセス許可が設定されている場合があるため、これにより一貫した動作が保証されます。


実装の詳細

ワークフロー

  1. ファイル アップロード: クライアントは /convert エンドポイントを使用して、POST リクエストを通じて Excel ファイルをアップロードします。
  2. 一時ストレージ: サーバーは、タイムスタンプに基づいたファイル名でファイルを ./tmp ディレクトリに保存します。
  3. Convert: ヘッドレス モードで LibreOffice を呼び出してファイルを PDF に変換し、結果を同じディレクトリに保存します。
  4. ファイルのクリーニング: バックグラウンドのゴルーチンは、1 時間より古いファイルを削除します。
  5. Response: 変換された 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#

<code class="language-csharp">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);</code>

Node.js

<code class="language-javascript">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);</code>

Python

<code class="language-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)</code>

行きます

<code class="language-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)
}</code>

課題とトレードオフ

画像サイズ

LibreOffice の依存関係により、Docker イメージのサイズは 2.67 GB です。 Alpine などの小さなイメージをテストしましたが、それらには最新の Microsoft Office 形式と互換性のない古いバージョンの LibreOffice が含まれていました。 Debian は最新の LibreOffice を提供しますが、生成されるイメージは大きくなります (約 3 GB)。

価値がある理由

画像サイズが大きいことは、商用ソリューションのコストと比較して許容できるトレードオフです。セットアップが完了すると、追加のライセンス料金を支払うことなく、イメージを複数のプロジェクトで再利用できます。


結論

無料の Excel から PDF へのコンバーターを見つけるのに苦労した私は、ヘッドレス モードで LibreOffice を使用して独自のソリューションを構築することにしました。完璧ではありませんが、無料で信頼性が高く、柔軟性があります。もしあなたが同じ課題に直面しているなら、このプロジェクトがあなたの時間と労力を節約することを願っています。

GitHub でプロジェクトをチェックアウトするか、Docker Hub から Docker イメージをプルしてください。それがどのように機能するか、または改善のための提案がある場合はお知らせください。

以上が無料の Excel から PDF へのコンバーターを見つけるのに苦労: 私の旅と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。