当前位置: 首页 > article >正文

android pdf框架

系列文章目录

第一章 android pdf框架

文章目录

  • 系列文章目录
  • 前言
  • 一、主流pdf解析库有哪些
  • 二、对比与使用
    • 1.库对比
    • 2.使用方式
  • 总结


前言

pdf已经使用很普遍了,android上的好用的pdf工具也有不少,个人更经常是用于阅读,很少标记,所以有一个适合的阅读器对我来说非常重要了.

我需要记录阅读历史,收藏优质的图书,pdf文件浏览器,在不同的手机上需要同步数据(不通过服务器,可以导出内容),可以自动切边.

自己写一个阅读器是不是太闲了,市面上有静读天下,ebookdroid都是非常优秀的阅读器,只不过对于来说,需求没匹配上,因为我读了几百上千本书,还有很多没有读的,需要一个好的文件浏览器,ebookdroid本来是很好的,但滚动上有问题,横竖切换有bug一直没有更新了.静读天下是基于pdfmaster,有些pdf的中文显示不了.


提示:以下是本篇文章正文内容,下面案例可供参考

一、主流的pdf解析库有哪些

pdfium/福昕sdk,自谷歌买了以后,pdfium开源了,不少基于它的库,支持多平台.

mupdf,这是非常不错的解析库,开源,而且它还支持xps,epub,mobi,svg等,也支持导出文本时带上base编码的图片,pdfium只支持导出文本.多平台.(近期的授权似乎开始变了)

xpdf,移动端没有看到有适配.

itext,自4.0以后就不免费用了,需要授权(除非你的app也开源),支持多平台,功能完善,文档齐全,就是不便宜.

openpdf,在4.0的itext上fork的

pdfbox,apache上纯java实现的库,速度不太理想.

二、有哪些优缺点

1.库对比

体积页面渲染速度渲染效果使用难度github数量示例
android系统21带的简单无法查询简单
pdfium64位的4.6mb简单repo:431有开源项目
mupdf64位的7.6mb非常快非常好简单repo:527有官方示例

itext主要用于处理pdf文件,在这就不列出功能了.其它库不作介绍,目前android上解析上的使用量就是pdfium,mupdf两个为主.

实际使用中发现,pdfium这个库的显示与mupdf相比还是要差一些,扫描版与非扫描版本都是如此,可能是我写的有问题.

 

针对不同的pdf进行不同的测试,页面渲染速度取平均值,还是mupdf快几毫秒.

2.使用方式:

android系统带的,对系统版本有限制,必须在21以后.

ParcelFileDescriptor parcel = ParcelFileDescriptor.open(new File(path), ParcelFileDescriptor.MODE_READ_ONLY);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            PdfRenderer pdfRenderer = new PdfRenderer(parcel);

            PdfRenderer.Page page = pdfRenderer.openPage(index);
            float scale = 1.0f * width / page.getWidth();
            int nHeight = (int) (page.getHeight() * scale);
            Bitmap bitmap = Bitmap.createBitmap(
                    width,
                    nHeight,
                    Bitmap.Config.ARGB_8888
            );

            Log.d("PDFSDK", String.format("android width:%s, rootView.getHeight:%s, nHeight:%s,scale:%s, size:%s", width, height, nHeight, scale, page));
            page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
            BitmapUtils.saveBitmap(bitmap, "pdfium.jpg");
            pdfRenderer.close();
        }

2.pdfium自己编译的so,我使用的是基于

https://github.com/barteksc/PdfiumAndroid的jni
ParcelFileDescriptor parcel = ParcelFileDescriptor.open(new File(path), ParcelFileDescriptor.MODE_READ_ONLY);
        PdfiumSDK sdk = new PdfiumSDK();
        sdk.newDocument(parcel);

        sdk.openPage(index);
        Size size = sdk.getPageSize(index);
        float scale = 1.0f * width / size.getWidth();
        int nHeight = (int) (size.getHeight() * scale);
        Bitmap bitmap = Bitmap.createBitmap(
                width,
                nHeight,
                Bitmap.Config.ARGB_8888
        );

        Log.d("PDFSDK", String.format("pdfium width:%s, rootView.getHeight:%s, nHeight:%s,scale:%s, size:%s", width, height, nHeight, scale, size));
        sdk.renderPageBitmap(bitmap, index, 0, 0, bitmap.getWidth(), bitmap.getHeight(), false);
        BitmapUtils.saveBitmap(bitmap, "pdfium.jpg");
        sdk.closeDocument();

mupdf,基于https://git.ghostscript.com/?p=mupdf.git;a=summary

自己编译的

Document document = Document.openDocument(path);
        Page page = document.loadPage(index);

        float scale = 1.0f * width / (page.getBounds().x1 - page.getBounds().x0);
        int nHeight = (int) (scale * page.getBounds().y1 - page.getBounds().y0);
        com.artifex.mupdf.fitz.Matrix ctm = new com.artifex.mupdf.fitz.Matrix(scale);
        Bitmap bitmap = Bitmap.createBitmap(width, nHeight, Bitmap.Config.ARGB_8888);

        Log.d("PDFSDK", String.format("mupdf.width:%s, rootView.getHeight:%s, nHeight:%s,scale:%s, size:%s,ctm:%s", width, height, nHeight, scale, page.getBounds(), ctm));

        AndroidDrawDevice dev = new AndroidDrawDevice(bitmap, 0, 0, 0, 0, bitmap.getWidth(), bitmap.getHeight());

        page.run(dev, ctm, (Cookie) null);
        dev.close();
        dev.destroy();

        BitmapUtils.saveBitmap(bitmap, "mupdf.jpg");
        document.destroy();

由于字体的问题,非扫描版不同的库显示的效果是不一样的.

3.知名开源阅读器

基于pdfium的:barteksc/PdfiumAndroid,目前不维护了,但使用非常广泛.

基于mupdf的:官方的简单阅读器,ebookdroid已经有一段时间没有更新了,只有英文版了.

GitHub - archko/amupdf-android

这是我自己基于开源库修改的阅读器

 


总结

集成到现有的app中,会考虑体积,系统支持度,使用难易程度,功能等.

如果是21以上的,可以考虑使用系统的api,但不可定制.

21以下也需要支持的话,可以考虑pdfium与mupdf,mupdf如果去除额外文字支持,包也可以减少,但比较复杂.pdfium有体积方面的优势.mupdf不是只定位于pdf解析库,已经延伸到其它的解析了.


http://www.kler.cn/a/17806.html

相关文章:

  • 大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)
  • 代码随想录第二十一天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
  • 量化交易系统开发-实时行情自动化交易-3.4.1.2.A股交易数据
  • 前端:块级元素和行内元素
  • 《新智慧》期刊的征稿范围主要包括哪些方面?
  • 深入理解接口测试:实用指南与最佳实践5.0(三)
  • unity航点寻径
  • js中对象和数组的都是如何解构的
  • 二挡起步——pythonweb开发Django框架,前端原生+Django后端框架+python网络抓包(代替数据库数据)(附带小案例)
  • Java学习之Swing图形界面
  • 关于面试官问Qt Connect的链接方式和类型问题
  • jQuery -- 常用API(下)
  • 《Netty》从零开始学netty源码(五十二)之PoolThreadCache
  • SpringBoot整合FreeMarker
  • 使用zabbix监控Windows指定服务| zabbix Windows service filter
  • 【网络】4万字细品TCP协议
  • yolov8 OpenCV DNN 部署 推理报错
  • 科大版中国版ChatGPT来啦!抢先体验
  • 还能这么玩?清华给 ChatGPT 做逆向,发现了 ChatGPT 的进化轨迹!
  • 记一次产线打印json导致的redis连接超时
  • 【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效
  • MySQL高频面试题
  • 多通道振弦传感器无线采集仪通过短信和FTP文件修改参数
  • 设计原则之【接口隔离原则】
  • 22.Java多线程
  • SpreadJS 16.1 EN + SpreadJS 16.1 CN Crack