この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
以前ColdFusion 9でPPTをPDFに変換してみるで<cfdocument>タグを使ったPDF変換を試してみましたが、今回はもう少し深く検証してみました。検証するのはoffice2007形式のpptxファイル。
最初はシンプルなファイルを変換していたので、特に問題なく変換されてると思っていましたが、Office2007以降の拡張子pptxについては変換自体はできるが中身が欠落していたり、うまく変換できない場合があり、そのうまく変換されないページを抜き出して別ファイルで保存して、原因の調査しました。
抜き出したファイルは以下の様なシンプルなものです。
<cfdocument>タグを使って変換した結果のPDFの状態
結論から言うとPDF変換する際にColdFusionサーバにインストールしたOpenOfficeが原因でした。ColdFusion側の問題ではなかった。サーバにインストールされているOpenOfficeでpptxを直接開いてみると以下の様な状態で開かれます。
という事でこれを回避する方法がないかと思い、pptxのファイルをOpenOfficeのファイル形式に変換してくれるツールがあったので、odf-converter-integrator-0.2.3-installer.exeを試してみました。
odf-converter-integratorツールをインストールしてからpptxを開いた結果は以下の通りです。なかなかいい感じで変換できている様です。
で、無駄な処理と分かりつつpptxをアップロードされた場合は一旦ツールを使ってodpファイルに変換して、変換したodpファイルをpptxに変換するという処理を一度入れて、<cfexecute>タグでpptx→odp→pptxにしてその後に<cfdocument>タグでPDF変換してみました。
実行結果は期待通りに綺麗に変換されました。
これで使えるかなと思って再度100ページほどある元ファイル(pptx)を変換してみましたが、それなりに綺麗に変換できたので、一応許容範囲かなと思います。
検証したサンプルプログラムは以下の通りです。(pptxアップロード用のHTML):ppt-pdf-upload.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang=ja>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
</head>
<body>
<form action="ppt-pdf-sample.cfm" name="form1" method="post" enctype="multipart/form-data">
<input type="file" size="100" name="uploadForm">
<input type="submit">
</form>
</body>
</html>
サーバ側の処理プログラム(pptx→odp→pptx→pdf変換):ppt-pdf-sample.cfm
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>sample/title>
</head>
<body>
<cfif IsDefined("form.uploadForm")>
<cffile action="upload" destination="C:\inetpub\wwwroot\simple\galleriffic\upload" nameConflict="Overwrite" filefield="uploadForm">
</cfif>
<!--- Office2007以降のファイルの場合、変換する --->
<cfif #cffile.SERVERFILEEXT# is "pptx">
<!--- コマンドライン形式でpptx形式からodp形式に変換 --->
<cfexecute name="C:\Program Files (x86)\odf-converter-integrator\OdfConverter.exe" arguments="/I #SERVERDIRECTORY#\#SERVERFILE#" timeout="240" />
<!--- とりあえずアップロードされたpptxを削除 --->
<cffile action="delete" file="#SERVERDIRECTORY#\#SERVERFILE#">
<!--- コマンドライン形式でodp形式からpptx形式に再度変換 --->
<cfexecute name="C:\Program Files (x86)\odf-converter-integrator\OdfConverter.exe" arguments="/ODP2PPTX /I #SERVERDIRECTORY#\#SERVERFILENAME#.odp" timeout="240" />
<!--- 中間ファイルodp形式ファイルを削除 --->
<cffile action="delete" file="#SERVERDIRECTORY#\#SERVERFILENAME#.odp">
</cfif>
<!--- PPTからPDFに変換する --->
<cfdocument format="pdf" srcfile="#cffile.ServerDirectory#\#cffile.SERVERFILE#"
filename="#SERVERDIRECTORY#\#SERVERFILENAME#.pdf" overwrite="yes"></cfdocument>
<!--- 生成したPDFファイルを表示する --->
<cflocation url="http://127.0.0.1/simple/galleriffic/upload/#URLEncodedFormat(CLIENTFILENAME)#.pdf">
</body>
</html>