在Flex中使用AlivePDF导出PDF实例详解

在Flex中使用AlivePDF导出PDF实例详解
    在前一篇"使用Flex开发时空线形图实例详解"中,我们得到了一张时空线形图报表,本文将说明如何使用AlivePDF导出PDF文件。
    AlivePDF是一个用ActionScript 3写的开源PDF开发包。它有很全的文档和示例资料,很容易上手和学习。现在已经发布 0.1.5 最新版本目前在Flex中导出PDF,大多数都采用它来实现。
    官方网站:
http://alivepdf.bytearray.org/
    大象当时开发的时候采用的是 0.1.4 .9版本。AlivePDF给我们提供了一套模板化的导出方法,使用起来非常方便。

//canvasid,这是获得整个画布内容的快照,返回的是一个位图
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文件讲完了,如果有什么不清楚的,或是我说的不对的地方,请大家提出来。谢谢。
    
本文为菠萝大象原创,如要转载请注明出处。

你可能感兴趣的:(在Flex中使用AlivePDF导出PDF实例详解)