PDF加密、分割和生成封面图操作

由于某些不可抗力原因,公司不允许使用itext系列的jar包,因此系统中使用的相关jar得替换成开源的。经比较和尝试考虑使用org.apache.pdfbox来替换,同时修改系统中原有的方法,发现比itext系列稍显简洁一点,记录如下:

加密文件

/**
     * 加密文件测试
     * @date 2022/4/7
     */
    @Test
    public void encryptTest(){
        try {
            String filePath = "D:\\test\\像李开复一样思考人生.pdf";
            String password = "1234";
            PDDocument document = PDDocument.load(new File(filePath));
            StandardProtectionPolicy spp = new StandardProtectionPolicy(password, password,new AccessPermission());
            document.protect(spp);
            String newFilePath = "D:\\test\\像李开复一样思考人生2.pdf";
            document.save(newFilePath);
            document.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

切割文件

/**
     * 切割文件测试
     * @date 2022/4/7
     */
    @Test
    public void extractTest(){
        try {
            String newFilePath = "D:\\test\\像李开复一样思考人生2.pdf";
            String password = "1234";
            PDDocument document = PDDocument.load(new File(newFilePath), password);//带密码读取
            //从第一页截取到第二页
            PageExtractor pageExtractor = new PageExtractor(document, 1, 2);
            PDDocument extract = pageExtractor.extract();
            extract.save("D:\\test\\像李开复一样思考人生free.pdf");
            extract.close();
            document.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }

生成封面图

/**
     * 切割文件测试
     * @date 2022/4/7
     */
    @Test
    public void createCoverPicTest(){
        try {
            String pdfPath = "D:\\test\\像李开复一样思考人生.pdf";
            File file = new File(pdfPath);
            //order目录
            String orderPath = file.getParent();
            //转换后的img目录
            String bookName = file.getName().substring(0,file.getName().lastIndexOf("."));
            String imgPath = orderPath + File.separator +bookName+".png";
            log.debug("pdf封面图生成成功:{}", imgPath);
            PDDocument pdDocument = PDDocument.load(new File(pdfPath));
            PDFRenderer renderer = new PDFRenderer(pdDocument);
            /* 第二位参数越大转换后越清晰,相对转换速度越慢 */
            BufferedImage image = renderer.renderImageWithDPI(0, 150);
            ImageIO.write(image, "png", new File(imgPath));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

总结一下,现在的工具都比较丰富了,不需要自己去造轮子,

step-1 去maven仓库检索同类型的包,比较一下热度和使用人数
step-2 下载对应包的source源代码,看一下框架整体结构,里面都有哪些package和类,不知道类是干什么的,可以看一下类上面的注释,一般都是比较简单的英文
step-3 动手写单元测试进行验证。

Original: https://www.cnblogs.com/xieshuang/p/16114094.html
Author: 河岸飞流
Title: PDF加密、分割和生成封面图操作

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571638/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 从零开始实现lmax-Disruptor队列(五)Disruptor DSL风格API原理解析

    在v4版本的MyDisruptor实现多线程生产者后。按照计划,v5版本的MyDisruptor需要支持更便于用户使用的DSL风格的API。 由于该文属于系列博客的一部分,需要先对…

    Java 2023年6月8日
    058
  • SpringBoot 源码解析 (二)—– Spring Boot精髓:启动流程源码分析

    本文从源代码的角度来看看Spring Boot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到如今可以这么简便。 入口类 @SpringBootApplication publi…

    Java 2023年5月29日
    068
  • mybatis 中 like 模糊查询 遇到的问题

    引言 在写mapper的时候,需要进行模糊查询,我写成如下图的形式,结果报了sql语句的错误,我检查半天,感觉应该是where语句出错了 于是问了度娘,参考了这位老哥的文章http…

    Java 2023年6月9日
    098
  • Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解

    $remote_addr 代表客户端IP。注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端。假设用户请求过程如下: 用&#x62…

    Java 2023年6月16日
    082
  • idea自动补全代码及scanner方法快捷键

    1.Shift+Enter: 不管鼠标位置在哪都能向下插入一行。 适合场景:修改刚写完的某条语句的某个地方之后,不需要用鼠标点到语句最后再回车,直接Shift+Enter接着往下打…

    Java 2023年6月9日
    0122
  • Spring Boot 打包方式的选择

    新建Spring Boot后,会自带打包方式,现在一般都是打包成jar包,当然你想打包成war包也可以,我就不介绍了!本文主要想谈谈自带的打包方式和assembly打包方式,这两者…

    Java 2023年6月5日
    0136
  • Nginx(一)-windows下的安装配置

    第一步 下载 官网下载地址 因为只是测试这里选择最新版本1.13.9 下载完成得到zip压缩包 解压后得到如下目录 第二步 启动nginx 注意不要直接双击nginx.exe,这样…

    Java 2023年5月30日
    063
  • jvm:内存结构与对象内存解析

    java的跨平台性主要是因为其字节码文件可以在任何具有java虚拟机的计算机或者电子设备上运行,jvm中的字节码解析器负责将字节码文件解释成机器码运行,字节码文件.class是ja…

    Java 2023年6月7日
    088
  • SpringBoot多数据源事务解决方案

    背景 之前有文章提供了springboot多数据源动态注册切换的整合方案,在后续使用过程中,发现在事务控制中有多种bug发生,决定对此问题进行分析与解决 前情提要 多数据源切换流程…

    Java 2023年6月15日
    063
  • 二进制妙用之多选

    1. 基础知识 两个运算规则 逻辑与,口诀,有 0为 0 逻辑或,口诀,有 1为 *1 使用二进制存取多选信息,应用范围,如存取用户权限,功能权限,方向控制等.需要实现预期的结果,…

    Java 2023年6月13日
    079
  • 解决Nginx同网段ip_hash负载均衡无效果

    问题 Nginx ip_hash在局域网中所有机器访问的都是同一台机器没有Hash。造成原因如被Hash的Ip为192.168.1.100;实则上Nginx进行Hash算法时取的是…

    Java 2023年6月5日
    083
  • Markdown基础语法(上)

    前言 按照官方文档,和根据自己所用和所理解所写 一.标题语法 一级标题最大,六级标题最小 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ##…

    Java 2023年6月13日
    080
  • 使用ANSI改变终端输出样式

    默认情况下程序输出到终端的字符样式为白字黑背景,样式、字体比较单一。如想改变程序输出到终端字符的样式等可使用ANSI转移码使其输出具有不同样式; ANSI转义序 ANSI转义序列包…

    Java 2023年6月16日
    075
  • Spring注解简析

    JAVA 元注解 @Documented @Inherited @Retention @Target @Repeatable @Native 在java.lang.annotati…

    Java 2023年6月13日
    090
  • 信管知识梳理(五)信息系统安全技术

    一、信息安全的有关概念 【记忆口诀】主审机构访问 二、信息加密、解密与常用算法 信息加密是指利用加密技术伪装信息,使未授权者不能理解它的真实含义。加密前的原始数据称为明文,加密后的…

    Java 2023年6月6日
    065
  • 认识JavaWeb

    JavaWeb Java Web 1、基本概念 1.1、前言 web开发: web,网页的意思 , www.baidu.com 静态web html,css 提供给所有人看的数据始…

    Java 2023年6月8日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球