処理の流れ
経路は 2 つありますが、どちらも同じ BDF の Part を作り、同じレンダラで描画します。
flowchart TB
SRC["PDF・Excel・CSV・Parquet・PowerPoint・Word・Visio・draw.io・DXF・Jw_cad・SXF・CGM・HP-GL/2・Gerber・KiCad・TIFF<br/>Illustrator・Photoshop・HTML・Markdown・EPUB・MML・MIDI・MusicXML・フォント・画像・音声"]
subgraph SERVER["Go サーバープロセス"]
direction TB
SCONV["converter/pdf<br/>converter/xlsx<br/>converter/pptx<br/>converter/docx …"]
BUNDLE["bdf バンドル<br/>(パック済み)<br/>manifest JSON<br/>描画命令<br/>画像・フォント"]
PREVIEW["imagebdf・thumbnail・SearchText<br/>サムネイル画像<br/>検索用のテキスト"]
SCONV --> BUNDLE
BUNDLE --> PREVIEW
end
subgraph BROWSER["ブラウザ"]
direction TB
subgraph CWORKER["変換 Worker(wasm)"]
WCONV["converter/pdf<br/>converter/xlsx<br/>converter/pptx<br/>converter/docx …"]
end
PARTS["bdf 文書<br/>(メモリ上)<br/>manifest JSON<br/>描画命令<br/>画像・フォント"]
subgraph RWORKER["レンダラ Worker"]
LOADER["ローダ<br/>fetch・Range<br/>DecompressionStream"]
STORE["Part キャッシュ"]
RENDER["レンダラ<br/>OffscreenCanvas<br/>FontFace・Path2D"]
TEXT["テキスト抽出・検索"]
LOADER --> STORE
STORE --> RENDER
STORE --> TEXT
end
UI["ビューア UI<br/>(メインスレッド)<br/>canvas・テキスト選択層"]
WCONV --> PARTS
end
SRC -- "① サーバーで変換" --> SCONV
SRC -- "② ブラウザ内で変換" --> WCONV
BUNDLE -- "1 ファイル形式 / 分割形式<br/>HTTP・CDN" --> LOADER
PARTS -- "postMessage" --> LOADER
RENDER -- "ImageBitmap" --> UI
TEXT -- "テキスト run・ヒット矩形" --> UI
① サーバーで変換
Go のサーバープロセス内で converter/pdf、converter/pptx、converter/xlsx などのパッケージが元ファイルを変換し、manifest・描画命令・画像・フォントをパックした BDF バンドルにします。配信の形は 2 つです。1 ファイル形式(先頭からのストリーミング読み、または Range による Part 単位の取得)か、オブジェクトストレージや CDN にそのまま置ける分割形式です。ブラウザでは、Worker 内のレンダラが必要な Part だけを読み込んで OffscreenCanvas に描画します。メインスレッドがすることは、受け取ったビットマップと透明なテキスト層を配置するだけです。
バンドルと一緒に、文書の一覧や検索エンジンが必要とするものも作れます。ただし、作るのは文書(パスワード付きの入力ならパスワードも)を持っている間だけです。Go のラスタライザ(imagebdf、thumbnail)で描いたサムネイル画像と、文書のメタデータ・ページごとのテキストの JSON(Document.SearchText)です。実際に動くサーバーの例は構成のサンプルを参照してください。
② ブラウザ内で変換
同じ変換パッケージを wasm にしたもの(cmd/bdfwasm)が Worker で動き、ユーザーが開いたファイルをメモリ上の BDF 文書に変換して、そのままレンダラに渡します。変換から描画までがブラウザ内で完結し、ファイルは外に出ません。デモサイトはこの経路で動いています。Office 系の変換器は、サイトと一緒に公開したフリーフォントでテキストをレイアウトします(文書が使うものだけを取得します)。
PDF はページ単位で変換します(converter.OpenStream)。ビューアはまずすべてのページの大きさを受け取ってから、表示中のページを優先して変換できたページの中身を順に受け取ります。最後に、完成した文書と差し替えます。ビューアと Worker の組み立て方はブラウザ側を、Go・TypeScript の API は BDF コマンドや API 一覧を参照してください。