多くのプロジェクトでは、レポートの生成、データの共有、ドキュメントの作成など、Excel ファイルを PDF 形式に変換する必要があります。多くの開発者と同様、私も当初、これは簡単に自動化できるタスクだと考えていました。ただし、無料で信頼性の高いソリューションを見つける旅には、制限、互換性の問題、高価な商用ツールなどの課題が伴います。
最終的に、私はこれらの困難を克服し、独自の Excel to PDF コンバータ を構築し、同じジレンマに直面する可能性のある他の開発者がオープンソース ツールとして利用できるようにしました。
最初の検索結果は、Aspose.Cells、Syncfusion などの有料ソリューションを示していました。これらは強力ですが、ライセンス料が高いため、小規模または個人のプロジェクトには法外な費用がかかります。
無料のオンラインコンバーターは良い選択のように思えますが、自動化には適していません。これらのツールには、プライバシーの問題 (ファイルがサードパーティのサーバーにアップロードされるため)、ファイル サイズの制限があり、プログラミング API が提供されていないことがよくあります。
オープンソース ライブラリも調査しましたが、ほとんどのライブラリには Excel ファイルを PDF に変換する機能がありませんでした。この機能を備えたライブラリであっても、多くの場合、信頼性が低いか、最新の Microsoft Office 形式をサポートしていません。
数週間検索した結果、ヘッドレス モードで LibreOffice を使用する方法を見つけました。 LibreOffice は、Excel などの複数のファイル形式を PDF に変換できる、無料のオープンソース オフィス スイートです。ヘッドレス モードで実行する場合はコマンド ライン経由で動作するため、自動化に最適です。
開発者が使いやすくするために、REST API として機能する軽量の Go ベースの HTTP サーバー を構築しました。このサーバーは LibreOffice の機能をカプセル化し、あらゆるプログラミング言語が HTTP リクエスト経由で LibreOffice と対話できるようにします。
システムの一時ディレクトリに依存する代わりに、カスタム ./tmp ディレクトリを使用することにしました。システムの一時ディレクトリには予期しないアクセス許可が設定されている場合があるため、これにより一貫した動作が保証されます。
/convert
エンドポイントを使用して、POST リクエストを通じて Excel ファイルをアップロードします。 ソース コードは https://www.php.cn/link/5b1add8961a1cfa07e60838ffd0f83e7 で見つけることができます。
このプロジェクトは、Docker イメージ: wteja/pdf-converter も提供します。
<code>docker pull wteja/pdf-converter docker run -p 5000:5000 wteja/pdf-converter</code>
サービスは HTTP 経由で公開されるため、任意のプログラミング言語を使用してサービスを操作できます。
<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>
<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>
<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 サイトの他の関連記事を参照してください。