欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-18 11:34:28
...

 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

相关标签: 手写签批