ColdFusion 9でpptxが綺麗にPDF変換されない

2012.01.19

以前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>