CubePDF 正式版とカスタム仮想プリンタの公開

本日、CubePDF 1.0.0 を 最初の正式版 としてリリースしました。この記事では、1.0.0 までの道のりの回顧と、同時リリースした有償によるカスタム仮想プリンタ CubePDF Customize の宣伝、もとい、狙いについて記載します。

CubePDF 1.0.0 のリリースまでの道のり

CubePDF メイン画面

CubePDF は 2010 年 7 月 7 日に初版である 0.9.0 β をリリースして、その歴史が始まりました。そこから既に 9 年の月日が経過しており、1.0.0RC1 から数えても 6 年半位となっています。Web 上で「いつまで RC なんだよ」との評判をちらほら見かける事もあり、私としても「それな」とは思っていまいた。

CubePDF は最初期の頃、仮想プリンタを実現するためのシステムライブラリとして RedMon を利用していましたが、いくつかの課題が浮上した結果、最終的に自前のものに換装と言う選択をしました。この時にリリースされたバージョンが 1.0.0RC1 であり、当初の予定では、しばらく様子を見た後に 1.0.0 正式版とするつもりでした。しかし、様子を見ている内に様々な問題が発覚あるいは新たに出現し、それらの対策を検討している内に機を逸して現在に至っています。

参考までに、RC のバージョン毎の主な課題は下記のような感じでした。この内、フォント埋め込み問題に関しては、残念ながら現在においても根本的な解決方法は見つかっておらず、いったん機能自体を取り下げると言う形になっています。

  • PDF へのフォント非埋め込み設定時の文字化け (RC1 ~ RC5)
  • Microsoft ストアアプリ (UWP) への対応 (RC8 ~ RC11)
  • 内部コードの大幅なリファクタリング (RC12)
  • Ghostscript で発生した脆弱性への対応 (RC13 ~ RC15)
  • 仮想プリンタのインストール処理の改善および汎用化 (RC16 ~ RC19)
CubePDF の開発に対するモチベーション

また、別の理由として、私自身の CubePDF の開発に対するモチベーションが一時期低下していた事も挙げられます。 2015 年に Windows 10 がリリースされましたが、この時に「Microsoft Print To PDF」と言う機能が Windows 10 の標準機能として盛り込まれました。これは PDF に変換する機能を仮想プリンタとして実現しているものだったので、「あれ?これもう CubePDF 要らなくない?」と言うのが率直な感想でした。

モチベーションを取り戻したのは、CubePDF 1.0.0RC12 をリリースした頃となります。一つは、Microsoft Print To PDF を調査していると、どうもプリンタドライバの処理として埋め込み画像に対して JPEG 圧縮を実施しているようで、これを回避するのは困難ではないか?(標準機能に対する優位性があるのではないか?)と言う感触を得たのがきっかけとなりました。また、現実の現象として Windows 10 のリリース後も CubePDF のダウンロード数は減少しておらず、このまま終わらすべきではないと言う意識に変わった事も大きかったと思います。

そのような紆余曲折がありましたが、ここ 2 年位の試行錯誤により、個人的にも「不都合はもうない……なんて事を言えるはずはないが、内部コードも開発当初に比べてかなり整理され、ユニットテストの力を借りる事によってデグレードを引き起こす可能性もかなり低減された」と思える程度には改善されてきたため、今回「正式版」を名乗る事を決断しました。

CI サービス上でのテスト結果の様子

有償版カスタム仮想プリンタ CubePDF Customize の提供開始

CubePDF と CubePDF Customize の比較図

今回のもう一つの大きな発表は、CubePDF で使用している仮想プリンタ部分のみを有償で提供する CubePDF Customize です。概要に関しては、CubePDF Customize の Web ページ を参照して頂くとして、ここでは CubePDF Customize の提供開始に至った個人的な思いについて記載します。

キューブ・ソフトでは、提供しているソフトウェアの多くのソースコードを cube-soft - GitHub にて公開しています。公開を決めた会社としてのきっかけは、CubePDF が Ghostscript 等のライブラリを利用している事によるものだったのですが、それとは別に 自分の書いたコードが公開できる と言う事が私自身にとって非常に強いモチベーションとして機能しています。しかし、(GPL ではない)ソースコードを公開する 会社として のモチベーションが弱い事は長年気になっていた部分であり、もう少し公開する事の意義を持たせたいとも感じていました。

この問題への打開策を模索していた時に、非常に参考となった記事がありました。

カスタマイズをするのはかなりしんどい。自社ではカスタマイズは受け付けていない。もし機能追加をする場合はオープンソースでの公開が前提となる。そのため「カスタマイズのサポート」を Sora を購入している顧客に対してのみ有償にて提供している。

(中略)

つまり、この製品のビジネスモデルこうだ。

  • カスタマイズを提供せずカスタマイズのテクニカルサポートを提供する
  • カスタマイズはせずオープンソースとして公開する
  • WebRTC SFU Sora を購入してもらっている顧客へのみ提供する

リアルタイムな音声や映像をバイナリ一つで配信できるのはとても便利だ。ただ、それを特定のハードに対応させる場合はカスタマイズが必要になる。さらにもともとリアルタイム配信の世界は難しい。

1から自分たちだけでカスタマイズするよりも、そもそも Momo を開発をしている会社と一緒にやっていったほうがいい。

クローズドソースとオープンソース – V – Medium

時雨堂の @voluntas さんの記事は、自分が開発を続ける、あるいは組織を継続させていく上で参考になるものが多く、よく読ませて頂いています。そして、自社ソフトウェアの クローズドソースとオープンソースの境界 を明確に認識できたきっかけとなったのが上記でした。

CubePDF は、以下の 3 種類の機能に大別されます。

  1. 仮想プリンタを構築するためのシステムライブラリ
  2. 仮想プリンタから渡されたデータを PDF 等に変換するためのアプリケーション
  3. これらの機能を連携させ、端末にインストールするためのアプリケーション

この内、2. の機能を完全に取り除き、1. と 3. のみを有償にて提供するのが CubePDF Customize となります。そして、2. の部分を ユーザ自身の手によって実装してもらう ために積極的に技術情報を公開していくのが、今回の大きな挑戦です。

CubePDF Customize に関する技術情報は、Cube.Vp.Docs を随時更新していく事により公開を続けます。また、この技術的サポートの一環として、CubePDF 1.0.0 では、CubePDF のメイン処理に当たる部分のみを抽出し NuGet パッケージとして公開する事も開始しました(Cube.Pdf.Converter)。例えば、CubePDF と同等の変換処理を行う最も簡単なサンプルコードは下記となります。

// using Cube.Pdf.Converter;
// using System.Reflection;

static void Main(string[] args)
{
    var settings = new SettingFolder(Assembly.GetExecutingAssembly());
    settings.Load();    // レジストリの設定をロード
    settings.Set(args); // 仮想プリンタからの引数を解析

    using (var facade = new Facade(settings)) facade.Invoke();
}

CubePDF Customize の概要を知るための最初のステップとしては Tutorial - Cube.Vp.Docs - GitHub を参照下さい。また、Cube.Pdf.Converter ライブラリに関しては、Cube.Pdf.Converter - Cube.Vp.Docs - GitHub に概要を記載しています。

仮想プリンタとして CubePDF が知名度を得ていくにつれて、ありがたい事に、これまで数多くのカスタマイズのご依頼を頂いてきました。しかし、それらの中には、金銭的、あるいは時間的な面で「本来であれば、アプリケーション部分は貴社の方で実装してもらった方が絶対良いはずなのだが……」と感じる事が多々あったのも事実です。今回の CubePDF Customize によって、私(弊社)とユーザの皆様、双方にとって良い形に向かえるようになる事を期待して、これからも開発を続けていきたいと思います。