PDFをUnityでLoadする話

uPDFLoaderのご紹介

Negipoyoc

はじめに

今後のために勉強会でのバ美肉登壇システムを作る必要がでてきたので作りました。

何を作ったか

以下の物を作りました。

GhostScriptのプロセスを別で起動しPDFを連番JPG化→キャッシュディレクトリに保存します。
それらの処理が完了し次第、画像をロードしてUguiのRawImageにTextureとしてロードしています。

配布

https://github.com/negipoyoc/uPDFLoader

GhostScriptのインストールなどやることがいくつかあるのでREADME.mdをよく読んでください。そんなに長くないので。

仕組み

生成側

(PDFGenerator.PDFGenerateObservableメソッド)

UnityからPDFファイルを指定し、それをインストールしたGhostScriptを外部プロセスでコマンドラインで起動し連番JPG化します。

その処理の終了を「コマンドラインでの処理終了」をフラグとして検知して、OnNextによって画像が生成されたディレクトリのパス文字列を呼び出し元に返します。

それら一連の処理を別スレッドで行うことによって、同期的に画像生成を待たなくて良くなっています。(変にフリーズすることはない(Profilerで確認した))

受け取り側

(PDFLoader.Loadメソッド)

↑のメソッドから帰ってきた画像が生成されたディレクトリパスの文字列からPDFImageDirInfoというクラスで、ディレクトリ情報を生成します。

主に各連番画像ファイルのパスや、何ページあるかという情報ですね。(拡張によってファイル名とかアスペクト比とか持たせてもいいかも。)

それを利用し、あとはwwwでテクスチャとして各画像を読み込んでRawImageにテクスチャを割り当てています。

今後

実際バ美肉登壇を想定してVive向けにビルドしてみたが、案外快適に動いたので笑った。

とはいえ、ローカルとはいえ画像のロードが少し重いので、本質的なところではないがやはりなんとかしたい。動作に影響を及ぼすほどではないけど一瞬固まるので自分が気になる。(ProfilerのCPU使用の部分を見てもスパイクしてる)

ここらへんは、ネイティブプラグイン側で解決できると思っています。(この前の凹みさんのを参考に…?)
画像データとTextureのポインターを渡して、別スレッドでテクスチャを読み込みと割り当てるやつ。

9月以降の勉強会などはバ美肉登壇していきたいという気持ちがめちゃくちゃにあるので、このシステムを使ってやっていきたいと思います。

このシステムを使ったよなどあると自分が嬉しいので報告などあればお待ちしてます!