随笔-67  评论-522  文章-0  trackbacks-0
    在前一篇"使用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文件讲完了,如果有什么不清楚的,或是我说的不对的地方,请大家提出来。谢谢。
    
本文为菠萝大象原创,如要转载请注明出处。
posted on 2010-03-01 13:13 菠萝大象 阅读(6927) 评论(23)  编辑  收藏 所属分类: Flex

评论:
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-04-16 17:30 | leke_斌
你好 请问你知道Flex中怎么保存为word或ppt文件么,现在保存word我是这样做的,在flex中发送请求及传递参数,后台处理数据并转至servlet导出,但不知flex是点击按钮后是怎么一种方式请求,用HTTPService请求  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-04-16 22:39 | 菠萝大象
@leke_斌
对于你的问题我有点看不明白。你是想导出word或ppt格式的文件?还是想弄清楚请求方式?你好像又说,你现在已经实现了这部分的功能。真的不知道你的问题是什么。  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-04-19 15:55 | leke_斌
不好意思,我表达的不清楚,是这样的,我需要实现以下在flex中导出内容至WORD、PDF、PPT功能,其中我已经实现了WORD,想请问你触发什么条件导出PDF,然后你这有没有导出PPT的例子  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-04-19 21:42 | 菠萝大象
@leke_斌
导出PDF就是用这个SWC库,这肯定需要一个事件来触发了。我用的是click事件。代码就是我写的这些,把它们放到事件回调函数里面就可以了。目前我只做过PDF的导出,还没做过PPT的导出。另外请问下,你的WORD导出是怎么实现的?最后补充一下,年后换了一家公司,目前没有继续搞FLEX开发了,我其实对FLEX没有太深的研究,希望我目前知道的东西对你有帮助,也请分享一下成功的经验,互相学习。  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-04-20 09:03 | leke_斌
非常不好意思,再次打扰你。word导出也是和你的处理方式一样,在flex中触发添加事件,请求至后台java,采用控件jacob来实现功能。现在我导出pdf遇到点问题, req.getContentLength();得到值为-1,根据我的判断,有两种可能性,一是flex端jar程序我没有全部导全,二是sevlet操作代码修改。
我现在使用的是AlivePDF0.1.5,只使用了org/alivepdf的内容,不知是否正常,你有遇到内容为-1问题么  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-04-20 11:39 | leke_斌
现在可以导出PDF,郁闷,问题在于第一次请求sevlet时req.getContentLength有值,而根据电脑的一些设置点击"是否下载文件"对话框时文件自动关联迅雷,则第二次请求则为-1值,下载不出来  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-04-20 12:46 | 菠萝大象
@leke_斌
这个导出还跟浏览器有关,我在IE7上面测试过,因为安全级别的问题,点导出会没反应,而IE6就没问题。至于你说的关联迅雷后,第二次点击出现的-1情况我没有测试过呢!按理说,应该是同一个请求。没有这个环境实在不好说。在flex里面用调试工具测试一下吧,第二次请求时,bitmap是否为null  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-07-18 21:02 | junlin
你好,你这里有alivepdf生成的pdf吗?我想看看打印的效果。  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-07-19 08:54 | 菠萝大象
@junlin
这位同学,我怎样让你看到打印效果?其实在前一篇的时空线性图里面,我截取的几张图片就是打印后的效果,里面还有打印及预览导出等等功能,导出后的PDF和图片显示是一样的。就是要注意你的Size对象设置参数,这会影响你最终的打印效果。  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-08-14 09:55 | junlin
@leke_斌
你好,alivePdf打印的问题解决了吗?sevlet时req.getContentLength的值为什么总是-1呢?  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-08-14 10:45 | junlin
@菠萝大象
你好,我使用pdf的 save方法传到servlet接收到的总是req.getContentLength的值是-1,(我是向java后台传的)
你有alivepdf例子吗,发我一份好吧,
在向servlet提交的时候浏览器的url能发给我看看吗?
谢谢!
另外,您有qq吗?想加您为好友  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-08-15 17:00 | 菠萝大象
@junlin
传给servlet的URL地址我已经在文章中的写出了,就是save方法中的那个,你应该调试下FLEX代码,你能确定要打印的东西真的截取到了么?bitmap是否为null?  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-08-15 18:53 | junlin
@菠萝大象


呵呵 ,感谢回复。

是这样的,我指的url是提交之后弹出的页面的url

我的弹出页面url是:http://127.0.0.1:8088/auditfms/print.do?name=print.pdf&method=inline?%PDF-1.51%200%20obj<</Type%20/Pages/Kids%20[3%200%20R]/Count%201>>endobj3%200%20obj<</Type%20/Page/Parent%201%200%20R/MediaBox%20[0%200%20841.89%20595.28]/Resources%202%200%20R/Rotate%200/Contents%204%200%20R>>endobj4%200%20obj<</Length%20108>>streamBT%20/F1%209.00%20Tf%20ET/GS0%20gs1.000%200.000%200.000%201.000%200.000%200.000%20cmq%2074.00%200%200%2052.00%2028.35%20514.93%20cm/I1%20Do%20Qendstreamendobj5%200%20obj<</Type%20/OCG%20/Name%20(print)/Usage%20<</Print%20<</PrintState%20/ON>>%20/View%20<</ViewState%20/OFF>>>>>>endobj6%200%20obj<</Type%20/OCG%20/Name%20(view)/Usage%20<</Print%20<</PrintState%20/OFF>>%20/View%20<</ViewState%20/ON>>>>>>endobj7%200%20obj<</Type%20/ExtGState/BM%20/Normal/ca%201/n%207/SA%20true/CA%201>>endobj8%200%20obj<</Type%20/Font/BaseFont%20/Helvetica/Subtype%20/Type1/Encoding%20/WinAnsiEncoding>>endobj9%200%20obj<</Type%20/XObject/Subtype%20/Image/Width%2074/Height%2052/ColorSpace%20/DeviceRGB/BitsPerComponent%208/Filter%20/FlateDecode/DecodeParms%20<</Predictor%2015%20/Colors%203%20/BitsPerComponent%208%20/Columns%2074>>/Length%201006>>streamx陧榹HSa瓶/Z濂以(?诓??2?$*?慇Ks^?琇思0Sgj谂靆t肒7o婮M訰粻i锻归苕?%層皂?阷伢撬?缳{蝟l阚誮u?劷?€b貍)憷q:p?P$W惠S吂宷? ;H<N缓F

是这些内容。

调试多次,确实bitMap是有的,不是null.


  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-08-16 08:52 | 菠萝大象
@junlin
现在我没这个环境重试我的这个应用了,但我当时做的时候,是没有这么长的URL的,点击导出后,直接弹出下载的窗口,你这种情况真奇怪啊。加我QQ9174265,我们讨论一下,不过我先说好,我不是专业做FLEX的,以前项目中有用到,这样才学了些,不能帮你解决问题请不要见怪  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-09-16 16:30 | 可以用ASP.NET导出
AlivePDF+FLex+ASP.NET 可以用ASP.NET导出吗?  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-09-16 16:53 | 菠萝大象
@可以用ASP.NET导出
呃。。。这个我不清楚,大象一直做的都是Java开发,对.Net不熟,对不住啊!  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解[未登录] 2010-09-17 11:46 | jack
哈哈我用AlivePDF+java可以到处,但是到了ASP.NET中死活获取不到流。  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-11-24 10:31 | 小房
@leke_斌
你好!你的打印word格式的方法能够分享下吗?
谢谢!  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2010-11-24 15:01 | 菠萝大象
@小房
你好,我没做打印word,当时的需求只是导出为pdf,后来换了工作,这部分就移交出去了,抱歉,我帮不了你。  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2011-02-11 11:38 | lyric、
请问大家中文问题解决了吗?  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2011-02-11 11:38 | lyric、
请问中文问题解决了吗?  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2015-12-23 17:23 | 孤帆
您好,我希望能利用alivepdf生成pdf,并利用flash的打印功能打印文件
1.pdf可以保存在本地,也可不保存
2.服务器用的是jasperreport所以支持很多格式(pdf、xml)的输出
请问,客户端flash怎么样才能实现  回复  更多评论
  
# re: 在Flex中使用AlivePDF导出PDF实例详解 2015-12-25 09:58 | 菠萝大象
@孤帆
你的问题和AlivePDF没什么关系吧,你这是怎么实现你的功能的问题。另外我从2010年开始就没再搞FLEX了,现在差不多都忘光了。^_^  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: