Microsoft Office(マイクロソフト オフィス)のファイルを、プログラム開発者が自力でPDFや画像に変換するには、どうしたら良い?

Microsoft Officeで作ったWord、Excel、PowerPointのファイルをブラウザで表示したいというニーズは大きいでしょう。さらに、開発者であれば、自分の力でこの機能を実装したいというのは自然な欲求です。例えば、StackOverflowで2017年3月6日に次のような質問がありました。

「自分のwebアプリケーション(C#.Net)で(Officeの)ドキュメントビューアを作成したいという要求をもっており、このためにいかなるサードパーティのツールも使いたくない。ファイルをイメージまたはPDFまたはWebページで簡単に可視化できる共通フォーマットに変換できますか?」(StackOverflow の質問(英語)[1]より引用)

類似の質問は頻繁に投稿されています。Office Server Document Converter(旧Server Based Converter)([2])などのツールを使えば簡単に実現できるのですが、ここではツールを使わないで自力で開発するにはどうしたら良いか、を整理してみましょう。

Officeファイルをブラウザで表示する方法

Officeファイルをブラウザで表示するには、まず、Officeファイルをブラウザで表示できる形式に変換する必要があります。その方法は大きく分けると3通り考えられます。

第1はOfficeファイルをHTMLに変換して、HTMLとして表示する方法です。第2はOfficeファイルをPDFに変換して、PDFをブラウザで表示する方法です。現在、ChromeやMicrosoft Edgeを始めとして、PDFを直接表示できるブラウザが増えています。第3はOfficeファイルをラスター画像やSVGなどの画像に変換して、画像をブラウザで表示する方法です。

Microsoft Officeのファイルをブラウザで表示する方法
Microsoft Officeのファイルをブラウザで表示する方法

Microsoft Officeを使えるなら簡単

変換処理にMicrosoft Officeを使うことができるならば、3通りとも比較的簡単に実現できます。

Microsoft WordとMicrosoft Excelの「ファイル」メニューには「名前を付けて保存する」機能があり、そこでファイルの種類を選択できます。ファイルの種類の中には、「Web形式(HTML)」、「PDF」があります。WordやExcelから、イメージ画像は直接作成できませんが、PDFを経由して(PDFを別のツールで)画像化するのは簡単です。

Microsoft PowerPointでは、「PDF」と「画像(PNG、JPEG、TIFFなど)」の形式を選択できます。PowerPointはHTMLでは保存できません。Microsoft Officeの「名前を付けて保存」をオートメーションで動かすツールも提供されています。

Microsoft Officeを使わないときどうするか

同様のことをMicrosoft Officeを使わず、サードパーティのツールも使わないで、開発者が自力で実現することを考えてみます。先に引用した質問にはMicrosoftのエンジニアが、その方法の概略を回答していました。ここでは、もう少し詳しく検討してみます。

サードパーティのツールは使わない、といってもオープンソースは使って良いのかどうか、また、OfficeファイルをMicrosoft Officeで印刷したときのレイアウトをどの位忠実に再現したいか、によって難易度には大きな差があります。

(1) Officeのファイル形式に精通する

Officeファイルを変換するは、最初にOfficeファイルを読まねばなりません。自力で読むのであれば、Microsoft Officeの文書形式に精通する必要があります。

Microsoft Officeの文書形式はOffice 2003まではバイナリー形式でした。Office 2007からはXMLを使って規定されています。XMLによって規定したOfficeファイル形式をOffice Open XML(OOXML)といいます([3])。OOXML形式は国際標準であり公開されていますので、誰でも勉強すればファイル形式を理解できます。

もっとも、オープンソースであるApacheのPOIなどのライブラリー([4])を使って読むのであれば、Officeファイル形式について極めなくても良いかもしれません。

(2) Officeファイルを読むプログラムを作る

OOXML形式のファイルを自力で読むのは比較的簡単です。拡張子をzipに変更し、zipを解凍するツールを使ってファイルを解凍します。すると内部はXML形式のファイルですのでXMLをパースするプログラムを使えば、文書ファイルの内容を取り出せます。

一方、オフィス2003以前のバイナリーファイルを読むとするとかなりやっかいです。Microsoft Officeを使うのであれば、オフィスの新しいバージョンでバイナリー形式のファイルも気にしないで読むことができます。

しかし、自力でやるとなりますとバイナリー形式を読むための専用のプログラムを開発する必要があります。バイナリーを解読して読むプログラムを作るのは大変です。昔はゼロから自力で作る必要がありましたが、いまならApacheのPOIなどを使うのが現実的です。

他の方法としてはOpen OfficeなどもMicrosoft Officeのバイナリーファイルを読んでいますので、頑張れば不可能ということはないでしょう。但し、ツールで読み込める部分には限界がありますので、限界を超えようとすると自分でプログラムを作る必要があります。

(3) 変換先のファイル形式に精通する

次に変換先のファイル形式をPDF、HTMLまたは画像のどれかに決めます。そして、ファイルを自分で書き出すために、変換先ファイルの形式に徹底的に精通する必要があります。

PDFはISO 32000-1:2008という国際標準([5])になっています。PDFに精通する手間を省きたいのであれば、PDFを生成するAPIをもつライブラリーを使うこともできます。高度なPDF機能(PDF/A、PDF/X、アクセシブルなPDF(PDF/UA))を使うのでなければ、オープンソースのPDF書き出しライブラリーもあります。

PNGやJPEGなどの画像のファイル形式は公開されていますので、時間と労力を厭わなければ誰でも精通できるでしょう。

(4) Officeファイルを変換先のファイル形式に変換する

a. Officeファイル形式をPDFにする

Officeファイル形式をPDFにするときは、読み込んだOfficeファイルを紙に印刷するのと同じように印刷レイアウト処理をするプログラム(レンダラーとかフォーマッターといいます)を作る必要があります。

レンダラーにはピンからキリまであります。例えば、Officeファイルの中からテキストを取り出して、一定の大きさのページ上にテキストを並べる程度で良いのなら、レンダラーを作るのは比較的簡単です。 さらに進んで、PDFの見栄えを、Microsoft Officeを使って印刷するのと同じレイアウトにしたいならレンダラーの開発が大変になります。

例えば、見出しの文字を元のOfficeファイルと同じ大きさにして、本文の文字の大きさも同じにして、一行の文字数や画像の大きさ、画像の配置、表などどのようにレイアウトするかは、Microsoft Officeがどのように印刷レイアウトを作成しているかを調べて、それと互換のエミュレーションをプログラムする必要があります。

Apache のOpen Office([6])やLibreOffice([7])などMicrosoft Office互換機能をもつオフィスソフトが幾つかあります。LibreOfficeはOpenOfficeよりもMicrosoft Officeとの互換性は高いといわれていますが、それでも印刷レイアウトの再現性はそれほど良くありません([8])。

アンテナハウスのOffice Server Document Converter(旧Server Based Converter)([2])は、Open OfficeやLibreOfficeなどよりはかなり高い再現性を持っていますが、Microsoft Officeの印刷レイアウトと100%互換ではありません。

b. OfficeファイルをHTMLにする

例えばWordファイルをHTMLに変換するとしても、テキストを段落タグ(pタグ)で囲むだけなら簡単です。次に見出しタグ(h1~h6)を付けるということになりますと、もし、Word文書を作成した人が、見出しスタイルを使っていれば、見出しスタイルの付いた段落をHTMLの見出しタグにマップするだけで済みますので、比較的簡単です。

しかし、Word文書に見出しスタイルが設定されていないと、見出しを識別するのが難しくなります。例えば、段落の文字の大きさによって見出しランク(h1~h6)を識別したりするプログラムを書く必要がでてきます。このようにWordの文書をHTMLのタグに対応させるのはPDF出力とは別の難しさがあります。

HTMLではMicrosoft Officeのレイアウトを主にCSSで表します。するとPDFと同じようにレイアウトをどこまで再現するかで開発の大変さが大幅に変わってきます。

c. Officeファイルを画像にする

Officeファイルを直接画像ファイルにするのであれば、PDFのページを作るのと同じようなレンダラーを作ってレンダラーから画像ファイルを作成します。PDFを画像化する方法もあります。あるいは、HTMLを作ってヘッドレスブラウザでHTMLを画像化する方法もあるでしょう。

まとめ

Officeファイルからテキストや内部の画像を取り出して、ブラウザで表示できるようにする、という程度であれば自力で開発するのは簡単でしょう。一方、Microsoft Officeの印刷レイアウトを再現するプログラムを作るには、大変な労力がかかります。

参考資料