在android项目开发过程中,项目需要android客户端完成对PDF文件的涂鸦、签名操作,其中最重要的就是手写签名了,可以当做是凭证一类的东西。在网上只能找到一个例子,然而做的不是很完善(地址下面给出),在他的基础上,我将它变得更加完美了,加入了放大后在指定位置签名的功能,并且签名位置不会有任何偏移。


效果图如下:

正常浏览PDF:

android实现对PDF进行签名、涂鸦操作_第1张图片

没有放大情况下的签名(左为打开签名版签名,右为保存后重新打开的PDF)

android实现对PDF进行签名、涂鸦操作_第2张图片          android实现对PDF进行签名、涂鸦操作_第3张图片

放大到指定位置进行签名(左为放大到指定位置并打开签名版签名,右为保存后重新打开的PDF)

android实现对PDF进行签名、涂鸦操作_第4张图片          android实现对PDF进行签名、涂鸦操作_第5张图片



实现步骤:

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

更多相关文章

  1. Android与.Net交互模拟用户屏幕操作添加APN和网络4G/3G切换
  2. Android 根据所给的图片位置获得Thumbnail
  3. android银行卡操作步骤
  4. Android manifest 的位置千万别放错
  5. Android RecyclerView StaggeredGridLayoutManager瀑布流item位
  6. android手势操作滑动效果触摸屏事件处理、GestureDetector用法
  7. Android 倒计时操作

随机推荐

  1. Android(安卓)通过Intent简单实现分享功
  2. opengl fbo 离屏渲染
  3. Android(安卓)发布release版本的apk软件
  4. Android应用资源全面分析之三:Drawable资
  5. 预习数据存储5种方式
  6. Android(安卓)7.0 增加以太网设置DHCP和
  7. android 编程小技巧(持续中)
  8. Android仿QQ侧滑菜单
  9. 为你的Android(安卓)App实现自签名的 SSL
  10. android 6.0 Launcher3 去掉抽屉式,显示