在 ColdFusion 中生成 PDF

Generating PDFs in ColdFusion

我有一个客户和产品管理应用程序,其中有很多 screens/pages。我希望某些页面可以打印并导出为 PDF。

要打印文档,这是一个为@Print 媒体提供 CSS 样式表的简单案例,它去除了很多常规样式。但是,在生成 PDF 时,我注意到 <cfdocument><cfhtmltopdf> 标签都希望呈现整个 HTML 页面(包括 <head> 标签)。

这意味着它无法识别 PDF 的目的是用于打印,并且不会选择 @Print 样式。目前我必须制作一个单独的 makepdf.cfm 页面并重复我要导出的页面的 HTML 以及仅包括打印 CSS 样式表。

这似乎有点疯狂,因为每次我将主应用程序屏幕 printed/exported 更改为 pdf 时,我都必须更新 makepdf.cfm 页面。

是否有更好的方法来实现我想要做的事情?

我不确定你的 CSS 是如何组织的,但我遇到过类似的情况,我需要在屏幕上打印各种内容。我的解决方案是在 Javascript 中使用 AJAX 调用 (CFAJAXPROXY) 到 CFC,以便使用 DIV 内容设置 CF 会话变量,然后调用我的打印页面,它将输出带有 cfhtmltopdf 标签的内容。我的经验是 CSS 必须包含在您使用的任何 PDF 生成标签中。

例如:

 <div id="myContent">content on my page to print</div> 

还有一个打印按钮

 <button onclick="printContent('myContent')">Print</button> 

onclick 在 Javascript 中调用以下内容:

var printContent = function(_contentDiv){
   var _content = $('#' + _contentDiv).html();  
   var _setContent = _cfc.setContent(_content);  
   window.location.href = 'printPage.cfm';  
 } 

“_cfc”在 cfajaxproxy 调用中定义。

将要调用的 CF 函数如下所示:

<cfcomponent>  
    <cffunction access="remote" name="setContent" returntype="string">  
       <cfargument name="_content" required="yes" type="string">  
       <cfset session.content = _content>  
       <cfreturn "whateveryouwant">  
     </cffunction>  
 </cfcomponent>  

printPage.cfm 可能看起来像这样(我使用 Bootstrap 作为我的 CSS):

 <cfhtmltopdf>  
     <link href="css/bootstrap.css" rel="Stylesheet" type="text/css"></link>  
     <cfoutput>#session.content#</cfoutput>  
 </cfhtmltopdf>  

这显然是一个简单的解决方案,但它确实有效。我想如果您需要不同的 CSS 页面,您也可以将 link 标记中的 HREF 值设置为会话参数

假设您在头部使用 link 标签,您可以尝试在样式标签中使用 cfinclude 来包含 css 文件。 cfdocument 似乎对内联样式做得更好。

我最终传递了一个 url 标志 pdf=0/1,然后在模板中简单地在您想要切换的任何内容周围添加一个 cfif。

此时我正在尝试让它识别 FontAwesome 和 Google 图表。到目前为止似乎有所帮助。