android实现对PDF进行签名、涂鸦操作
来源:互联网 发布:Ubuntu chrome设置中文 编辑:程序博客网 时间:2024/05/18 12:29
在android项目开发过程中,项目需要android客户端完成对PDF文件的涂鸦、签名操作,其中最重要的就是手写签名了,可以当做是凭证一类的东西。在网上只能找到一个例子,然而做的不是很完善(地址下面给出),在他的基础上,我将它变得更加完美了,加入了放大后在指定位置签名的功能,并且签名位置不会有任何偏移。
效果图如下:
正常浏览PDF:
没有放大情况下的签名(左为打开签名版签名,右为保存后重新打开的PDF)
放大到指定位置进行签名(左为放大到指定位置并打开签名版签名,右为保存后重新打开的PDF)
实现步骤:
1. 首先是打开PDF文件,我使用的是mupdf第三方库来解析PDF文件,使用方法是在网上下载了mupdf库文件 libmupdf.so 后导入项目,并建立一个包名为com.artifex.mupdf的包。(切记包名的目录结构必须和图中一致....第一次使用SO,踩了坑,希望别的小白不要踩吧~)
打开PDF,需要PDF的地址,并创建一个MuPdfCore ,用于解析PDF:
MuPdfCore core = new MuPdfCore(path);
解析完后,需要将它传递给ReaderView 将它显示出来,ReaderView类似ListView,使用MuPdfPageAdapter设置他的适配器即可
ReaderView.setAdapter(new MuPDFPageAdapter(context, core));
配置完成后即可正常的阅读PDF文件啦~
这里有几个坑,不知道是他的库有问题还是我不会用....
1.打开PDF的时候,第一页可能会压缩变形
解决方法:在打开后,强制让他定位到第一页
readerView.setDisplayedViewIndex(index);
2.保存后,更改core既可以替换readerView的内容,然而直接改变core还会出现各种奇怪的事情,比如:1.出现重复页的现象(然而重新打开不会出现,而且原PDF文件也没有多出的那页)
更改Core的做法:core = new MuPdfCore(path);//////这样做就可以显示出新设置的PDF了
解决方法:重新为ReaderView设置Adapter
readerView.setAdapter(new MupdfAdapter(context,core));
2. 打开PDF后,就要开始签名啦,签名版在参考的那篇博客里写的很好,这里就不重新说明啦;
签名完成后,生成相应的Bitmap,这时候就需要将bitmap加到PDF上,对PDF操作需要用到第三方JAR包droidText0.5.jar,导入即可使用;
具体使用方法:
PdfReader reader = new PdfReader(inPath, "PDF".getBytes());///打开要写入的PDFFileOutputStream outputStream = new FileOutputStream(outPath);//设置写入后PDF的位置PdfStamper stamp;stamp = new PdfStamper(reader, outputStream);PdfContentByte over = stamp.getOverContent(pageNum);//////用于设置在第几页打印签名byte[] bytes = Bitmap2Bytes(bitmap); ///将Bitmap转换为byte[]Image img = Image.getInstance(bytes);//生成Image,注意是PDF库里面的Imagecom.lowagie.text.Rectangle rectangle = reader.getPageSize(pageNum);////得到PDF pageNum页的大小img.setAlignment(1);///////这里是重点!!!!!设置Image图片大小,需要根据屏幕的分辨率,签名时PDF的放大比例来计算;img.scaleAbsolute(363 * 1.0f * density / 2 / scale * rectangle.getWidth() / (bitmap.getWidth() / 2),557 * 1.0f * density / 2 / scale * rectangle.getWidth() / (bitmap.getWidth() / 2));//这里设置image相对PDF左下角的偏移量,我的做法是得到放大后位置相对于整个PDF的百分比再乘PDF的大小得到他的相对偏移位置。img.setAbsolutePosition(rectangle.getWidth()*widthScale,rectangle.getHeight()*heightScale);over.addImage(img);stamp.close();
还存在的问题,希望各位有不懂或有疑问的可以留言探讨:
1.打开PDF时,第一页变形问题
2.保存后再打开有时会出现重复页的问题
3.签名次数变多之后,打开PDF速度变慢
4.在打开的时候,当还在缓冲PDF时,不可以重新加载PDF
5.保存后,重新打开会出现乱序现象,然而PDF文件没有乱序;(不过更新Adapter后就没有乱序)
6.之前实现了放大后还保持清晰的,最近又不行了,不知为何
务必看下使用说明!!!
代码:https://github.com/JammyR/PDF_Demo/tree/master
参考资料:http://blog.csdn.net/acrambler/article/details/17377527
- android实现对PDF进行签名、涂鸦操作
- 利用iTextSharp对PDF进行签名
- 利用iTextSharp对PDF进行签名
- 如何对pdf电子文档进行手写签名
- Android 对APK进行系统签名
- Android实践 -- 对apk进行系统签名
- 如何对Android应用进行签名
- 对 Android 应用程序包进行签名
- Android实现涂鸦功能
- android涂鸦实现
- Android涂鸦的实现
- Android 用signkey.jks签名文件对 Apk 进行签名
- 利用iTextSharp对PDF进行签名(E-signing PDF documents with iTextSharp)--推荐
- android 实现一个ContentProvider对多张表进行操作
- 对apk进行签名
- 对空包进行签名
- 自学Android历程->对Android应用APK包进行签名
- 无法对jar进行签名,Android jarsigner问题
- AndroidStudio 使用心得
- HTML 第一天-基础知识
- UI基础_自定义非等高Cell_storyboard封装_版本_有GIF_源代码
- Python案例-网络编程-I/O多路复用-select方法用例
- HDU 1251-统计难题
- android实现对PDF进行签名、涂鸦操作
- cookie与session详解
- LeetCode--Majority Element II & 多数投票算法
- size_t类型
- java 学习笔记2
- Android开发中如何结束所有的activity
- HDU Problem 1873 看病要排队 【优先队列】
- select函数详细解读
- python flask request params