在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());///打开要写入的PDF
FileOutputStream 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库里面的Image
com.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进行签名、涂鸦操作相关推荐

  1. Java实现对PDF文件添加水印

    Java实现对PDF文件添加水印 目录 Java实现对PDF文件添加水印 导入依赖 工具方法 效果 最近项目中遇到对PDF添加水印,实现有多种,采取的是itextpdf 导入依赖 <!-- 对P ...

  2. java实现对pdf文件压缩,拆分,修改水印,添加水印

    最近要实现一个文件上传,并且在线预览上传文件的功能,设计思路是:把上传的文件通过openoffice转成pdf文件,并将pdf文件以流的形式返回到浏览器,由于上传的部分文件过大,转成pdf后传回前端浏 ...

  3. java字符串字典排序_java实现对map的字典序排序操作示例

    本文实例讲述了java实现对map的字典序排序操作.分享给大家供大家参考,具体如下: java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t ...

  4. java poi读取word中附件_java用poi实现对word读取和修改操作

    java编程要实现对word的操作没有vb那种编程语言来得容易,得借助一些开源组件,其中就包括jacob.poi等, 而poi应用得最为广泛,对word2003和2007的读和写word操作都十分方便 ...

  5. java用poi实现对word读取和修改操作

    java编程要实现对word的操作没有vb那种编程语言来得容易,得借助一些开源组件,其中就包括jacob.poi等, 而poi应用得最为广泛,对word2003和2007的读和写word操作都十分方便 ...

  6. java代码实现对pdf文件文本和图片内容的提取

    教程 pom文件引入jar依赖 <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><depend ...

  7. python如何操作ppt_Python实现对PPT文件进行截图操作的方法

    本文实例讲述了Python实现对PPT文件进行截图操作的方法.分享给大家供大家参考.具体分析如下: 下面的代码可以为powerpoint文件ppt进行截图,可以指定要截取的幻灯片页面,需要本机安装了p ...

  8. python编辑ppt图片_Python实现对PPT文件进行截图操作的方法

    本文实例讲述了Python实现对PPT文件进行截图操作的方法.分享给大家供大家参考.具体分析如下: 下面的代码可以为powerpoint文件ppt进行截图,可以指定要截取的幻灯片页面,需要本机安装了p ...

  9. 字典序 java_java实现对map的字典序排序操作示例

    本文实例讲述了java实现对map的字典序排序操作.分享给大家供大家参考,具体如下: java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t ...

最新文章

  1. 待办事项优先级 开发_如何通过创建主题待办事项确定学习内容的优先级
  2. weblogic在linux服务器上部署应用
  3. python解释器在语法上不支持 编程方式-python解释器在语法上不支持什么编程方式_后端开发...
  4. shell编程之特殊变量
  5. base64编码_几分钟看懂Base64编码原理
  6. jmeter生成优美的压力测试报告,jmeter生成html压测报告,jmeter压力测试
  7. 90 % 的 Python 开发者不知道的描述符应用
  8. uniapp h5页面 在移动端 使用clipboardone.js插件实现 写入剪切板 -- 安卓和ios安美适配(仅测试部分机型)
  9. 网易云音乐测开面试题整理
  10. 在anaconda中安装tensorflow-GPU版本
  11. linux系统shell知识点,linux shell 知识点
  12. l4 l7 代理_什么是四层(L4 proxy)和七层负载均衡(L7 proxy)?区别是什么? 翻译自Nginx官网...
  13. Exception: SQLSTATE[22001]
  14. adobe黑体std能商用_adobe黑体std字体下载
  15. android 100以内的随机数
  16. 计算机右键菜单太多,鼠标右键菜单选项太多?教你清理多余菜单选项的方法-win7右键菜单管理...
  17. mysql varchar 不设长度_Mysql varchar长度问题
  18. 微信小程序获得二维码
  19. mysql条件计数_Mysql按条件计数多种实现方法详解
  20. 利用python计算个人所得税

热门文章

  1. Archlinuxarm / AUR的国内镜像源(for Banana Pi / Raspberry Pi , etc)(更新)
  2. 清除缓存-Ctrl+Shift+Delete
  3. 抢先看:iPhone5整机完整亮相
  4. 群晖NAS DSM7.0系统安装qBittorrent和transmission套件教程
  5. 直播预告|ICML专场最后一场啦!来蹲守直播间呀
  6. Axi协议和verilog实现1-AXI总线和关键问题描述
  7. c#中https通讯如何添加证书
  8. MCE公司:肺癌治疗新希望——HSP90 抑制剂
  9. project2016专业版最新密钥和下载
  10. High-Resolution Net(HRNet) 论文笔记