タイトル通りの内容ですが、内部で使用している変換にはMicrosot.Office.Interop.Word
を使用しています。
Google先生に聞くとこの辺りの情報は豊富ですし、COMオブジェクト故に「Microsot.Office.Interop.Word
は使うな!」という意見も見つかりますが、PDF保存には必要な選択肢なので避けることはできません(ファイルの読書きだけならマネージドなライブラリを使用してもよさそうですが)。あと、保証が無いオープンソースのライブラリを使用することの是非もあります。個人で使用するならともかく、エンタープライズ向けアプリならその視点が必要では。
まぁ、有償であればPDF変換ライブラリはあるかもしれませんが。
本筋ではない補足ですが、OfficeファイルのPDF変換は他にも方法があり、Officeファイルの一括変換はAcrobat有償版で一応はできるのと、2つ目はやや面倒な方法ですが、プリンタドライバーの「Microsoft Print to PDF」を使用することも可能です。後者はWindows10に標準搭載されていますが、保存するファイル1つ1つの名称を都度聞いてくるので、やや手間です。
なので、同階層にあるWordファイルを一括変換するアプリを作ってみようと思いました。それが経緯です。
※ちなみに、これに関連して、ガベージコレクションのコーディング例を検証した記事は以下になります。
必要な環境
- .NET Framework 4.6.1 or later
- MS Wordがインストールされていること(2013, 2019のWordで確認)
- OSはWindows 8.1と10で確認済
画面
##アップロード先
一応、ソースをGitHubにアップロードしています。
英語が下手なのはご容赦下さい。
##注意点
マイドキュメントなどをリダイレクトしている場合(VDI環境でやるやつ)、それらの特殊フォルダの中で実行するとパスが上手くとれないと思います(¥¥で始まるネットワークパスが入るはず)。この辺りは要調査中。
##開発に当たっての所感等
Microsfot.Office.Interop.Word
がCOMオブジェクトで、パフォーマンス及びガベージコレクションに関する問題があることは一応は知っていたので、マネージドなライブラリがないか探したが、見つからず(有償ならあるようだが)。
Word, ExcelファイルはそもそもがOffice Open XMLと呼ばれる規格で実態はXMLで構成されているが、NuGetで公開されている他のOSSライブラリに関しても、あくまでファイルの読書きができるのみで、PDF変換はできない(考えれば分かることだが)。
従って、あまり使用したくはなかったが、この選択に落ち着いた。
.NETからCOMオブジェクトを使用する際に注意すべきガーベジコレクション(GC)の動作については、別のQiita記事で公開する予定。