Android手写签批功能实现(适配Android6.0及以上)

 Android手写签批功能的实现在于三个点,mupdf,偏移量的计算,droidText0.5.jar
实际步骤:

  1. 使用muPdf将PDF加载出来
  2. 弹出透明的popwindow,popWindow使用画板(一般签批我们都会用有笔锋的钢笔或者毛笔)
  3. 将签批好的图片生成Bitmap
  4. 将该Bitmap通过droidText生成一份新的PDF(这一步放到异步中进行,因为耗时)

mupdf

 我们使用MUPdf来加载PDF,这里不一定要用MUPDF,也可以按照自己的想法来使用其他的,mupdf在Android6.0以上的机型上会出现一个问题libmupdf.so: has text relocations,当我们将targetSdkVersion改成23以下即可,但是这不是我们真正的解决办法,真正的解决办法是重新编译mupdf,这里我们可以参考如何在Android6.0及以上嵌入MuPdf
 根据这篇文章编译出自己想要的so文件,然后直接用就可以了,这里一定要注意:

  1. 在创建new MuPDFCore(path);对象的时候一定要去动态获取权限,不然就会一直报打不开文件,或者找不到文件,这里不会提示权限问题(我是没看见日志提示我是权限的问题)
  2. 因为按照文章来编译的包名是com.artifex.mupdfdemo,所以我们要使用MuPDFCore的时候需要一样的包名结构,这里我们在编译so文件的时候可以去更改他的包名(不想改包名就直接按照他所说的将包名目录全部拷过去)

偏移量的计算

 在PDF签批的时候我们经常遇到一个问题,就是签出的文字不在我们之前签的位置(一般是出在放大或者缩小的时候再签批时),这就是要计算一个偏移量了

//宽度偏移量
float  widthScale=1.0f * readerView.scrollX / readerView.getDisplayedView().getWidth();
//高度偏移量
float heightScale=1.0f * readerView.scrollY / readerView.getDisplayedView().getHeight();

//缩放比
 float widthPercent = bitmap.getWidth() / (float) readerView.getDisplayedView().getWidth();
 float heightPercent = bitmap.getHeight() / (float) readerView.getDisplayedView().getHeight();

droidText0.5.jar

 将签出的图片嵌入到PDF中,这里可以使用iText.jar,不一定要使用droidText0.5.jar

  try {
            PdfReader reader = new PdfReader(inPath, "PDF".getBytes());
            FileOutputStream outputStream = new FileOutputStream(outPath);
            PdfStamper stamp;
            stamp = new PdfStamper(reader, outputStream);
            PdfContentByte over = stamp.getOverContent(pageNum);
            byte[] bytes = Bitmap2Bytes(bitmap);
            Image img = Image.getInstance(bytes);
            Rectangle rectangle = reader.getPageSize(pageNum);
            img.setAlignment(1);
            //设置ImageView的位置
            img.scaleAbsolute(rectangle.getWidth() * mImgWidthPercent, rectangle.getHeight() * mImgHeightPercent);
            //设置ImageView的偏移量
            img.setAbsolutePosition(rectangle.getWidth() * widthScale, rectangle.getHeight() * heightScale);
            over.addImage(img);
            stamp.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (BadElementException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }

以上资料,皆是参考以下大佬的文章,非常感谢你们的付出:
https://blog.csdn.net/qq_33571718/article/details/78811130
https://blog.csdn.net/acrambler/article/details/17377527

你可能感兴趣的:(随手录)