ColdFusion ページを PDF ダウンロードに変換するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/73964

  •  09-06-2019
  •  | 
  •  

質問

CFM ページで生成された HTML を PDF に変換し、ユーザーがページに移動するときに標準の「名前を付けて保存」プロンプトを表示したいと考えています。

役に立ちましたか?

解決

cfdocument タグ (format="PDF" を指定) を使用して、生成するページの周囲に配置して PDF を生成する必要があります。ファイル名属性を指定すると、ドキュメントがブラウザにそのままストリーミングされてしまいます。

コンテンツを PDF として保存した後、cfheader と cfcontent を組み合わせて使用​​し、PDF を添付ファイル (「名前を付けて保存」) として出力し、ファイルを応答ストリームに追加します。また、ファイル システムからファイルをクリーンな状態に保つために、cfcontent タグに deletefile="Yes" を追加しました。

<cfdocument format="PDF" filename="file.pdf" overwrite="Yes">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>Hello World</title>
</head>
<body>
    Hello World
</body>
</html>
</cfdocument>
<cfheader name="Content-Disposition" value="attachment;filename=file.pdf">
<cfcontent type="application/octet-stream" file="#expandPath('.')#\file.pdf" deletefile="Yes">

余談として:以下の例ではファイル名として file.pdf を使用していますが、競合状態に起因する問題を避けるために、ファイル名にランダムな文字列またはセッションで生成された文字列を使用することもできます。

他のヒント

PDF の保存をまったく避けたい場合は、ファイル名なしで cfdocument を使用すると、cfheader と cfcontent を使用せずに (Flashpaper の) PDF がブラウザに直接送信されます。

警告:cfheader/cfcontent を使用する場合と同様、キャッシュがブラウザにフラッシュされる前にこれを行う必要があります。これは、基本的にファイルを保存せずに同じことを行うためです。

コンテンツを取得するには、同じ呼び出し/インクルードなどをラップした cfsavecontent を使用するでしょう。ページを生成するものですが、2 つの大きな例外があります。cfdocument には外部スタイルシートに関する問題があるようです。そのため、インクルードを使用してスタイルをドキュメントに直接挿入するのがおそらく良い考えです。代わりに @import を使用してみることもできます。一部の人にはこれが機能します。また、画像への相対リンクは壊れることがあるので注意してください。

<cfdocument> このアプローチはそれを実現するための公認された方法ですが、既存の PDF ドキュメントを操作する方法で可能なすべてを提供するわけではありません。事前にデザインされた印刷解像度の PDF テンプレートを使用してクーポンを生成する必要があるプロジェクトがありました。 <cfdocument> 出力を近似することはできますが、HTML に埋め込まれたビットマップ画像のみを使用する必要があります。確かに、大きな画像を作成して HTML 内で拡大縮小することで印刷解像度を偽ることはできましたが、元のファイルは素晴らしくクリーンなベクター画像ファイルだったので、代わりにそれを使用したいと思いました。

結局コピーを使用しました <cfx_pdf> 仕事をやり遂げるために。(開発者サイト, CFタグストア) これは Java PDF ライブラリの CF ラッパーで、PDF フォームへの記入、権限の設定、ファイルの結合、ベクター グラフィックス、表、テキストの描画、カスタム フォントの使用などを含む既存の PDF ドキュメントの操作を可能にします。喜んで取り組むことができれば、かなり素晴らしい結果を得ることができます。

1 つの欠点は、開発者がこの製品を長期間放置したようであることです。開発者サイトの著作権は 2003 年のままであり、ColdFusion MX 6.1 以降については言及されていません。結局、いくつかのバグを修正して必要に応じて機能させるために、暗号化されたテンプレートの一部を破る必要がありました。それにもかかわらず、それは強力なツールです。

私は ColdFusion についてはあまり詳しくありませんが、ユーザーがページの Content-Type を application/octet-stream に設定する必要があるのは、ページの Content-Type を設定することです。これにより、毎回ダウンロードを求めるメッセージが表示されます。

お役に立てれば!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top