今回はRustを使って帳票を作成したいときに、どのようなライブラリがあるかを調べてみました。
以前、こちらの記事の中で少し紹介したように、言語関係なしで商用無償で使える最も高機能な帳票ライブラリは、Javaの「JasperReport」と思っています。
まだ「JasperReport」がリリースされて間もない頃、それこそ10年以上前に使いましたが、その時点でかなりの傑作でした。
xmlで作った帳票レイアウトをJavaのメソッドで読み込ませ、レイアウト上の変数に値を設定すると、PDFなど指定した形式で出力できます。
当時驚いたのが多様な形式で、PDF以外にExcelやWord・PowerPoint・HTML・CSV・RTFなどでも、ほぼ同じソースコードで出力できてしまいます。
(ウィキペディアもご参照ください)
この機能が面白く、簡単にできるので、作ったWEBアプリで(必要もないのに)画面から色んな形式で出力できるようにしてしまったものです。
性能もさほど遅いと感じたこともなく、帳票レイアウトxmlも別途提供される「iReport」というツールで簡単に作れますし、日本語対応もばっちりでしたので、何十万もかかる有料帳票ツールはいらないよね、と思いました。
さて、結論からすると、Rustでそこまで丘の黒船的な帳票ライブラリはまだありません。
(多分他の言語でもないのでは....)
Rustで「JasperReport」級なことができれば、Rust界では大騒ぎになるとこと間違いなし!
恐らく高速性・低メモリも期待できるので、Rust以外の言語からも実行できるようにバイナリを作ってあげると、「JasperReport」にとって代わるかも...
紙印刷しないまでも、書き換えできないPDFとして数年保管する業務とかはあるので、業務アプリの世界では帳票生成ニーズはまだ続くのではないでしょうか。
とりあえず、Rustでもいくつか帳票生成ライブラリはありましたので、調査した結果を掲載します。
---【PDF系】---
・PDF Print
TTFフォントでUnicode対応しており、日本語も大丈夫かもなライブラリです。
ただ、線を引いたり書式を整えたりするのが、全部ソースコードで書かないといけない!
少し体裁を変えたりするのに、いちいちコンパイルしなおさないといけないという....
ハードコードせずに設定ファイルにするにしても、なかなか現実的ではないかも....
メンテナンスは継続しているようです。MITライセンスにつき、商用無償です。
・lopdf
恐らくRustで最初期にPDF生成を試みたライブラリ。
他のライブラリはこのライブラリを参照していたりするという。
ですが、ドキュメントが少なすぎて、実利用にはちょっと....
メンテナンスは継続しているようです。MITライセンスにつき、商用無償です。
まともに動きそうなのは上記くらいです。
他にも「pdf_canvas(rust-pdf)」というのもありますが、やはりドキュメントが少なく、使えるかどうか....
---【Excel系】---
・xlsxwriter
なんとかExcel生成できますよ、という雰囲気です。
これも線を引いたりするのに、コーディングが必要なようです....
2020年3月7日に0.3.0をリリースしたようで、メンテナンスを継続しています。
Apache-2.0ライセンスにつき、商用無償で使えます。
・calamine
こちらはExcelの読み込みしかできません。
ですが、アップロードしたExcelのデータを読み込むことがあるでしょうので、紹介します。
メンテナンスを継続しており、MITライセンスで商用無償で使えます。
---【CSV系】---
・Crate csv
Rust標準のCSV読み込み・書き込みライブラリです。
実はこれを使って試しにCSVの読み書きを実装してみました....が!面倒なことこの上なかったです。
よくあるライブラリとしては、ファイルパス、文字コード、項目区切り文字、項目囲み文字、ヘッダー開始位置、改行コード、メモリ蓄積レコード数(フラッシュレコード数)、エスケープ文字あたりをパラメータとしてメソッドなりを実行すればうまく読み書きしてくれるものと思います。
ですが、特にShift-JISの読み書きのためには、一度Rust用のUTF-8に変換しないといけなくて、この実装だけで何時間もかかってしまうということに。
何か自分でライブラリ作って公開するか、と思ったくらいです。あまりいいのは見つかりませんでした。
調査結果は概ね以上です。
このような状況ですと、たとえRustベースのアプリであったとしても、PDF生成機能だけJavaの「JasperReport」にするのが、今の段階ではベストではないでしょうかね。Rustから普通にjavaコマンドを実行して帳票を生成させるイメージで。
これらの帳票ライブラリを使っても、コードがタイヘンなことになること請け合い.....と思った次第です。
追伸...
私が書いた過去のRust記事もよければどうぞ。
V言語とRust
40歳文系のRust 5 (Websocket調査)
40歳文系のRust 4 (通信方式設計)
40歳文系のRust 3 (CSVファイルの入出力)
40歳文系のRust 2 (データベース操作)
40歳文系のRust (業務アプリ開発基盤としてのRust)
(酒)
シンプル入退室管理
限りなくシンプルなタイムカードシステム
WhitePlug
手のひらサイズのLinuxサーバ
monipet
動物病院の犬猫の見守りをサポート
病院を離れる夜間でも安心
Smart mat
重さセンサIoTで在庫管理に革新を。
自動発注&メールアラートで欠品・発注ミスを防ぎます
RealStocker
リアルタイムに在庫を見える化!
スピーディかつ正確な入出庫管理を実現します
株式会社ジェイエスピー
横浜に拠点を置くソフトウェア開発・システム開発・
製品開発(moniシリーズ)、それに農業も手がけるIT企業
以前、こちらの記事の中で少し紹介したように、言語関係なしで商用無償で使える最も高機能な帳票ライブラリは、Javaの「JasperReport」と思っています。
まだ「JasperReport」がリリースされて間もない頃、それこそ10年以上前に使いましたが、その時点でかなりの傑作でした。
xmlで作った帳票レイアウトをJavaのメソッドで読み込ませ、レイアウト上の変数に値を設定すると、PDFなど指定した形式で出力できます。
当時驚いたのが多様な形式で、PDF以外にExcelやWord・PowerPoint・HTML・CSV・RTFなどでも、ほぼ同じソースコードで出力できてしまいます。
(ウィキペディアもご参照ください)
この機能が面白く、簡単にできるので、作ったWEBアプリで(必要もないのに)画面から色んな形式で出力できるようにしてしまったものです。
性能もさほど遅いと感じたこともなく、帳票レイアウトxmlも別途提供される「iReport」というツールで簡単に作れますし、日本語対応もばっちりでしたので、何十万もかかる有料帳票ツールはいらないよね、と思いました。
さて、結論からすると、Rustでそこまで丘の黒船的な帳票ライブラリはまだありません。
(多分他の言語でもないのでは....)
Rustで「JasperReport」級なことができれば、Rust界では大騒ぎになるとこと間違いなし!
恐らく高速性・低メモリも期待できるので、Rust以外の言語からも実行できるようにバイナリを作ってあげると、「JasperReport」にとって代わるかも...
紙印刷しないまでも、書き換えできないPDFとして数年保管する業務とかはあるので、業務アプリの世界では帳票生成ニーズはまだ続くのではないでしょうか。
とりあえず、Rustでもいくつか帳票生成ライブラリはありましたので、調査した結果を掲載します。
---【PDF系】---
・PDF Print
TTFフォントでUnicode対応しており、日本語も大丈夫かもなライブラリです。
ただ、線を引いたり書式を整えたりするのが、全部ソースコードで書かないといけない!
少し体裁を変えたりするのに、いちいちコンパイルしなおさないといけないという....
ハードコードせずに設定ファイルにするにしても、なかなか現実的ではないかも....
メンテナンスは継続しているようです。MITライセンスにつき、商用無償です。
・lopdf
恐らくRustで最初期にPDF生成を試みたライブラリ。
他のライブラリはこのライブラリを参照していたりするという。
ですが、ドキュメントが少なすぎて、実利用にはちょっと....
メンテナンスは継続しているようです。MITライセンスにつき、商用無償です。
まともに動きそうなのは上記くらいです。
他にも「pdf_canvas(rust-pdf)」というのもありますが、やはりドキュメントが少なく、使えるかどうか....
---【Excel系】---
・xlsxwriter
なんとかExcel生成できますよ、という雰囲気です。
これも線を引いたりするのに、コーディングが必要なようです....
2020年3月7日に0.3.0をリリースしたようで、メンテナンスを継続しています。
Apache-2.0ライセンスにつき、商用無償で使えます。
・calamine
こちらはExcelの読み込みしかできません。
ですが、アップロードしたExcelのデータを読み込むことがあるでしょうので、紹介します。
メンテナンスを継続しており、MITライセンスで商用無償で使えます。
---【CSV系】---
・Crate csv
Rust標準のCSV読み込み・書き込みライブラリです。
実はこれを使って試しにCSVの読み書きを実装してみました....が!面倒なことこの上なかったです。
よくあるライブラリとしては、ファイルパス、文字コード、項目区切り文字、項目囲み文字、ヘッダー開始位置、改行コード、メモリ蓄積レコード数(フラッシュレコード数)、エスケープ文字あたりをパラメータとしてメソッドなりを実行すればうまく読み書きしてくれるものと思います。
ですが、特にShift-JISの読み書きのためには、一度Rust用のUTF-8に変換しないといけなくて、この実装だけで何時間もかかってしまうということに。
何か自分でライブラリ作って公開するか、と思ったくらいです。あまりいいのは見つかりませんでした。
調査結果は概ね以上です。
このような状況ですと、たとえRustベースのアプリであったとしても、PDF生成機能だけJavaの「JasperReport」にするのが、今の段階ではベストではないでしょうかね。Rustから普通にjavaコマンドを実行して帳票を生成させるイメージで。
これらの帳票ライブラリを使っても、コードがタイヘンなことになること請け合い.....と思った次第です。
追伸...
私が書いた過去のRust記事もよければどうぞ。
V言語とRust
40歳文系のRust 5 (Websocket調査)
40歳文系のRust 4 (通信方式設計)
40歳文系のRust 3 (CSVファイルの入出力)
40歳文系のRust 2 (データベース操作)
40歳文系のRust (業務アプリ開発基盤としてのRust)
(酒)
シンプル入退室管理
限りなくシンプルなタイムカードシステム
WhitePlug
手のひらサイズのLinuxサーバ
monipet
動物病院の犬猫の見守りをサポート
病院を離れる夜間でも安心
Smart mat
重さセンサIoTで在庫管理に革新を。
自動発注&メールアラートで欠品・発注ミスを防ぎます
RealStocker
リアルタイムに在庫を見える化!
スピーディかつ正確な入出庫管理を実現します
株式会社ジェイエスピー
横浜に拠点を置くソフトウェア開発・システム開発・
製品開発(moniシリーズ)、それに農業も手がけるIT企業