在以前的apv中,字体占了很大的一部分,如果去除cjk字体,apk的体积也会少很多,的, 但其实很多字体android内部已经提供了. 接下来apv减少了体积,不用原始的修改配置加入cjk的方式也可以读中文的pdf文件了. 但是apv有一个限制,它的内存设置.当一个内存不够用的时候,pdf图片是无法解析的.于是我用了官方的mupdf,发现它是可以解析的,然后修改apv的内存大小.原来它是设置可用内存的1/2.比如堆大小是64mb,已经设置32mb了.但是通过日志发现它的申请内存是相当地大.然而ebookdroid也有此问题(不要歧视我的机器不够内存,只512mB). 这是个相当麻烦的事,经常阅读pdf文档,这是个问题,滚动几页,经常会出现内存不足的情况,但是在使用mupdf的时候不会有此问题,于是我就用了官方的mupdf的platform/android下的工程,但这个程序有一个问题就是不能连续读页面,要再自己写一个太麻烦了,修改了里面的ReaderView为垂直滚动,效果还是差一些,不能保持阅读的位置,缩放级别等. 想想就把apv里面的渲染方式拿过来了,结合两个程序,做了一个适合的pdf阅读器,阅读的速度不错,不会出现空白页面,内存不足无法解析的问题了.而且优化了apv的线程数量,使用Android的方式来处理线程间的通信. 并修改了apv的一些bug,记录了垂直滚动的位置,4.x以上的系统的位置记录问题. 说了这么多,其实没有代码.可以在 https://github.com/archko/Mupdf 中下载到修改的源码. 本来还想修改为vudroid的方式,但是这个比较复杂,没有研究透,所以也不添加了. mupdf的图片是Argb8888的,不知道和rgb565的对眼睛有什么不一样的效果.可能argb8888 显示效果好一些吧. 这次主要说字体,官方的mupdf用ndk编译的体积有些大.修改了字体后,使用apv的处理方式,体积只有1.6mB. 首先,从PDF中复制一些内容到MupdfCore中. private static Map<String,String> fontNameToFile = null; static{}部分. public static byte[] getFontData(String name) public static byte[] getDroidSansFallbackData() public static byte[] getCmapData(String name) public static byte[] getAssetBytes(String path) 这部分是供jni读取的. 复制 assets里面的cmap,font到mupdf对应目录. 复制apv/jni/mupdf-apv/pdf到mupdf/jni/mupdf-apv/pdf中.其实只需要两个文件 apv_pdf_cmap_table.c apv_pdf_fontfile.c 因为这两个文件是在mupdf/source/pdf/下的,所以pdf下的两个文件要去除.c后缀,因为mk文件是以*.c匹配的,删除总不好的. 对这两个文件里面的cx/....修改了mupdfcore的路径就可以了.然后在mupdf.c文件中添加 static JavaVM *cached_jvm = NULL; JavaVM *apv_get_cached_jvm() { return cached_jvm; } JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { LOGI("JNI_OnLoad,%p", jvm); cached_jvm = jvm; return JNI_VERSION_1_4; } 这里我新建了一个amupdf.c在mk里面替换原来的mupdf.c文件编译. 工程所有源码,都在github上可以下载到.有一个编译好的apk文件. 现在的mupdf.apk默认打开文件是apv的方式,就是连续滚动的,但是还保留了,原来的方式,只是左右滚动的. 还有textflow修改了为垂直滚动的,这是个不错的东西,如果pdf里不是图片,字体又太小了,可以用这个查看,可缩放字体的,基于webview展示的.图片是不错的,有些英文文档,字体比较小,这是个不错的选择.只是在垂直滚动时,还有些bug.页面交换过渡不好. 如果是屏幕不好的机器,触摸时,一直左右晃动,可以打开设置里面的垂直锁定,这样,左右拖动要比较大距离才会发生.