spring boot itext7 修改生成文档的作者、制作者、标题,并且读取相关的信息。

news2025/1/19 6:51:01

1、官方的example文件:iText · GitHub

itext-java-7.2.5\kernel\src\test\java\com\itextpdf\kernel\pdf\PdfStampingTest.java

2、修改代码:

@Test
    public void stamping1() throws IOException {
        String filename1 = destinationFolder + "stamping1_1.pdf";
        String filename2 = destinationFolder + "stamping1_2.pdf";

        PdfDocument pdfDoc1 = new PdfDocument(new PdfWriter(filename1));
        pdfDoc1.getDocumentInfo().setAuthor("Alexander Chingarev").
                setCreator("iText 6").
                setAuthor("aaaaaaaaaaaa")
                .setKeywords("123")
                .setProducer("abcdefghijklmkuyvklfsdklsdfjksdfj")
                .setSubject("kldsjf")
                .setTrapped(new PdfName("hellksdl"))
                .setTitle("Empty iText 6 Document");
        PdfPage page1 = pdfDoc1.addNewPage();
        page1.getContentStream(0).getOutputStream().write(ByteUtils.getIsoBytes("%Hello World\n"));
        page1.flush();
        pdfDoc1.close();

        PdfReader reader2 = new PdfReader(filename1);
        PdfWriter writer2 = new PdfWriter(filename2);
        PdfDocument pdfDoc2 = new PdfDocument(reader2, writer2);
        pdfDoc2.getDocumentInfo().setCreator("iText 7").setTitle("Empty iText 7 Document");
        pdfDoc2.close();

        PdfReader reader3 = new PdfReader(filename2);
        PdfDocument pdfDoc3 = new PdfDocument(reader3);
        for (int i = 0; i < pdfDoc3.getNumberOfPages(); i++) {
            pdfDoc3.getPage(i + 1);
        }
        assertEquals("Rebuilt", false, reader3.hasRebuiltXref());
        assertEquals("Fixed", false, reader3.hasFixedXref());
        verifyPdfPagesCount(pdfDoc3.getCatalog().getPageTree().getRoot().getPdfObject());
        pdfDoc3.close();

        PdfReader reader = new PdfReader(destinationFolder + "stamping1_2.pdf");
        PdfDocument document = new PdfDocument(reader);
        assertEquals("Rebuilt", false, reader.hasRebuiltXref());
        PdfDictionary trailer = document.getTrailer();
        PdfDictionary info = trailer.getAsDictionary(PdfName.Info);
        PdfString creator = info.getAsString(PdfName.Creator);
        assertEquals("iText 7", creator.toString());
        byte[] bytes = document.getPage(1).getContentBytes();
        assertEquals("%Hello World\n", new String(bytes));
        String date = document.getDocumentInfo().getPdfObject().getAsString(PdfName.ModDate).getValue();
        Calendar cl = PdfDate.decode(date);
        double diff = DateTimeUtil.getUtcMillisFromEpoch(null) - DateTimeUtil.getUtcMillisFromEpoch(cl);
        String message = "Unexpected creation date. Different from now is " + (float) diff / 1000 + "s";
        assertTrue(message, diff < 5000);
        document.close();
    }

3、我们来看一下生成的pdf中的信息如何显示的:

我们发现这里面的信息,已成功的被修改了。

4、读取相关信息:

PdfReader reader = new PdfReader(destinationFolder + "stamping1_1.pdf");
        PdfDocument document = new PdfDocument(reader);
        assertEquals("Rebuilt", false, reader.hasRebuiltXref());
        PdfDictionary trailer = document.getTrailer();
        PdfDictionary info = trailer.getAsDictionary(PdfName.Info);
        PdfString creator = info.getAsString(PdfName.Creator);
        System.out.println(creator.toString());
        System.out.println(info.toString());
        System.out.println(info.getAsString(PdfName.Title));
        System.out.println(info.getAsString(PdfName.Producer));
        assertEquals("iText 7", creator.toString());
        byte[] bytes = document.getPage(1).getContentBytes();
        assertEquals("%Hello World\n", new String(bytes));
        String date = document.getDocumentInfo().getPdfObject().getAsString(PdfName.ModDate).getValue();
        Calendar cl = PdfDate.decode(date);
        double diff = DateTimeUtil.getUtcMillisFromEpoch(null) - DateTimeUtil.getUtcMillisFromEpoch(cl);
        String message = "Unexpected creation date. Different from now is " + (float) diff / 1000 + "s";
        assertTrue(message, diff < 5000);
        document.close();

我们会发现Console都输出来了。

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

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

相关文章

特惠电影票API接口的优势功能以及对接因素?

特惠电影票对接接口通常是指允许第三方开发者或平台通过编程方式接入电影票预订服务的API。这些接口可以提供查询电影场次、座位信息、票价、订票、支付等功能。以下是一些关键点和考虑因素&#xff0c;以及一些提供特惠电影票API接口的平台&#xff1a; 关键功能 电影场次信息…

RK3568 4G模块移远 EM05-CE

首先确保4G模块的天线是否正确安装,这一步会影响到后面测试成功与失败,购买模块时可以咨询厂家 然后就可以进行测试,首先需要关闭所有网络设备,以我的开发板为例子,确保等会使用的是4G模块的功能 ifconfig eth0 down ifconfig eth1 down ifconfig eth2 down 然后查看ifc…

java-day7

练习一&#xff1a;飞机票 需求: ​ 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 ​ 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来…

【Spring相关技术】spring进阶-自定义请求报文转对象HttpMessageConverter

文章目录 类继承体系核心类与接口说明底层调用链完整示例步骤 1: 创建自定义的HttpMessageConverter步骤 2: 配置Spring MVC使用自定义转换器步骤 3: 使用自定义转换器 相关文献 类继承体系 默认转换器即springmvc默认的转换器&#xff0c; 用的比较多的是以下两种&#xff0c;…

生信技能61 - 获取比对后BAM文件的多项基础统计指标

获取比对后BAM文件的多项基础统计指标 1. 运行实例 采用pysam库解析bam文件,将bam文件路径作为输入参数,统计输出比对的参考基因组大小、ATCGN各碱基数量/比率、GC含量、UR reads数量、平均测序深度、总reads数量等统计指标。 python bam_statistics.py -b sample.sorted.…

【Nestjs】从入门到精通(依赖注入)

NestJS 是一个基于 Node.js 的渐进式框架&#xff0c;构建在 Express 或 Fastify 之上&#xff0c;主要用于构建高效、可扩展的服务器端应用程序。它使用 TypeScript 并借鉴了 Angular 的设计理念&#xff0c;采用了依赖注入&#xff08;IoC, Inversion of Control&#xff09;…

动态网站及爬虫技术应用(题目)

/*T26:HTTP响应消息的状态代码为500时表示&#xff08; &#xff09;: HTTP响应消息的状态代码为500时表示服务器内部错误&#xff08;Internal Server Error&#xff09;。这通常意味着服务器在处理请求时遇到了意外的情况&#xff0c;导致无法完成该请求。这种错误可能是由于…

操作系统Lesson - 5 进程简介及进程编程模型

文章目录 什么是进程同一程序如何并发&#xff1f; Linux进程常用命令proc目录 PCB进程控制块PCB包含的信息两个进程间的关系 进程编程exec() 替换函数子进程的运行过程 什么是进程 进程 程序运行的过程&#xff0c;系统进行资源管理和调度的独立单位。 程序由两部分组成&am…

基础入门-Web应用架构搭建漏洞HTTP数据包

网站搭建 这里给一个网站搭建的视频链接&#xff0c;之前又搞过搭建服务器&#xff0c;这里就不再重做了 https://www.bilibili.com/video/BV16A4y1X7vg/?spm_id_from333.337.search-card.all.click&vd_sourcec2c3c616b3ad1faf44a9f6f30a4dbb03 值得注意的是&#xff0c;…

网络通信与并发编程(二)基于tcp的套接字、基于udp的套接字、粘包现象

基于tcp的套接字 文章目录 基于tcp的套接字一、套接字的工作流程二、基于tcp的套接字通信三、基于udp的套接字通信四、粘包现象 一、套接字的工作流程 Socket是应用层与TCP/IP协议族通信的中间软件抽象层&#xff0c;它是一组接口。在设计模式中&#xff0c;Socket其实就是一个…

学习底座架构-武汉

1 学习底座架构概述 大脑学习中心-边缘系统 一、当下教育现状 二、什么是学习底座 三、学习底座价值 七、学习底座解决问题的流程 案例&#xff1a;以4R注意力为例 一 注意力问题解决流程 二 注意力问题的危害 三 衡量注意力水平高低的标准 四 注意力问题4大根源 & 2大诱因…

FPGA驱动HDMI 初级篇

简介 本章节主要讲述如何通过FPGA驱动HDMI显示。 本章节框图如下: bd框图中使用了两个IP核,分别是Video Timing controller核AXI4-Stream to video out两个模块,下面先对两个模块做介绍。 Video Timing controller 配置如下: 这里由于没有使用ZYNQ PS端,…

BKD树介绍、区别与联系

简介 BKD树&#xff08;全称 bushy kd-trees&#xff09;是一种用于高维数据搜索的数据结构。它结合了K-D树和B树的特点&#xff0c;旨在提高多维空间数据的索引和查询效率。 基本概念 BKD树是一种二叉树结构&#xff0c;类似于K-D树&#xff0c;但其设计更加注重空间利用率…

10.11Python数学基础-多维随机变量及其分布

多维随机变量及其分布 1.二维随机变量及其分布 假设E是随机试验&#xff0c;Ω是样本空间&#xff0c;X、Y是Ω的两个变量&#xff1b;(X,Y)就叫做二维随机变量或二维随机向量。X、Y来自同一个样本空间。 联合分布函数 F ( x , y ) P ( X ≤ x , Y ≤ y ) F(x,y)P(X≤x,Y≤…

SpringBoot+XXL-JOB:高效定时任务管理

前言 在现代应用程序中&#xff0c;定时任务是不可或缺的一部分。Spring Boot 和 XXL-Job 为你提供了一个强大的工具组合&#xff0c;以简化任务调度和管理。 本文将带领你探索如何将这两者集成在一起&#xff0c;实现高效的定时任务管理。无论你是初学者还是有经验的开发者&…

【进阶】面向对象之接口

文章目录 为什么要有接口如何定义和使用一个接口练习 接口里面的成员特点接口和类之间的关系 为什么要有接口 接口:就是一种规则 如何定义和使用一个接口 接口用关键字interface来定义 public interface 接口名{}接口不能实例化接口和类之间是实现关系&#xff0c;通过imple…

集合的基础操作

1.集合中元素没有顺序&#xff0c;且不会重复&#xff0c;输入的数据若有重复则会去重 2.集合的格式为:变量名{##,##,##} 3.集合中元素的添加格式为&#xff1a;变量名.add(添加的元素) 4.集合中元素的取出格式&#xff08;取出元素后&#xff0c;原集合中该元素没有了&#…

软件测试学习笔记丨Linux三剑客-grep

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32506 一、简介 1.1 grep命令 grep是一个全局查找正则表达式&#xff0c;并且打印结果行的命令。grep的输入是一个文件或者一个标准输入&#xff08;stdin&#xff09;&#xff0c;或者是一…

JAVA多线程实现

一、方法总结 Thread类的常用方法 void setName(String name)//将此线程的名称更改为name String getName()//如果不设置名称&#xff0c;则线程默认名称为Thread-0或Thread-1或…就是Thread -&#xff1f; String Thread.currentThread().getName()//获得当前线程名称 …

C++常见的内存错误和解决策略

目录 1.未初始化指针 (Uninitialized Pointer) 2.内存分配未成功却使用了它 3.野指针 (Dangling Pointer) 4.内存泄漏 (Memory Leak) 5.重复释放内存 (Double Free) 6.内存越界访问 (Buffer Overflow) 7.错误的数组删除方式 (Mismatched Delete) 8.栈内存溢出 (Stack O…