Android手写签批功能实现(适配Android6.0及以上)
程序员文章站
2024-03-18 11:34:28
...
Android手写签批功能的实现在于三个点,mupdf,偏移量的计算,droidText0.5.jar
实际步骤:
- 使用muPdf将PDF加载出来
- 弹出透明的popwindow,popWindow使用画板(一般签批我们都会用有笔锋的钢笔或者毛笔)
- 将签批好的图片生成Bitmap
- 将该Bitmap通过droidText生成一份新的PDF(这一步放到异步中进行,因为耗时)
mupdf
我们使用MUPdf来加载PDF,这里不一定要用MUPDF,也可以按照自己的想法来使用其他的,mupdf在Android6.0以上的机型上会出现一个问题libmupdf.so: has text relocations,当我们将targetSdkVersion改成23以下即可,但是这不是我们真正的解决办法,真正的解决办法是重新编译mupdf,这里我们可以参考如何在Android6.0及以上嵌入MuPdf
根据这篇文章编译出自己想要的so文件,然后直接用就可以了,这里一定要注意:
- 在创建new MuPDFCore(path);对象的时候一定要去动态获取权限,不然就会一直报打不开文件,或者找不到文件,这里不会提示权限问题(我是没看见日志提示我是权限的问题)
- 因为按照文章来编译的包名是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
上一篇: 数据结构学习一队列整理
下一篇: 括号匹配问题