Pdfjs使用

news2024/12/23 14:00:49

pdfjs使用

      • 一、下载
      • 二、Springboot引入pdfjs
      • 三、利用PDFJS预览pdf文件并加水印
      • 四、后端将pdf添加水印
      • 参看链接

一、下载

pdfjs官方地址

二、Springboot引入pdfjs

在这里插入图片描述

  • 针对于pdfjs方面有用的只是pdf这个包下面和viewer.html这个html页面
  • viewer.html是我们用来展示pdf的页面不需要改
  • 但是viewer.js中有些东西使我们需要注意的
    • webViewerInitialized()这个方法
    var appConfig = PDFViewerApplication.appConfig;
    var file = void 0;
    var queryString = document.location.search.substring(1);
    var params = (0, _ui_utils.parseQueryString)(queryString);
    file = 'file' in params ? params.file : appConfig.defaultUrl;
    
    • 三元表达式代表最后得到的这个file就是,我们会去访问的地址(这块看不懂的可以先往下看)
    • 首先我们页面一般都需要有类似于按钮的地方去发请求
      假设,我们发送的请求是:window.open("/viewer.html?file=/showPDFFile/1");
      这就是我们上面将viewer.html放在resources下面的原因,我们需要能够直接访问到它
    • 最后我们的后台Controller层,写一个下载文件的方法就ok了,
        @RequestMapping("showPDFFile/{id}")
    @ResponseBody
    public void showPDFFile(@PathVariable("id") Integer id,HttpServletResponse response){
       MMPojo mmPojo = mmService.getById(id);
       File file = new File(mmPojo .getFilePath());
       if (file.exists()) {
           byte[] data = null;
           FileInputStream input=null;
           try {
               input= new FileInputStream(file);
               data = new byte[input.available()];
               input.read(data);
               response.getOutputStream().write(data);
           } catch (Exception e) {
               System.out.println("pdf文件处理异常:" + e);
           }finally{
               try {
                   if(input!=null){
                       input.close();
                   }
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }
    }
    

三、利用PDFJS预览pdf文件并加水印

前端加水印(掩耳盗铃)
pdfjs官网提供的下载包里有一个viewer.html这里,如果想偷懒可以直接套用这个,访问这个文件的时候加上file=“xxxxx.pdf”,需要预览的路径就行了,这里不多说,主要是加水印,加水印理论上只需要修改viewer.js这个文件就行了,如果需要动态赋值水印内容,可以在viewer.html这个文件使用的head标签中引用viewer.js之前使用JavaScript赋值。
viewer.js需要改动的地方:
在这里插入图片描述
可以直接搜索

textLayerDiv.className = "textLayer";
textLayerDiv.style.width = canvasWrapper.style.width;
textLayerDiv.style.height = canvasWrapper.style.height;

可以定位到大概位置(不同版本语法可能不一样)
将上图红框中的代码替换成如下代码:

//---------------------水印开始---------------------
      var cover = document.createElement('div');
      cover.className = "cover";
      for (var y = 0; y < 5; y++) {
        for (var x = 0; x < 4; x++) {
          let c = document.createElement('div')
          c.className = "cover"
          c.style.position = 'absolute';
          c.style.left = (10+x/4*100)+'%';
          c.style.top = (10+y/5*100)+'%';
          c.style.transform = "rotate(315deg)";
          c.style.color = "rgba(0, 191, 255, 0.2)";
          // c.innerText = text;//text为水印内容,可以在viewer.html中传入,也可以直接替换成固定的字符串如:c.innerText = "这是一个水印";
          c.innerText = "这是一个水印";
          cover.appendChild(c);
        }
      }
      if (this.annotationLayer?.div) {
        div.insertBefore(textLayerDiv, this.annotationLayer.div);
        div.appendChild(cover);
      } else {
        div.appendChild(textLayerDiv);
        div.appendChild(cover);
      }
      //---------------------水印结束---------------------

修改之后大概是这个样子
在这里插入图片描述
修改之后可以访问试试
在这里插入图片描述

四、后端将pdf添加水印

public class PdfWaterMarkUtil {

    public static void addWaterMark(String srcPdfPath,String tarPdfPath,String WaterMarkContent)throws Exception {
        PdfReader reader = new PdfReader(srcPdfPath);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(tarPdfPath));
        PdfGState gs = new PdfGState();
        BaseFont font =  BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        gs.setFillOpacity(0.4f);// 设置透明度

        int total = reader.getNumberOfPages() + 1;
        PdfContentByte content;
        for (int i = 1; i < total; i++) {
            content = stamper.getOverContent(i);
            content.beginText();
            content.setGState(gs);
            content.setColorFill(BaseColor.DARK_GRAY); //水印颜色
            content.setFontAndSize(font, 56); //水印字体样式和大小
            content.showTextAligned(Element.ALIGN_CENTER,WaterMarkContent, 300, 300, 30); //水印内容和水印位置
            content.endText();
        }
        stamper.close();
        System.out.println("PDF水印添加完成!");
    }

    public static void main(String[] args) {
        PdfWaterMarkUtil pwm = new PdfWaterMarkUtil();
        String msg = "";
        String baseSrcUrl = "D:\\test\\testpdf\\src_old.pdf";
        String baseOutUrl = "D:\\test\\testpdf\\src_now.pdf";
        String username = "测试水印";
        try {
            pwm.addWaterMark(baseSrcUrl, baseOutUrl,username);
            msg = "success";
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
}

参看链接

https://www.jianshu.com/p/b254109d7ad9
https://blog.csdn.net/weixin_42152604/article/details/102836835

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高压功率放大器在超声悬浮中的应用研究

高压功率放大器的叫法对于不同的人来说是完全不同的&#xff0c;有人叫功率放大器&#xff0c;也有人叫电压放大器&#xff0c;但它们都是指同一个电子测量仪器设备&#xff0c;主要是指内部能够拥有电压和功率放大电路&#xff0c;可以把微弱的外部信号进行放大输出的放大器。…

在华为云 OSC 上快速部署 EMQX MQTT 集群

EMQX Kubernetes Operator 是 EMQ 发布的一个封装、部署和管理工具&#xff0c;也是一个特定的应用控制器&#xff0c;方便 DevOps 人员在 Kubernetes 上编排 EMQX MQTT 消息服务集群&#xff0c;管理其生命周期。 华为云原生基础设施&#xff08;云容器引擎 CCE、容器镜像服务…

索引数据结构千千万 , 为什么B+Tree独领风骚

索引的由来 大数据时代谁掌握了数据就是掌握了流量&#xff0c;就是掌握的号召力。面对浩瀚的数据如何存储并非难事&#xff0c; 难点在于如何在大数据面前查询依旧快如闪电&#xff01; 这时候索引就产生了&#xff0c;索引的产生主要还是借鉴于图书管理员书签的功能。在大数…

谷歌、微软、Meta?谁才是 Python 最大的金主?

你知道维护 Python 这个大规模的开源项目&#xff0c;每年需要多少资金吗&#xff1f; 答案是&#xff1a;约 200 万美元&#xff01; PSF&#xff08;Python 软件基金会&#xff09;在 2022 年 6 月发布了 2021 的年度报告&#xff0c;其中披露了以下这份支出明细&#xff08;…

大家介绍一篇学生选课系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

若依框架字典配置以及使用(结合vue和emelent)

一&#xff1a;字典数据创建&#xff08;我们公司是后端做的&#xff0c;前端不用管&#xff09; 1.首先新建要指定的默认角色 &#xff08;1&#xff09;必须用管理员账号登录才能看到角色管理 &#xff08;2&#xff09;具体怎写&#xff0c;可以参考已有的数据&#xff08…

低代码平台中的“模型驱动”与“表单驱动”有何区别?

低代码定义&#xff1a; 低代码是近几年比较火的一种应用程序快速开发方式&#xff0c;它能帮助用户在开发软件的过程中大幅减少手工编码量&#xff0c;并通过可视化组件加速应用程序的高效交付。&#xff08;低代码的定义来自Forrester报告&#xff0c;被认为是低代码一词的起…

坐标的变换

在QPainter可以使用以下函数变换坐标&#xff1a; QPainter&#xff1a;&#xff1a;scale()缩放坐标系统QPainter&#xff1a;&#xff1a;rotate()顺时针旋转QPainter&#xff1a;&#xff1a;translate()平移QPainter&#xff1a;&#xff1a;shear()围绕原点来扭曲坐标系统…

[附源码]java毕业设计小超市进销存管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

fmllr--学习笔记

预备知识&#xff1a; 说话人自适应技术是利用特定说话人数据对说话人无关(Speaker Independent,SI)的码本进行改造&#xff0c;其目的是得到说话人自适应(SPeaker Adapted, SA)的码本来提升识别性能。在某个说话人的训练数据足够多的时候&#xff0c;针对当前说话人数据采用传…

m基于3GPP-LTE通信网络的认知家庭网络Cognitive-femtocell性能matlab仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 本系统所涉及到的几个主要模块&#xff0c;具体有如下几个模块&#xff1a; A. Simulation Flow&#xff1a;仿真流程 B. Initialization&#xff1a;初始化 C. Mobility Model&…

【每日两题】day 01 组队竞赛 删除公共字符

链接&#xff1a;组队竞赛__牛客网 (nowcoder.com) 解题思路 该题目就是求所有队员水平的数组中的尽可能大的水平之和 因为每个队伍都是三个人&#xff0c;平均水平值肯定是排序后水平中间的值 import java.util.*;public class Main {public static void main(String[] ar…

VisualDrag低代码拖拽模板

目录背景技术&文档二开优化方案1. 优化侧边栏2. 优化图片插入3. 新增可插入画布的组件4. 解决组件鼠标默认事件冲突的问题数据保存对接&页面生成预览保存对接生成预览源码下载背景 接到一个需求做一个拖拽模板低代码生成界面&#xff08;如上图&#xff09;&#xff0c…

项目交付过程中,进度失控的原因有哪些?

在项目交付过程中&#xff0c;会出现项目交付的进度与计划有较大的偏差&#xff0c;导致这种偏差的原因往往是多种多样的&#xff0c;一般常见的引起进度延期的原因有哪些&#xff1f; 1、计划不清晰 项目开始前必须有个计划&#xff0c;工作思路必须事前理清。 项目经理最…

springboot+ssm大学生家教课程订购平台的设计与实现

制作一个大学生家教平台的设计与实现是非常必要的。本网站是借鉴其他人的开发基础上&#xff0c;用MySQL数据库和JSP定制了大学生家教平台的设计与实现。系统前台实现了用户注册、登录、学习课程、家教准则、通知公告、双减政策等功能&#xff0c;并且还可以修改密码、个人信息…

windows10复制文件需要管理员权限,复制需要管理员权限怎么办

在Windows10操作系统的电脑中&#xff0c;很多用户都遇到这样的问题&#xff1a;windows10复制文件需要管理员权限&#xff0c;很多用户都不知道该怎么解决这个问题。在本文中&#xff0c;我们写出了详细的解决方法&#xff0c;让你可以轻松复制文件&#xff0c;并且也修复了需…

SpringBoot中任务是什么/Quartz和SpringTask在Spring Boot中怎么使用/SpringBoot怎么给用户发邮件

写在前面&#xff1a; 继续记录自己的SpringBoot学习之旅&#xff0c;这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.5.2 任务 3.5.2.1 简述 定时任务是企业应用中常…

多种BCN点击试剂:1426827-79-3,endo BCN-PEG4-COOH,1841134-72-2

双环[6,1,0]壬炔 (BCN) &#xff08;环丙烷环辛炔&#xff09;可以通过无铜的点击化学与叠氮化物标记的分子或生物分子反应生成稳定的三氮唑连接。同样其可以和多种不同的基团进行连接&#xff0c;包括acid&#xff0c;NHS ester&#xff0c;amine等。西安凯新生物科技有限公司…

Oracle SQL执行计划操作(7)——排序相关操作

7. 排序相关操作 该类操作和SQL语句执行计划中的排序操作相关。根据不同的具体SQL语句及其他相关因素&#xff0c;如下各操作可能会出现于相关SQL语句的执行计划。 1&#xff09;BUFFER SORT 在会话服务进程内存中对某个行源数据进行排序或其他相关操作&#xff0c;该操作最…

Vue高级篇--实现前后端分离

目录 一、安装Nodejs服务器 二、安装Npm 三、安装vue脚手架 四、使用vue脚手架搭建vue工程 五、vue工程安装需要的插件和依赖 六、安装前端的开发工具 七、使用webstorm打开vue工程 7.1 运行vue工程 八、src目录结构的介绍 一、安装Nodejs服务器 等价于我们java端的Tomcat服务…