Android手寫籤批功能實現(適配Android6

笑嘆人生發表於2020-04-18

 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();
        }
複製程式碼

以上資料,皆是參考以下大佬的文章,非常感謝你們的付出: blog.csdn.net/qq_33571718… blog.csdn.net/acrambler/a…

相關文章