为了深入实现PDF转成SWF后的关键字高亮显示的问题,我需要解析PDFToFlex源文件,已经看到Flex 的新类:flash.net.URLStream 和 flash.utils.endian,我会全面学习我遇到的新类的。本来当天晚上就准备把分析的成果与大家分享的,后来忙别的,就没有写博客,所以之后看过我这篇随笔的网友可能会很郁闷“干嘛说写不写,不忽悠人行不?!”
首先说,加载SWF使用的loader对象,为啥不使用SWFLoader对象?详细看到前篇我转载的Igor Costa的文章就知道了“After that you might be think it’s simple we can load it using SWFLoader, but you will have problems to control and Flex will understand that this file is just as asset not as a component. To work with that, you have various options like, Loader, ByteLoader, ModuleLoader and BulkLoader. ”翻译过来大意为:SWFLoader是简单方便使用,但是SWF文件被加载进来是被作为元件使用而不是组件,这就很难对SWF内部进行操作。为了解决操作SWF的问题,可以使用 Loader, ByteLoader, ModuleLoader and BulkLoader。SWFLoader加载进的SWF或图片是作为一个整体使用的。
其次,开始解析类ForcibleLoader.as,这个类主要是URLStream以ByteArray形式加载SWF,进行解压出来,并进行解析SWF版本,针对不同的Flash版本绘制问题而进行必要的Byte级别的修改。Igor Costa的原话为“ but what about Flex to control from Flash 5,6,7,8, both have their own way of render and work.To accomplished that I googled a little, because I knew it that some one should have fight this problem before and for lucky I found this class that kick ass problem. ”结合该类的功能,就不难看懂代码啦。
1.flash.net.URLStream,URLStream类提供对下载 URL 的低级访问。数据一下载,便可随即为应用程序使用,这和使用 URLLoader 时需要等到整个文件下载完不同。并且URLStream类还允许在完成下载前关闭流。已下载文件的内容将作为原始二进制数据提供。在URLStream中的读取操作是非阻塞模式的。这意味着您在读取数据之前必须使用 bytesAvailable
属性来确定是否能够获得足够的数据。如果不能获得足够的数据,将引发 EOFError
异常。Endian属性,在默认情况下,所有二进制数据都是以 Big-endian 格式编码的,并且最高位字节于第一位。
“ var inputBytes:ByteArray = new ByteArray(); _stream.readBytes(inputBytes); _stream.close(); ” readBytes()方法:这些字节会被读取到由 bytes
指定的 ByteArray 对象中。
2.flash.utils.Endian,也是我没见过的,这类很简单,充当枚举数组的作用,由于它继承自Object,它就具备了一些基本方法和属性。它自身的常量有两个:BIG_ENDIAN: String = "bigEndian"指示多字节数字的最高有效字节位于字节序列的最前面;LITTLE_ENDIAN : String = "littleEndian" 指示多字节数字的最低有效字节位于字节序列的最前面。“inputBytes.endian = Endian.LITTLE_ENDIAN;”一句话,就是调节ByteArray中字节序列的。ByteArray中默认以 Big-endian 格式编码的,并且最高位字节于第一位。
3.isCompressed()方法读取inputBytes的首位,判断转换出的SWF是否是压缩格式。uncompress(bytes:ByteArray)解压SWF,其中用到ByteArray中的writeBytes、uncompress方法。uncompress方法采用了FlashPlayer默认zlib算法。