首先先看下效果图

然后大体思路就是使用framelayout在上面用画笔画上水印,背景置为null,所以不会遮挡下面PDF的展示,

下面使用PDFview来加载PDF,具体使用方法贴到下面

依赖

implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'

别忘了加权限

本文是在android4.4上运行的demo,没有加上动态申请权限,但是现在android6.0以上的设备占了大多数,所以各位客官用到的话需要在加载PDF的时候判断下权限哦

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/fram"android:layout_width="match_parent"android:layout_height="match_parent"><com.github.barteksc.pdfviewer.PDFViewandroid:id="@+id/myPdfview"android:layout_width="match_parent"android:layout_height="match_parent"/><com.example.shuiyin.WaterMarkViewandroid:id="@+id/water_mark_view"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@null" /><TextViewandroid:id="@+id/my_Page"android:layout_gravity="bottom"android:gravity="center"android:textColor="#f90512"android:textSize="20sp"android:layout_width="match_parent"android:layout_height="wrap_content" />
</FrameLayout>

水印自定义view

import android.content.Context;
import android.graphics.Canvas;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.View;/*** Created by Duqianlong on 2019/2/28.*/public class WaterMarkView extends View {private String name;private String waterMark;public WaterMarkView(Context context) {super(context);initWaterMark();}public WaterMarkView(Context context, AttributeSet attrs) {super(context, attrs);initWaterMark();}public WaterMarkView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initWaterMark();}//生成水印文本private void initWaterMark() {String waterMark = "机密文件,拷贝必究" + "\r\n" + name;}public void setUserName(String userName,String time,String phone) {this.name = userName+ "   " + phone+ "\r\n" + time;}//开始绘制水印@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//获得页面尺寸int width = getWidth();int height = getHeight();//TextPaint是paint的子类,该类可以很方便的进行文字的绘制TextPaint textPaint = new TextPaint();textPaint.setARGB(120, 223, 22, 28);//设置水印颜色textPaint.setTextSize(30.0F);//设置水印字体大小textPaint.setAntiAlias(true); // 抗锯齿//参数意义分别为:文字内容、TextPaint对象、文本宽度、对齐方式、行距倍数、行距加数和是否包含内边距。//这里比较重要的地方是设置文本宽度,当文本宽度比这个值大的时候就会自动换行。
//        StaticLayout layout = new StaticLayout(waterMark, textPaint,width,StaticLayout layout = new StaticLayout(name, textPaint, width,Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);//        float addWidth=36.0f,addHeight=24.0f;float addWidth = width / 10, addHeight = height / 10;//水印的位置
//        float[] x = new float[]{width / 4-addWidth , width * 3 / 4-addWidth, width / 4-addWidth,  width* 3 / 4-addWidth};
//        float[] y = new float[]{height / 4-addHeight, height  / 4-addHeight, height*3 / 4-addHeight, height * 3 / 4-addHeight}; //水印的位置float[] x = new float[]{0, addWidth,addWidth*5, 0,addWidth*4,addWidth*8,addWidth,addWidth*5,addWidth*9,addWidth*4,addWidth*8};float[] y = new float[]{addHeight, addHeight * 3, addHeight*3/2, addHeight*6,addHeight*9/2,addHeight*3,addHeight*17/2,addHeight*7,addHeight*11/2,addHeight*10,addHeight*17/2};//页面上绘制水印for (int i = 0; i < 11; i++) {canvas.save();canvas.translate(x[i], y[i]);canvas.rotate(-30);layout.draw(canvas);canvas.restore();}}
}

PDFactivity


import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.github.barteksc.pdfviewer.PDFView;
import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;public class MainActivity extends AppCompatActivity {PDFView vPdfView;Handler handler;InputStream stream;TextView textView;@SuppressLint("HandlerLeak")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//初始化水印initWaterMarkView();//加载PDF流initPDFview();//流下载完毕后,主线程渲染PDFhandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == 100) {vPdfView.fromStream(stream).enableSwipe(true).swipeHorizontal(false).enableDoubletap(true).defaultPage(0).enableAnnotationRendering(false).password(null).scrollHandle(null).onPageChange(new OnPageChangeListener() { //获取当前页数以及总页数,不需要则不用调用@Overridepublic void onPageChanged(int page, int pageCount) { //page : 当前展示页数, pagecount:总页数textView.setText(page+"/"+pageCount);}}).load();}}};}private void initPDFview() {//子线程下载流textView=findViewById(R.id.my_Page);vPdfView = findViewById(R.id.myPdfview);new Thread(new Runnable() {@Overridepublic void run() {try {//                    URL url = new URL("http://172.25.35.179:8080/mobile/publicMethod/getPdf");URL url = new URL("https://ssl.r93535.com/JTOAInterface/mobile/publicMethod/getPdf");HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();urlConnection.setRequestMethod("GET");urlConnection.connect();stream = urlConnection.getInputStream();if (stream != null) {Message message = handler.obtainMessage();message.what = 100;handler.sendMessage(message);}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}).start();}private void initWaterMarkView() {WaterMarkView markView = findViewById(R.id.water_mark_view);markView.setUserName("张大壮","2019.3.5","15313599999");markView = new WaterMarkView(MainActivity.this);}
}

这算是一个伪水印吧,没有把水印加到PDF文件里面,但是为了文件安全,尽量不把文件存到本地再去加水印,以上这样或许更安全一点点

android PDFview加载PDFPDF加水印相关推荐

  1. android图片加载过程,教你写Android ImageLoader框架之图片加载与加载策略

    在教你写Android ImageLoader框架之初始配置与请求调度中,我们已经讲述了ImageLoader的请求配置与调度相关的设计与实现.今天我们就来深入了解图片的具体加载过程以及加载的策略(包 ...

  2. Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结

    Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结 Atitit.java load class methods 1. 动态加载jar文件和class文件. 1 ...

  3. jdbc驱动类加载直接指定线程上下文加载器加载

    jdbc获取连接是这么写的,看下代码都干了什么,是如何把驱动类加载到jvm的. Class.forName是装载一个类并且对其进行实例化的操作.这里mysql驱动com.sql.Driver的静态方法 ...

  4. WPS无法加载EndNote加载项

    问题描述 WPS2019通过"开发工具-加载项"加载路径C:\Program Files\Common Files\ResearchSoft\Cwyw\19\EndNote Cwy ...

  5. java热加载_java--热加载

    1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环 ...

  6. PPT美化插件 islide 安装过程问题“加载com加载项时运行出现错误”

    一.插件介绍 islide是一款功能强大的PPT美化插件,可以实现快速配色.对齐.图形定制等功能. islide 官网:iSlide- 让PPT设计简单起来 | PPT模板下载平台 二.安装过程中的问 ...

  7. css 同步加载,同步加载,异步加载,懒加载,预加载

    同步加载 默认的就是同步加载 同步加载: 同步模式又称阻塞模式,会阻止浏览器的后续处理,停止了后续的文件的解析,执行,如图像的渲染.流览器之所以会采用同步模式,是因为加载的js文件中有对dom的操作, ...

  8. Vue7 异步加载 懒加载

    vue开发过程中,我们会做出特别多特别多的组件,包括login,header,footer,main等等.这样使整个网站看起来就十分的庞大,当我们在打开网页的时候,突然一下子把这些所有的组件加载上来, ...

  9. Xilinx FPGA在线加载远程更新多重加载 QSPI加载方式 可通过PCIe/网口/串口等接口加载

    Xilinx FPGA在线加载&远程更新&多重加载 QSPI加载方式 可通过PCIe/网口/串口等接口加载 源代码 需要的详谈 ID:6614999670814444294浪里个浪里个 ...

  10. python加载项向导_使用Python的win32com加载Excel加载项

    我从这里的各种问题中看到,如果使用以下方法从 Python打开Excel实例: xl = win32com.client.gencache.EnsureDispatch('Excel.Applicat ...

最新文章

  1. mac安装mysql8.0.11_【MySQL】Mac安装MySQL(V8.0.15)蹚坑记录
  2. oracle hyperion招聘,Hyperion Planning功能顾问
  3. 《基于张量网络的机器学习入门》学习笔记4
  4. SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析
  5. stm32寄存器版学习笔记04 定时计数器中断
  6. knight tour java,Knight Tour Problem
  7. 自定义 BaseServlet,通用Servlet的抽取,模块化开发Servlet
  8. QA: Android 开发kotlin换行格式难看问题
  9. android开发 自我优势_Android程序员必看之Android六大优势
  10. Mac安装Python并使用GUI界面设计
  11. 九鼎实际控制人投资观!
  12. MT6771平台简要了解
  13. css3简单动画 上下切换图片效果:
  14. 消费者运营-阿里系三大模型
  15. 消费者洞察:数据化闭环洞察消费者
  16. 知识?一文解析币圈一级二级市场 原来币圈居然这么多要知道的
  17. 不要瞎折腾,几张思维导图就讲清搜索引擎优化(SEO)核心点
  18. 屏幕录像功能技术探索及分享
  19. 继承 inherit
  20. oracle ebs 简介

热门文章

  1. 基于javaSwing、MySQL的酒店客房管理系统(附源码)
  2. python程序画中国围棋棋盘
  3. 瑞星杀毒软件网络版介绍
  4. win11任务栏(注册表修改/软件)完全透明-全网最详细教程
  5. 嵌入式Linux使用TFT屏幕:使用TinyDRM点亮ST7789V屏幕
  6. Centos yum 包管理工具离线安装
  7. Sdk4J.jar安装到本地maven仓库
  8. FPGA零基础学习:SDR SDRAM 驱动设计
  9. [1] 人工神经网络 神经元模型
  10. 卡巴斯基携手微软MSN 卡巴斯基2010激活码免费领