如何将ColdFusion页面转换为PDF下载?

我想把我的CFM页面生成的HTML转换成PDF格式,并让用户在导航到我的页面时使用标准的“另存为”提示。

请先 登录 后评论

4 个回答

Frank Wiles

我对ColdFusion不是很熟悉,但您需要做的是在用户请求时将页面的内容类型设置为application/octet-stream。这将提示他们每次下载。

希望这可以帮助!

请先 登录 后评论
Soldarnal

您应该使用cfdocument标记(带有format="PDF")来生成PDF,将其放置在正在生成的页面周围。您需要指定一个filename属性,否则文档将直接流到您的浏览器。

将内容保存为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作为文件名,但是您可能希望使用一些随机的或会话生成的字符串作为文件名,以避免竞态条件导致的问题。

请先 登录 后评论
Ben Doom

如果你想完全避免存储PDF,使用没有文件名的cfdocument将(flashpaper的)PDF直接发送到浏览器,而不使用cfheader和cfcontent。

注意:就像使用cfheader/cfcontent一样,你需要在缓存刷新到浏览器之前这样做,因为它基本上是在做同样的事情,而不需要存储文件。

为了获取内容,我可能会使用包装在相同的调用/包含/等的cfsavecontent。生成页面,但有两个主要例外。Cfdocument似乎与外部样式表有问题,因此使用include将样式直接放入文档中可能是一个好主意。您可以尝试使用@import来代替——它适用于某些人。此外,我还会注意图像的相对链接,因为它们有时会断开。

请先 登录 后评论
Andy Waschick

<cfdocument> 方法是被认可的完成它的方法,但是它并不能提供所有可能的操作现有PDF文档的方法。我有一个项目,我需要使用预先设计的打印分辨率PDF模板生成优惠券。 <cfdocument> 可以让我近似输出,但只使用嵌入HTML中的位图图像。的确,我可以通过制作一个大图像并在HTML中缩放来伪造打印分辨率,但原始图像是一个漂亮、干净的矢量图像文件,我想用它来代替。

我最后用的是 3. 完成工作。它是一个围绕Java PDF库的CF包装器,允许您操作现有的PDF文档,包括填写PDF表单、设置权限、合并文件、绘制矢量图形、表格和文本、使用自定义字体等等。如果你愿意使用它,你可以得到一些非常惊人的结果。

它的一个缺点是,开发人员似乎把这个产品放了很长一段时间。开发者网站的版权仍然是2003年的,没有提到任何超过ColdFusion MX 6.1的内容。我最终不得不打破一些加密模板,以修复一些错误,使其按我需要的工作。尽管如此,它仍然是一个强大的工具。

请先 登录 后评论