Android pdf填充表單,預覽,圖片填充,水印添加

前言

需求是這樣的,客戶需要用戶登錄app後錄入個人信息,然後由手機端幫助將錄入的信息填充到pdf,

用戶錄入的部分圖片需要填充到pdf模板的最後面,還需要給每一頁pdf都加上水印,生成後給用戶預覽

分析技術點

1.pdf表單填充

2.pdf水印添加

3.pdf圖片填充

4.pdf在線預覽

遇到的坑或者問題

1.使用itext進行填充pdf,設置了中文支持,使用pdfview預覽pdf,發現部分機型預覽填充的內容中有錯別字或者不顯示

解決方案:外部引入tts字庫,弊端 ,生成pdf變大,如果引入tts文件小,則可能填充的內容中有錯別字

步驟

1.pdf表單填充

下載 adobe Acrobat DC進行對於PDF模板文件進行表單域添加

 

2.將編輯後有表單域的 pdf模板存放到 assets文件夾下,下載itext jar包和 itextasian jar包

itext是java用來操作pdf的工具 itextasian輔助包 對於itext進行了中文支持

將自帶tts字體包也存放到assets下

3.填充pdf

     String timeWater = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); //獲取水印
     BaseFont bfChinese = BaseFont.createFont("assets/font/simhei.ttf",
                    BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//獲取中文字體
     InputStream open = mContext.getClass().getClassLoader().getResourceAsStream("assets/" + fileServerAsset); //讀pdf流
     PdfReader reader = new PdfReader(open);//對pdf進行讀寫
     PdfStamper pdfStamper = new PdfStamper(reader, new FileOutputStream(new File(path, fileServerName)));
     AcroFields acroFields = pdfStamper.getAcroFields();  //獲取pdf表單
     Map<String, String> formData = new HashMap<>(); 
     formData.put("identify_number", identify.getId_number());

      for (Iterator it = formData.keySet().iterator(); it.hasNext(); ) {//遍歷數據填充到表單
            String key = (String) it.next();
            String value = (String) formData.get(key);
            acroFields.setFieldProperty(key, "textfont", bfChinese, null);
            acroFields.setField(key, value);
        }
      PdfContentByte overContent19 = pdfStamper.getUnderContent(19);//追加一頁
      Image idFontImg = Image.getInstance(id_font_img);//獲取圖片封裝對象
      Rectangle rectangleIdFont;
        if (idFontImg.getWidth() > idFontImg.getHeight()) {
            rectangleIdFont = new Rectangle(400, 300);
        } else {
            rectangleIdFont = new Rectangle(300, 400);
        }
     idFontImg.scaleToFit(rectangleIdFont.getWidth(), rectangleIdFont.getHeight());//設置圖片位置,及縮放
     overContent19.addImage(idFontImg);//將圖片添加到pdf
     addMaterMark(reader, pdfStamper, bfChinese, timeWater);//追加水印
     pdfStamper.setFormFlattening(true); //設置表單之後不可編輯
     pdfStamper.close();
     reader.close();

//追加水印的方法    

    private void addMaterMark(PdfReader reader, PdfStamper stamper, BaseFont bfChinese, String timeWater) {
        int total = reader.getNumberOfPages() + 1;
        PdfContentByte content;
        int fontSize = 70;
        int rotate = 45;
        BaseColor color = BaseColor.GRAY;
        // 循環對每頁插入水印
        for (int i = 1; i < total; i++) {
            // 水印的起始
            content = stamper.getOverContent(i);

            // 開始
            content.beginText();

            // 設置顏色 默認爲藍色1
            content.setColorFill(color);
            // 設置字體及字號
            content.setFontAndSize(bfChinese, fontSize);

            Document document = new Document(reader.getPageSize(1));
            float pageWidth = document.getPageSize().getWidth(); //595
            float pageHeight = document.getPageSize().getHeight();//841
//            content.setTextRise(45);//斜度
            // 設置起始位置
            // content.setTextMatrix(400, 880);
            //  content.setTextMatrix((pageWidth-fontSize*stampStr.length())/2+50,(pageHeight-fontSize*stampStr.length())/2+100);
            // 開始寫入水印


            //因爲是純數字 寬度佔一半  因爲45度 寬度除以 1.414   左右對稱  再除以2
            int left = (int) ((pageWidth - fontSize * timeWater.length() / 2 / 1.414) / 2);
            int top = (int) ((pageHeight - fontSize * timeWater.length() / 2 / 1.414) / 2);
            Log.d("tag", "left_" + left);
            PdfGState gs = new PdfGState();
            gs.setFillOpacity(0.2f);
            content.setGState(gs);
            content.showTextAligned(Element.ALIGN_LEFT, timeWater, left,
                    top, rotate);

            content.endText();

        }
    }

3.pdf在線預覽

xml

<com.github.barteksc.pdfviewer.PDFView
    android:id="@+id/pdf_view"
    android:background="@color/error_item_color"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</com.github.barteksc.pdfviewer.PDFView>

mPDFView.fromFile(new File(fileBean.getFilePath()))
        .enableSwipe(true)
        .enableAnnotationRendering(true)
        .spacing(10) // in dp
        .onPageChange(new OnPageChangeListener() {
            @Override
            public void onPageChanged(int page, int pageCount) {
                mTvPageTab.setText(1 + page + "/" + pageCount);
            }
        })
        .pageFitPolicy(FitPolicy.BOTH)
        .load();
pdfview添加依賴
compile 'com.github.barteksc:android-pdf-viewer:3.0.0-beta.5'

 

項目地址 https://github.com/caixingcun/PdfCase

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章