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
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
# 学习参考
上次更新: 2024/9/25 11:16:13