赞
踩
之前接手了一个android项目。主要是对pdf资料进行管理。整个业务流程如下:无网络环境下,解压本地的zip压缩包,将打包的pdf进行解密,然后存储。
支持有网络的情况下,从服务端更新pdf文件,自然此处涉及一些逻辑处理,比如检查更新,pdf版本管理等。
至于pdf预览功能,使用第三方应用打开即可,在《作为一个java后端程序员,我是怎么接手android项目,并完成移动端的pdf处理需求的?》中我列出了处理过程中遇到的问题。
项目不大,主要功能就是这些,因为是传统企业,所以技术不太新,但业务逻辑特别复杂,且主要在web端。
此项目接手时,几乎已经开发完成,所以我只做了bug修复和一些操作流程上的优化,尽管对于部分处理方案并不满意,可已无能为力。没有多余的时间去修改。
由于android只是曾经在学校时接触过,所以这次修改bug和优化的工作并不是特别顺利,现在将处理过程中遇到的问题记录下来,方便以后查阅。
有一些问题在解决过程中,辗转多篇博客和技术资料才得以处理成功,也希望对遇到同样问题的朋友有所帮助。
问题1: 项目解密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)
初步判断,是使用的处理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是怎么管理的,明明显示是安卓版,却又提示已停止维护,也是懵逼。
还好最后问题解决,不至于在代码里留下定时炸弹。松口气。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。