在前一篇"使用Flex开发时空线形图实例详解"中,我们得到了一张时空线形图报表,本文将说明如何使用AlivePDF导出PDF文件。
AlivePDF是一个用ActionScript 3写的开源PDF开发包。它有很全的文档和示例资料,很容易上手和学习。现在已经发布0.1.5最新版本。目前在Flex中导出PDF,大多数都采用它来实现。
官方网站:http://alivepdf.bytearray.org/
大象当时开发的时候采用的是0.1.4.9版本。AlivePDF给我们提供了一套模板化的导出方法,使用起来非常方便。
//canvas是id,这是获得整个画布内容的快照,返回的是一个位图
var bmp:BitmapData = ImageSnapshot.captureBitmapData(canvas);
var bitmap:Bitmap = new Bitmap(bmp); //将位图转换为显示对象
/**
* 在创建PDF对象之前,设置Size对象的详细参数
* 第一个参数是图像大小数组(width,height),这里给它设定原始图片大小
* 第二个参数是一个字符串,相当于一个标题名
* 第三个参数是尺寸,英寸数组(width,height)
* 第四个参数是尺寸,毫米数组(width,height)
*/
var autoSize:Size = new Size([bitmap.height,bitmap.width],"Tabloid",[11, 17],[279, 432]);
/**
* 创建PDF对象,设置其详细参数
* 第一个参数是方向,LANDSCAPE是横向,PORTRAIT是纵向
* 第二个参数是一个字符串,相当于一个标题名
* 第三个参数是单位,MM是毫米
* 第四个参数是Size对象
*/
var myPDF:PDF = new PDF(Orientation.LANDSCAPE, Unit.MM,autoSize);
myPDF.setDisplayMode(Display.FULL_PAGE); //显示方式,设置为完全显示
myPDF.addPage(); //加入到当前页面
myPDF.addImage(bitmap); //把要导出的显示对象加入进来
/**
* 生成PDF
* 第一个参数是指定采用什么方式生成PDF,一般是REMOTE服务端生成
* 第二个参数是服务器地址
* 第三个参数是打开方式,ATTACHMENT是附件,INLINE是在浏览器中打开
* 第四个参数是生成的PDF文件名
*/
myPDF.save(Method.REMOTE, "http://server:port/appName/createpdf",Download.ATTACHMENT, "timespace.pdf");
上面这些就是导出PDF的步骤,是不是很简单?官方例子中,是没有实例化Size对象,并对它进行参数设置的,而且使用的是固定设置,它有几个预定义好的静态构造对象,可以直接使用。之所以这里要自己定义,是因为我发现如果采用预定义的设置,导出的图像不清晰。我看过Size类的源码,特别是第一个参数,如果你准备导出的尺寸不符合预定义设置的话,最好改成自己想要导出的对象尺寸,这样效果要好一些,另外比较重要的就是第三和第四个参数,一个是英寸一个是毫米。当时我做的时候,将预定义中的值都换着试了遍,发现如果导出的图像比较大,这两组值设定的比较小的话,当缩小看时,会很模糊。DOC文档中写的意思我没看懂,翻译过来就是说,这是为用户更好的显示不进行尺寸计算。我估计这是表示在单位面积内的像素数,不知道这样理解对不对,如果有误,请知道的朋友帮忙指正一下。
服务器端使用Servlet来处理文件的导出,一般都是采用示例中提供的代码,基本上是不需要改动的,我把代码贴出来。
public class CreatePDF extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
int i = 0;
int k = 0;
int maxLength = req.getContentLength();
byte[] bytes = new byte[maxLength];
String method = req.getParameter("method");
String name = req.getParameter("name");
ServletInputStream si = req.getInputStream();
while (true) {
k = si.read(bytes, i, maxLength);
i += k;
if (k <= 0)
break;
}
if (bytes != null) {
ServletOutputStream stream = resp.getOutputStream();
resp.setContentType("application/pdf");
resp.setContentLength(bytes.length);
resp.setHeader("Content-Disposition", method + ";filename=" + name);
stream.write(bytes);
stream.flush();
stream.close();
} else {
resp.setContentType("text");
resp.getWriter().write("bytes is null");
}
}
}
记得要在web.xml文件里加上servlet配置
<servlet>
<servlet-name>createPDF</servlet-name>
<servlet-class>com.bolo.common.CreatePDF</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>createPDF</servlet-name>
<url-pattern>/createpdf</url-pattern>
</servlet-mapping>
OK,使用AlivePDF导出PDF文件讲完了,如果有什么不清楚的,或是我说的不对的地方,请大家提出来。谢谢。
本文为菠萝大象原创,如要转载请注明出处。
posted on 2010-03-01 13:13
菠萝大象 阅读(6920)
评论(23) 编辑 收藏 所属分类:
Flex