android实现对PDF进行签名、涂鸦操作

在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

猜你喜欢

转载自blog.csdn.net/r_rito/article/details/52040427