在ColdFusion中生成PDF

时间:2015-06-23 09:12:35

标签: pdf coldfusion coldfusion-11

我有一个有许多屏幕/页面的客户和产品管理应用程序。我希望某些页面可以打印并导出为PDF格式。

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

这意味着它没有认识到PDF用于打印的目的,也没有提取@Print样式。目前,我必须创建一个单独的makepdf.cfm页面并重复我要导出的页面的HTML以及仅包含打印CSS样式表。

这看起来有点疯狂,因为每次更改可以打印/导出为pdf的主应用程序屏幕时,我都必须更新makepdf.cfm页面。

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

2 个答案:

答案 0 :(得分:3)

我不确定你的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页面,你可以将链接标签中的HREF值设置为会话参数

答案 1 :(得分:1)

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

我最终传递了一个url标志pdf = 0/1,然后在模板中只需在你要切换的内容周围添加一个cfif。

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