我有一个有许多屏幕/页面的客户和产品管理应用程序。我希望某些页面可以打印并导出为PDF格式。
要打印文档,它是为@Print媒体提供CSS样式表的简单案例,它剥离了许多常规样式。但是,在生成PDF时,我注意到<cfdocument>
和<cfhtmltopdf>
标记都希望呈现整个HTML页面(包括<head>
标记)。
这意味着它没有认识到PDF用于打印的目的,也没有提取@Print样式。目前,我必须创建一个单独的makepdf.cfm
页面并重复我要导出的页面的HTML以及仅包含打印CSS样式表。
这看起来有点疯狂,因为每次更改可以打印/导出为pdf的主应用程序屏幕时,我都必须更新makepdf.cfm
页面。
有没有更好的方法来实现我想要做的事情?
答案 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。到目前为止似乎有所帮助。