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

有帮助吗?

解决方案

您应该使用 cfdocument 标签(格式为“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 将(flashpaper 的)pdf 直接发送到浏览器,而不使用 cfheader 和 cfcontent。

警告:与使用 cfheader/cfcontent 一样,您需要在缓存刷新到浏览器之前执行此操作,因为它基本上执行相同的操作而无需存储文件。

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

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

我最终使用了一个副本 <cfx_pdf> 完成工作。(开发商网站, CF标签存储)它是一个围绕 Java PDF 库的 CF 包装器,可让您操作现有的 PDF 文档,包括填写 PDF 表单、设置权限、合并文件、绘制矢量图形、表格和文本、使用自定义字体等。如果您愿意使用它,您可以获得一些非常惊人的结果。

一个缺点是,开发商似乎已经将该产品搁置了很长时间。开发者网站的版权仍然是 2003 年,并且没有提及 ColdFusion MX 6.1 以后的任何内容。我最终不得不破坏一些加密模板,以修复一些错误并使其按照我的需要工作。尽管如此,它仍然是一个强大的工具。

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

希望这可以帮助!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top