サーバーに組み込む

Go の converter は、import された形式の変換器だけを登録します。必要なサブパッケージを空 import すれば、サーバーが受け付ける形式を組み合わせられます。生成した BDF はブラウザのビューアに渡せます。Go 1.27 以上が必要です。

必要な形式を選ぶ

例えば PDF、EPUB、Word、CSV/TSV だけを扱うサーバーなら、次の import にします。TSV は converter/csv が扱います。

import (
    "github.com/shibukawa/bdf/converter"
    _ "github.com/shibukawa/bdf/converter/pdf"
    _ "github.com/shibukawa/bdf/converter/epub"
    _ "github.com/shibukawa/bdf/converter/docx"
    _ "github.com/shibukawa/bdf/converter/csv"
)

PowerPoint は converter/pptx、Excel は converter/xlsx、Visio は converter/visio、Parquet は converter/parquet を追加します。全形式を選ぶ場合は個別の空 import の代わりに converter/all を使います。名前は対応形式と converter/ の各ディレクトリを参照してください。

音楽変換が不要なら converter/mml、converter/midi、converter/musicxml を import しません。BDF への変換だけを行うサーバーには描画用の imagebdf や thumbnail の import も不要です。

HTTP で受け取って変換する

次は、リポジトリ内の cmd/my-bdf-server/main.go として保存して動かせる最小例です。POST /convert?name=report.pdf に元ファイルのバイト列を送ると、単一ファイル形式の BDF を返します。name は、内容だけで判定しにくい CSV や Markdown の拡張子にも使われます。

package main

import (
    "bytes"
    "io"
    "log"
    "net/http"
    "path/filepath"

    "github.com/shibukawa/bdf/converter"
    _ "github.com/shibukawa/bdf/converter/csv"
    _ "github.com/shibukawa/bdf/converter/docx"
    _ "github.com/shibukawa/bdf/converter/epub"
    _ "github.com/shibukawa/bdf/converter/pdf"
)

func main() {
    http.HandleFunc("POST /convert", func(w http.ResponseWriter, r *http.Request) {
        input, err := io.ReadAll(http.MaxBytesReader(w, r.Body, 32<<20))
        if err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }
        name := filepath.Base(r.URL.Query().Get("name"))
        result, err := converter.Convert(bytes.NewReader(input), int64(len(input)), "",
            &converter.Options{FileName: name})
        if err != nil {
            http.Error(w, err.Error(), http.StatusUnprocessableEntity)
            return
        }
        var output bytes.Buffer
        if err := result.Doc.WriteSingle(&output); err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        w.Header().Set("Content-Type", "application/octet-stream")
        _, _ = w.Write(output.Bytes())
    })
    log.Fatal(http.ListenAndServe(":8080", nil))
}
go run ./cmd/my-bdf-server
curl --data-binary @report.pdf 'http://localhost:8080/convert?name=report.pdf' -o report.bdf

ここでは説明を短くするため、入力と出力をメモリに置いています。実際のサービスではサイズ上限、認証、変換の同時実行数、キャッシュ先を用途に合わせて決めてください。

BDF を保存して配信する

変換結果を再利用するなら、result.Doc.WriteSingle(file) で .bdf ファイルに保存し、http.FileServer などで GET 配信します。単一ファイルは Range リクエストに対応する配信方法を使うと、ビューアが必要な部分から読みます。CDN やオブジェクトストレージに展開するなら result.Doc.WriteSplit(dir) で分割形式を生成し、フロントエンドで { kind: "split", base: "..." } を指定します。

サーバー上のファイルを直接変換する場合は converter.ConvertFile(path, "", &converter.Options{}) が便利です。HTML の画像や KiCad の別シートなど、元ファイルから参照するファイルも読む形式では、ConvertFile が入力ディレクトリを Options.Dir に設定します。アップロードで複数ファイルを受け取るなら Options.Files に渡します。キャッシュと配信を含む実例は preview-server を参照してください。