1、ofc生成图片
ofc生成图片有两种选择:一是生成图片,然后上传到服务器保存起来;而是生成图片,然后传给JavaScript函数。
1)上传至服务器
OFC暴露了一个接口用于将图片数据上传至服务器,这就是post_image()方法。接口定义如下:
/**
* @param url 是一个字符串,即图片上传路径,可以跟参数.如http://example.com/ofc/ofc_upload_img.php?name=chart.jpg
* @param callback 字符串类型,指定一个JavaScript方法名作为图片上传成功后的回调函数,只有当debug参数为false时可用
* @param debug Boolean类型,如果为true会重新打开一个窗口显示结果*/post_image(url:String, callback:String, debug:Boolean);
比如我们可以这样调用:
functionfindSWF(movieName) {if (navigator.appName.indexOf("Microsoft") != -1) {returnwindow[movieName];
}else{returndocument[movieName];
}
}
findSWF("chart").post_image("go_gen_pdf.php",'',false); //chart为包含图表的div的ID
2)交给JavaScript处理
交给JavaScript处理的话可操作性就比较丰富了,我们可以将图片直接显示在当前页面或者显示在新窗口;也可以将图片上传至服务器保存;甚至模拟图片下载的方式由服务器接收图片数据后转换成图片再将文件流写回页面等。不管采用何种操作,我们首先要做的就是获取图片数据,这里又用到了OFC暴露的另外一个接口:get_img_binary(),这个方法用来获取图表对应图片数据的Base64编码。
var base64Data = findSWF("chart").get_img_binary(); //获取图表对应图片数据的Base64编码
$("#showImg").empty().append(""); //渲染一个图片元素,添加到指定的DIV中
再比如我们将获取到的Base64编码提交给服务器,服务器进行解码处理成图片后再以文件流方式写回页面,这样就类似于图片下载了:
/**
* 这里将图片Base64编码放进页面的一个隐藏域,然后将该隐藏域所在的Form提交,
* 这样在服务器写出文件流时会弹出文件保存对话框,也就类似于"图片另存为..."*/$("input[name='imgBase64Code']").val(findSWF("chart").get_img_binary());
$("#savePicForm").submit(); 【更多OFC使用:
http://www.cnblogs.com/kissdodog/archive/2013/05/13/3075481.html】
因为我需要把多个图表一次性发给服务器,所以我采用的是第二种方法。
2、服务端PHP接受OFC图片数据生成图片文件
1)如果是由post_image()提交上来的数据,PHP处理:
$imgdata = $HTTP_RAW_POST_DATA;
$file = fopen("pic.jpg","w");//打开文件准备写入
fwrite($file,$imgdata);//写入
fclose($file);
/**
* 如果不用$HTTP_RAW_POST_DATA,也可以这样:* $imgdata = file_get_contents("php://input");*/
2)如果是由表单提交上来的get_img_binary()的数据,PHP处理:
$file = fopen("pic.jpg","w");
fwrite($file,base64_decode($_POST['imgBase64Code']));
fclose($file);
3、服务端生成PDF文件
这里使用了fpdf类,为了支持中文,还包含了一个chinese.php文件,即把fpdf.php和chinese.php两个文件放到相应的文件夹下。PHP代码:
$require_once('chinese.php');
$pdf = new PDF_Chinese();
$pdf->AddGBFont();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('GB','',12);
/**
* 可以用fpdf的方法往pdf文件里写数据了
* 如:$pdf->Text(10,10,iconv('UTF-8','GB2312','病毒汇总'));
* 注意:写入中文时,必须是GB2312编码的中文,如果你的代码是UTF-8编码的,要使用iconv()进行转换*/
$pdf->Output("report_".date("Y_m_d").".pdf", 'D');
使用fpdf时,如果出现这样的错误【Deprecated: Function set_magic_quotes_runtime() is deprecated】,这是应为高版本的php不再支持set_magic_quotes_runtime()的缘故,用ini_set("magic_quotes_runtime",value)来代替set_magic_quotes_runtime(value)即可以解决问题。
4、插入图片到PDF
fpdf类插入图片到pdf文件的方法是:$pdf->Image()
如果是使用上述第二步生成的图片文件,则会出现这样的错误【FPDF error: Not a JPEG file: pic.jpg】
即使在生成图片的时候使用png后缀,也会出现这样的错误【FPDF error: Alpha channel not supported: pic.png】
没办法,我只能用php的一个处理图片的库gd2了,后面再讲安装gd2库的方法,这里讲的是用gd2库生成图片的方法:
$im = imagecreatefromstring(base64_decode($_POST['imgBase64Code']));
$filename = "pic.png";
imagepng($im,$filename);
imagedestroy($im);
/**
* 这样生成的图片就可以使用在fpdf的Image()方法里了*/$pdf->Image($filename,10,10);
5、php安装gd2库
1)打开php.ini
2)找到 ; extension_dir = "ext" 修改为 extension_dir = "PHP安装路径\ext"。注:PHP安装路径是绝对路径,如:D:\Kingsoft\Security Manager\SystemCenter\PHP
3)找到 ;extension=php_gd2.dll 修改为 extension=php_gd2.dll【要确保ext目录下确实有php_gd2.dll文件哦】
4)重启apache服务