CF:将Fusioncharts图表保存为图像以通过电子邮件发送

时间:2013-02-23 02:01:38

标签: coldfusion fusioncharts

有没有人有这方面的例子?谷歌今晚不是我的朋友。我有最新版本的FusionCharts。我正在试图找出如何将图形保存为图像文件以通过电子邮件发送它。

我知道如何保存然后将图像插入到HTML电子邮件中,之前我已经使用过其他图形产品。我只是不能很好地说明如何使用Fusioncharts做到这一点。

谢谢!

2 个答案:

答案 0 :(得分:1)

在模板中使用以下代码,并将imageSaveURL属性指向该模板。

您的图表提交了要重建的图表的所有必要数据。在我的示例中,我将其提供给浏览器,但您可以在本地保存,然后在必要时附加到cfmail

我很确定我最初是从fusioncharts论坛得到的。这是针对fusioncharts 3.1更新的。

<cfif structKeyExists(Form, "width") >
    <cfset width = int(Form.width) />
<cfelse>
    <cfset width = int(Form.Meta_Width) />
</cfif>
<cfif structKeyExists(Form, "height") >
    <cfset height = int(Form.height) />
<cfelse>
    <cfset height = int(Form.Meta_Height) />
</cfif>

<cfif structKeyExists(Form, "data") >
    <cfset Form.data = Form.data />
<cfelse>
    <cfif structKeyExists(Form, "stream") >
        <cfset Form.data = Form.stream />
    </cfif>
</cfif>

<cfset user = viewState.getValue("user", structNew()) />


<!--- Impose some limits to mitigate DOS attacks --->
<cfif Not (0 lte width and width lte 5000)>
    <cfthrow message="Width out of range." />
</cfif>
<cfif Not (0 lte height and height lte 5000)>
    <cfthrow message="Height out of range." />
</cfif>


<!--- Check if we have the chart data --->
<cfif Not StructKeyExists(Form, "data") or Not Len(Trim( Form.data ))>
    <cfthrow message="Image Data not supplied." />
</cfif>


<!--- Default background color is white --->
<cfif Not StructKeyExists(Form, "bgcolor") or Not Len(Trim( Form.bgcolor ))>
    <cfset Form.bgcolor = "FFFFFF" />
</cfif>


<cfset gColor = CreateObject("java", "java.awt.Color") />
<cfset chart = CreateObject("java", "java.awt.image.BufferedImage") />
<cfset chart.init( JavaCast("int", width), JavaCast("int", height), chart.TYPE_3BYTE_BGR) />
<cfset gr = chart.createGraphics() />
<cfset gr.setColor( gColor.decode("##" & Form.bgcolor) ) />
<cfset gr.fillRect(0, 0, JavaCast("int", width), JavaCast("int", height)) />

<!--- Get rows with pixels --->
<cfset rows = ListToArray(Form.data, ";") />

<cfloop from="1" to="#ArrayLen(rows)#" index="i">

    <cfset pixels = ListToArray(rows[i], ",") />
    <!--- Horizontal index (x scale) --->
    <cfset horizIndex = 0 />

    <cfloop from="1" to="#ArrayLen(pixels)#" index="j">

        <cfif ListLen(pixels[j], "_") eq 2>
            <!--- We have the color and the number of times it must be repeated --->
            <cfset color  = ListGetAt(pixels[j], 1, "_") />
            <cfset repeat = ListGetAt(pixels[j], 2, "_") />
        <cfelse>
            <!--- Background color; how many pixels to skip --->
            <cfset color  = "" />
            <cfset repeat = ListGetAt(pixels[j], 1, "_") />
        </cfif>

        <cfif Len(Trim(color))>

            <!---  If the hexadecimal code is less than 6 characters, prefix with 0 to get a 6 char color --->
            <cfif Len(Trim(color)) lt 6>
                <cfset color = RepeatString(0, 6 - Len(Trim(color))) & color />
            </cfif>

            <!--- Draw a horizontal line for the number of pixels we must repeat --->
            <cfset gr.setColor(gColor.decode("##" & color)) />
            <cfset gr.drawLine(JavaCast("int", horizIndex), JavaCast("int", i - 1), JavaCast("int", horizIndex + repeat -1), JavaCast("int", i - 1)) />
        </cfif>

        <cfset horizIndex = horizIndex + repeat />
    </cfloop>

</cfloop>

<!--- Get writer for Jpeg --->
<cfset writer = "" />
<cfset iter = CreateObject("java", "javax.imageio.ImageIO").getImageWritersByFormatName("jpg") />
<cfloop condition="iter.hasNext()">
    <cfset writer = iter.next() />
</cfloop>

<!--- Set Jpeg quality to maximum --->
<cfset jpgParams = CreateObject("java", "javax.imageio.plugins.jpeg.JPEGImageWriteParam").init( CreateObject("java", "java.util.Locale").init("en") ) />
<cfset jpgParams.setCompressionMode( jpgParams.MODE_EXPLICIT ) />
<cfset jpgParams.setCompressionQuality( 1 ) />

<!--- Write image to a memory stream --->
<cfset imageOutput = CreateObject("java", "java.io.ByteArrayOutputStream").init() />
<cfset writer.setOutput( CreateObject("java", "javax.imageio.stream.MemoryCacheImageOutputStream").init( imageOutput ) ) />
<cfset writer.write(JavaCast("null", 0), CreateObject("java", "javax.imageio.IIOImage").init(chart, JavaCast("null", 0), JavaCast("null", 0)), jpgParams) />

<!--- Stream the image to the browser (hint browser to display the Save dialog) --->
<cfset filename="whatever.jpg" />
<cfheader name="Content-Disposition" value="attachment; filename=""#filename#""">
<cfcontent type="image/jpeg" variable="#imageOutput.toByteArray()#">

答案 1 :(得分:1)

查看最新的博客文章Export Chart Images at Server Side,其中描述了两个选项(wkhtmltoimage和PhantomJS。),并提供了两个选项的分步说明。

对于ColdFusion,您可以尝试以下代码:

例如:

<cfexecute name="C:\Program Files\wkhtmltopdf\wkhtmltoimage.exe" arguments="--javascript-delay 10000 http://docs.fusioncharts.com/charts/Code/MyFirstChart/ms-weekly-sales-no-animation.html savedimage.png" />

执行上述脚本时,我们提供以下参数:     致电wkhtmltoimage     将您网页的网址传递给它     传递图像文件的路径和名称(带扩展名),以保存图像     如果需要,任何额外的延迟以确保图表完全呈现。