在 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 图表。到目前为止似乎有所帮助。
我有一个客户和产品管理应用程序,其中有很多 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 图表。到目前为止似乎有所帮助。