as3 pdf Reader,这是我最近在专注开发的一个开源工具库。目前Air支持动态加载pdf,但需要软件支持,使用flash是否可以加载pdf?从理论上说,使用as3解析pdf文件是可行的,不外乎分析二进制流,只不过pdf的结构要复杂一些。我有这个念头已经有一段时间了,打算花几个月的时间,实现一个类似Adobe Reader(当然功能要简单的多)的浏览器。
pdf文件的结构是一个环环相扣的树型结构,对于第一次研究文件结构的我来说,开始真被弄得很昏,好不容易才理清了中间的关系。查找资料的过程中,发现中文的资料比较少。Java、C#等有对应的开源库,看那些源代码真是件头疼的事。目前是照办了PDFBox的代码,从java搬到as,工程量很大,决非简单的重写。
解析pdf和生成pdf这件事逻辑上是可逆的,但实现起来难度却很大,我觉得读比写要困难,AlivePDF的代码对我的帮助有限。PDF文件格式标准到现在已经有多个版本,这无疑增加了解析的难度,其中文本、数据的编码方式也有很多。
不管怎样,作为自己开发的第一个有意义的开源工具库,希望能坚持下去。
开发进度: 目前已经完成了文件的二进制流解析部分,中间的过程不可谓不艰辛,但接下来的才是关键,也就是解析页面信息,分离出文字。再接下来,向更高难度挑战,包括解析图片、字体等等,道路还很曲折。
这是第一个Demo,读取了文件的基本信息:
[kml_flashembed movie="http://www.fluidea.cn/lab/pdfReader/Demo_Text.swf" height="380" width="480" /]
ps:pdf中,对文本一般采用flate编码方式压缩,刚好as3支持,省了一大笔事!!ByteArray的compress和uncompress默认使用的是zlib压缩方式,这个功能原来这么有用!最后,来一段压缩过的新年祝福: 78 DA 7B 36 6D C3 D3 9D 5B 9E EE 5F FD 64 E7 04 45 00 44 76 09 1C
var s:String = "78 DA 7B 36 6D C3 D3 9D 5B 9E EE 5F FD 64 E7 04 45 00 44 76 09 1C"; var stream:ByteArray= new ByteArray(); var arr:Array = s.split(" "); for (var i:int = 0; i < arr.length; i++) { stream.writeByte ( parseInt(arr[i], 16) ); } stream.uncompress(); trace(stream);
由于flash player的安全限制,可以将swf文件下载到本地运行。