当前位置:   article > 正文

android解密pdf居然也能报错?有没有搞错?_android com.itextpdf.awt.pdfgraphics2d : java.lang

android com.itextpdf.awt.pdfgraphics2d : java.lang.noclassdeffounderror: fai

背景介绍

之前接手了一个android项目。主要是对pdf资料进行管理。整个业务流程如下:无网络环境下,解压本地的zip压缩包,将打包的pdf进行解密,然后存储。

支持有网络的情况下,从服务端更新pdf文件,自然此处涉及一些逻辑处理,比如检查更新,pdf版本管理等。

至于pdf预览功能,使用第三方应用打开即可,在《作为一个java后端程序员,我是怎么接手android项目,并完成移动端的pdf处理需求的?》中我列出了处理过程中遇到的问题。

项目不大,主要功能就是这些,因为是传统企业,所以技术不太新,但业务逻辑特别复杂,且主要在web端。

此项目接手时,几乎已经开发完成,所以我只做了bug修复和一些操作流程上的优化,尽管对于部分处理方案并不满意,可已无能为力。没有多余的时间去修改。

由于android只是曾经在学校时接触过,所以这次修改bug和优化的工作并不是特别顺利,现在将处理过程中遇到的问题记录下来,方便以后查阅。
在这里插入图片描述

有一些问题在解决过程中,辗转多篇博客和技术资料才得以处理成功,也希望对遇到同样问题的朋友有所帮助。

问题1: 项目解密pdf时报错。

  • 问题2: 第三方pdf阅读器,不能对pdf添加注释,提示受保护的文件(处理方法,点此可查看)。
  • 问题3: 中英文切换功能,引发的纠结,怎么在app内部切换系统语言。
  • 问题4:
    混合开发,遇到的问题。点击页面,检查更新,js调用android,通过OkHttp访问后台,回调成功,不能在此时调用js中的方法,弹出有更新的弹框?
  • 问题5: 混合开发,样式不统一,重写toast展示的样式。

项目解密pdf时报错

主要错误信息:

Rejecting re-init on previously-failed class java.lang.Class<com.itextpdf.awt.PdfGraphics2D>: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/awt/Graphics2D;
        at void com.itextpdf.text.pdf.PdfWriter.<init>(com.itextpdf.text.pdf.PdfDocument, java.io.OutputStream) (PdfWriter.java:608)
        at void com.itextpdf.text.pdf.PdfStamperImp.<init>(com.itextpdf.text.pdf.PdfReader, java.io.OutputStream, char, boolean) (PdfStamperImp.java:165)
        at void com.itextpdf.text.pdf.PdfStamper.<init>(com.itextpdf.text.pdf.PdfReader, java.io.OutputStream) (PdfStamper.java:98)
    Caused by: java.lang.ClassNotFoundException: Didn't find class "java.awt.Graphics2D" on path: DexPathList[[zip file "/data/app/com.china-LB72OENoAUoDoiSc85yNSA==/base.apk"],nativeLibraryDirectories=[/data/app/com.china-LB72OENoAUoDoiSc85yNSA==/lib/arm64, /system/lib64, /product/lib64]]
        at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:134)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
        at void com.itextpdf.text.pdf.PdfWriter.<init>(com.itextpdf.text.pdf.PdfDocument, java.io.OutputStream) (PdfWriter.java:608)
        at void com.itextpdf.text.pdf.PdfStamperImp.<init>(com.itextpdf.text.pdf.PdfReader, java.io.OutputStream, char, boolean) (PdfStamperImp.java:165)
        at void com.itextpdf.text.pdf.PdfStamper.<init>(com.itextpdf.text.pdf.PdfReader, java.io.OutputStream) (PdfStamper.java:98)
        at void com.china.service.impl.BaseServiceImpl.updateTechInfo(java.io.File, android.content.Context) (BaseServiceImpl.java:434)
        at void com.china.CmisActivity$Vue.updateAndroidTechInfo() (CmisActivity.java:193)
        at void android.os.MessageQueue.nativePollOnce(long, int) (MessageQueue.java:-2)
        at android.os.Message android.os.MessageQueue.next() (MessageQueue.java:386)
        at void android.os.Looper.loop() (Looper.java:175)
        at void android.os.HandlerThread.run() (HandlerThread.java:65)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

初步判断,是使用的处理pdf的工具包有问题,因为之前负责的同事已离职,只能自己折腾,不过笔者猜测,这个问题应该一直存在,但几乎不影响使用,所以之前的开发人员也就没有处理。

按道理来讲,我也没有多余的时间来处理,而且几乎可以预见,此类问题处理起来也要耗费不少时间,毕竟android开发,只是我的栈外技术,并不擅长。

一开始,我是不打算处理这个问题的,但是后来发现,app初始化时解密pdf偶尔会失败,于是不得不处理。
在这里插入图片描述

不是我懒,真的是没时间来处理【汗颜】。

因为解密代码就那么两行,所以,如果不是引用的com.itextpdf.text.pdf这个工具包本身有问题,那就是我们用的有问题。

最后结果及解决方案。
itextpdf的jar分为android版本和java版本,因为android里面使用的java是不完整的。具体其中的区别,笔者并不是十分清楚。
所以是项目中用的itextjar版本不对,替换成android版之后,一切正常。

具体操作,删除原来的包引用,在gradle中添加:
在这里插入图片描述

至此问题解决。
最终解决问题的博客:
https://blog.csdn.net/nijian81/article/details/52948640

说来项目也是临时接手,对android不熟悉,所以排查问题和寻找解决方案,还是花了两三个小时。包括去itextpdf的官网下载jar包时,没弄明白他们github是怎么管理的,明明显示是安卓版,却又提示已停止维护,也是懵逼。

还好最后问题解决,不至于在代码里留下定时炸弹。松口气。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/319208?site
推荐阅读
相关标签
  

闽ICP备14008679号