泪伤荡的编程指南 泪伤荡的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM篇
  • 新特性
  • 进阶篇
  • 网络
  • 操作系统
  • 数据结构与算法
  • 硬件
  • 基础篇
  • MySql
  • Oracle
  • PostgreSQL
  • 达梦
  • Redis
  • Mongodb
  • Hive
  • 数据库比较
  • Spring
  • SpringMvc
  • SpringBoot
  • Hibernate
  • iBatis
  • Mybatis
  • Mybatis-plus
  • Mybatis-plus-join
  • 各个框架对比
  • UML画图
  • 设计须知
  • 开发流程
  • 开发理论
  • 架构体系
  • 设计模式
  • 开源知识
  • 分布式解决方案
  • SpringCloud
  • API网关
  • 注册中心
  • 配置中心
  • 服务调用
  • 分布式事务
  • 消息队列
  • 调度作业
  • 链路追踪
  • 服务保障
  • 搜索引擎Elk
  • 安全框架
  • 监控体系
  • 部署容器
  • Netty
  • Tomcat
  • Nginx
  • 图片云存储
  • 云存储
  • 虚拟机Linux
  • 项目部署
  • 容器部署
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • Bug记录仓库
  • 随笔
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 视频网站
  • 音乐网站
  • 商城网站
  • 论坛网站
  • scrm项目
  • Yudao-cloud
  • RuoYi-Vu-cloud
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
  • Java术语
  • 命名英语
  • 业务英语
  • 表字段英语
  • 包名英语
Github (opens new window)
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM篇
  • 新特性
  • 进阶篇
  • 网络
  • 操作系统
  • 数据结构与算法
  • 硬件
  • 基础篇
  • MySql
  • Oracle
  • PostgreSQL
  • 达梦
  • Redis
  • Mongodb
  • Hive
  • 数据库比较
  • Spring
  • SpringMvc
  • SpringBoot
  • Hibernate
  • iBatis
  • Mybatis
  • Mybatis-plus
  • Mybatis-plus-join
  • 各个框架对比
  • UML画图
  • 设计须知
  • 开发流程
  • 开发理论
  • 架构体系
  • 设计模式
  • 开源知识
  • 分布式解决方案
  • SpringCloud
  • API网关
  • 注册中心
  • 配置中心
  • 服务调用
  • 分布式事务
  • 消息队列
  • 调度作业
  • 链路追踪
  • 服务保障
  • 搜索引擎Elk
  • 安全框架
  • 监控体系
  • 部署容器
  • Netty
  • Tomcat
  • Nginx
  • 图片云存储
  • 云存储
  • 虚拟机Linux
  • 项目部署
  • 容器部署
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • Bug记录仓库
  • 随笔
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 视频网站
  • 音乐网站
  • 商城网站
  • 论坛网站
  • scrm项目
  • Yudao-cloud
  • RuoYi-Vu-cloud
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
  • Java术语
  • 命名英语
  • 业务英语
  • 表字段英语
  • 包名英语
Github (opens new window)
  • 开发工具篇

    • idea设置

      • 配置篇
      • 快捷键篇
      • debug篇
      • 插件篇
    • 玩转Git

      • 基础知识梳理
      • Git配置相关操作
      • git修改已提交人的用户名和邮箱
      • git提交规范
      • 常见问题
    • Maven相关

      • Maven简介
      • Maven常用命令
      • 依赖管理
      • Maven生命周期与插件
      • Maven项目管理工具
    • Apifox使用小结
    • nvm使用小结
    • JMeter使用小记
  • 工具库篇

    • lombok工具库

      • lombok注解使用小结
      • Builder用法解析
      • 异常相关注解
    • EasyExcel小记

      • 工具类
      • 文件导入
      • 文件导出
    • 定时任务相关

      • 基础入门
      • SpringTask学习
      • Quartz学习
    • Hutool工具库

      • 图片压缩
    • 极光推送学习
    • OkHttp学习
    • BigDecimal类详解
    • PdfBox学习
      • 代码实践
      • 学习参考
  • 开发技巧篇

    • 常见数据校验注解
    • 字符串拼接的5种方式
    • 遍历集合的N种方式
    • 集合使用注意事项总结
    • MP使用小记
    • Stream流技巧总结
    • 字符串处理最佳实践
    • SQL语句优化
    • 时间字段处理小记
    • Curl用法解析
    • 列表分页的两种实现方案
    • HashMap根据value获取key
    • Map的7种遍历方式
    • 唯一索引和逻辑删除冲突解决方法
    • 正则表达式
    • 二维码扫码登录学习
    • 脱敏最佳实践
    • 日志记录相关
  • 工具类系列

    • 手写一个文件阅读器
    • 手写一个运行耗时计算器
    • 自定义实现Java Bean属性中列表元素格式校验注解及其实现
    • 父子工程项目搭建
    • 自制代码生成器
  • 随笔

    • HttpServletRequest知识小结
    • Spring MVC 项目构建流程
    • 虚拟机固定ip地址
    • 项目部署
    • 深入理解数组
    • IIS使用小记
    • From的两种类型解析
    • 开发疑惑
    • 开发小记
    • bug解决
  • 开发日常
  • 工具库篇
泪伤荡
2024-07-11
目录

PdfBox学习

# PdfBox 学习

# 代码实践

/**
 * pdfbox测试
 *
 * @author chenmeng
 */
@SpringBootTest
public class PdfBoxTest {

    private static final String content = "超兽武装\r\n" +
            "猪猪侠\r" +
            "喜羊羊与灰太狼\n" +
            "熊出没" +
            "洛洛历险记";
    private static final String width = "10";

    /**
     * 写入测试文档。
     * 该方法创建一个PDF文档,并在文档中添加一页,然后在该页上写入一些文本。
     * 使用try-with-resources语句确保资源(如文档和内容流)在使用后能被正确关闭。
     *
     * @throws IOException 如果在保存文档时发生IO错误。
     */
    @Test
    void writeTest() throws IOException {
        // 创建一个新的PDF文档。默认情况下,文档具有 A4 格式。
        try (PDDocument doc = new PDDocument()) {
            // 添加一个新的页面到文档
            PDPage myPage = new PDPage();
            doc.addPage(myPage);

            // 创建一个内容流,用于向页面写入内容
            try (PDPageContentStream cont = new PDPageContentStream(doc, myPage)) {
                // 开始文本块
                cont.beginText();

                // 设置默认字体和字体大小
                cont.setFont(getDefaultFont(doc), 12);
                // 设置行间距
                cont.setLeading(14.5f);

                // 定义文本的起始位置
                cont.newLineAtOffset(25, 700);
                // 写入第一行文本
                String line1 = "超兽武装";
                cont.showText(line1);

                // 换行
                cont.newLine();

                // 写入第二行文本
                String line2 = "熊出没";
                cont.showText(line2);
                cont.newLine();

                // 写入第三行文本
                String line3 = "喜羊羊与灰太狼";
                cont.showText(line3);
                cont.newLine();

                // 写入第四行文本
                String line4 = "猪猪侠";
                cont.showText(line4);
                cont.newLine();

                // 结束文本块
                cont.endText();
            }

            // 保存文档到指定路径
            doc.save("src/main/resources/pdf/writeTest.pdf");
        }
    }

    /**
     * 换行测试。
     * 该方法创建一个PDF文档,并在文档中添加一页,然后在该页上写入一些文本,并使用换行符来分隔文本。
     * 使用try-with-resources语句确保资源(如文档和内容流)在使用后能被正确关闭。
     *
     * @throws IOException 如果在保存文档时发生IO错误。
     */
    @Test
    void lineBreakTest() throws IOException {
        // 创建一个新的PDF文档
        try (PDDocument doc = new PDDocument()) {
            // 添加一个新的页面到文档
            PDPage myPage = new PDPage();
            doc.addPage(myPage);

            // 创建一个内容流,用于向页面写入内容
            try (PDPageContentStream cont = new PDPageContentStream(doc, myPage)) {
                // 开始文本块
                cont.beginText();

                // 设置默认字体和字体大小
                cont.setFont(getDefaultFont(doc), 12);
                // 设置行间距
                cont.setLeading(14.5f);

                // 定义文本的起始位置
                cont.newLineAtOffset(25, 700);

                String[] split = content.split("\r\n|\r|\n");
                for (String s : split) {
                    cont.showText(s);
                    cont.newLine();
                }

                // 结束文本块
                cont.endText();
            }

            doc.save("src/main/resources/pdf/lineBreakTest.pdf");
        }
    }

    /**
     * 读取测试。
     * 该方法加载一个PDF文件,并使用PDFTextStripper类从文件中提取文本。
     * 使用try-with-resources语句确保资源(如文档)在使用后能被正确关闭。
     *
     * @throws IOException 如果在加载或提取文本时发生IO错误。
     */
    @Test
    void readTest() throws IOException {
        // 加载 PDF 文件
        try (PDDocument doc = PDDocument.load(new File("src/main/resources/pdf/writeTest.pdf"))) {
            System.out.println("页码:" + doc.getNumberOfPages());

            System.out.println("======");

            // PDFTextStripper 用于从 PDF 文件提取文本
            PDFTextStripper stripper = new PDFTextStripper();
            String text = stripper.getText(doc);

            System.out.println("Text size: " + text.length() + " characters:");
            System.out.println(text);
        }
    }

    /**
     * 插入图片测试。
     * 该方法创建一个PDF文档,并在文档中添加一页,然后在该页上插入一张图片。
     * 使用try-with-resources语句确保资源(如文档和内容流)在使用后能被正确关闭。
     *
     * @throws IOException 如果在保存文档时发生IO错误。
     */
    @Test
    void createImageTest() throws IOException {
        try (PDDocument doc = new PDDocument()) {

            PDPage myPage = new PDPage();
            doc.addPage(myPage);

            /* 图片文件的路径 */
            String imgFileName = "src/main/resources/pdf/test.png";
            /* 从文件创建一个PDImageXObject对象,用于后续在PDF中插入图片 */
            PDImageXObject pdImage = PDImageXObject.createFromFile(imgFileName, doc);

            /* 获取图片的宽度和高度,用于计算插入PDF后的尺寸 */
            int iw = pdImage.getWidth();
            int ih = pdImage.getHeight();

            /* 定义图片在PDF中的偏移量,用于调整图片的位置 */
            float offset = 20f;

            /* 使用try-with-resources确保PDPageContentStream资源在使用后能被正确关闭 */
            try (PDPageContentStream cont = new PDPageContentStream(doc, myPage)) {
                /* 在PDF页面上绘制图片,指定图片的左上角位置及尺寸 */
                // cont.drawImage(pdImage, offset, offset, iw, ih);
                cont.drawImage(pdImage, 160, 345, 284, 160);
            }

            doc.save("src/main/resources/pdf/createImageTest.pdf");
        }
    }

    /**
     * 设置文档属性信息测试。
     * 该方法创建一个PDF文档,并在文档中添加一页,然后在该页上写入一些文本,并使用换行符来分隔文本。
     * 使用try-with-resources语句确保资源(如文档)在使用后能被正确关闭。
     *
     * @throws IOException 如果在保存文档时发生IO错误。
     */
    @Test
    void docInfoTest() throws IOException {
        try (PDDocument doc = new PDDocument()) {

            PDPage myPage = new PDPage();
            doc.addPage(myPage);

            PDDocumentInformation pdi = doc.getDocumentInformation();

            // 作者
            pdi.setAuthor("泪伤荡");
            // 标题
            pdi.setTitle("PDF 文档信息测试");
            // 应用
            pdi.setCreator("Java code");

            Calendar date = Calendar.getInstance();
            // 创建时间
            pdi.setCreationDate(date);
            // 修改时间
            pdi.setModificationDate(date);

            // 关键词
            pdi.setKeywords("Good morning, good afternoon and good night!");

            doc.save("src/main/resources/pdf/docInfoTest.pdf");
        }
    }

    private static PDFont getDefaultFont(PDDocument doc) {
        PDFont font;
        try {
            File file = new File("src/main/resources/pdf/font.ttf");
            font = PDType0Font.load(doc, file);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return font;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223

# 学习参考

Java PDFBox 教程|极客教程 (geek-docs.com) (opens new window)

上次更新: 2024/10/26 02:01:17
BigDecimal类详解
常见数据校验注解

← BigDecimal类详解 常见数据校验注解→

Theme by Vdoing | Copyright © 2024-2025 泪伤荡 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式