0%

Java练手项目-pdf加水印

所需要的工具 一台服务器 一个可以编译jar的java环境 nginx用来正向代理

xshell连接服务器

安装java环境

1
yum install java-1.8.0-openjdk

查看java是否安装好

1
java -version

创建自己项目的路径并且cd到该路径

1
2
mkdir java
cd java

用命令让他跑起来

Linux启动

1
2
3
4
5
6
nohup java -jar pdf-service-0.0.1-SNAPSHOT.jar  
--host=http://161.117.229.248/
--pdfPassword=2021 --footerDesc=\u9875\u811a\u6587\u5b57
--watermarkPic=https://www.wwei.cn/yasuotu/images/logo.png
--basicUrl=tmp/resources/static/pdf/
--location=10,10,30,30 > nohup.out 2>&1 &

这里注意把它copy去浏览器 变成一行去粘贴 这里只是方便看的参数的意义

Linux查看日志
tail -f nohup.out

配置参数
host:zip下载域名
location:水印图片坐标
pdfPassword:pdf保护密码
footerDesc:底部水印文案(unicode编码)
watermarkPic:外网可访问的水印图片地址
basicUrl:输出pdf、zip的文件保存目录

查看包含“java”的所有进程

ps -ef |grep java

杀死进程

kill -9 id

首先导入依赖

1
2
3
4
5
6
7
8
9
10
11
12
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.lowagie/itext -->
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>

代码如下

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
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

/*******************************************************************************
* Description: 图片水印工具类
* @author zengshunyao
* @version 1.0
*/
public class ImageRemarkUtil {

// 水印透明度
private static float alpha = 0.5f;
// 水印横向位置
private static int positionWidth = 150;
// 水印纵向位置
private static int positionHeight = 300;
// 水印文字字体
private static Font font = new Font("宋体", Font.BOLD, 100);
// 水印文字颜色
private static Color color = Color.red;

/**
*
* @param alpha
* 水印透明度
* @param positionWidth
* 水印横向位置
* @param positionHeight
* 水印纵向位置
* @param font
* 水印文字字体
* @param color
* 水印文字颜色
*/
public static void setImageMarkOptions(float alpha, int positionWidth,
int positionHeight, Font font, Color color) {
if (alpha != 0.0f)
ImageRemarkUtil.alpha = alpha;
if (positionWidth != 0)
ImageRemarkUtil.positionWidth = positionWidth;
if (positionHeight != 0)
ImageRemarkUtil.positionHeight = positionHeight;
if (font != null)
ImageRemarkUtil.font = font;
if (color != null)
ImageRemarkUtil.color = color;
}

/**
* 给图片添加水印图片
*
* @param iconPath
* 水印图片路径
* @param srcImgPath
* 源图片路径
* @param targerPath
* 目标图片路径
*/
public static void markImageByIcon(String iconPath, String srcImgPath,
String targerPath) {
markImageByIcon(iconPath, srcImgPath, targerPath, null);
}

/**
* 给图片添加水印图片、可设置水印图片旋转角度
*
* @param iconPath
* 水印图片路径
* @param srcImgPath
* 源图片路径
* @param targerPath
* 目标图片路径
* @param degree
* 水印图片旋转角度
*/
public static void markImageByIcon(String iconPath, String srcImgPath,
String targerPath, Integer degree) {
OutputStream os = null;
try {

Image srcImg = ImageIO.read(new File(srcImgPath));

BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

// 1、得到画笔对象
Graphics2D g = buffImg.createGraphics();

// 2、设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);

g.drawImage(
srcImg.getScaledInstance(srcImg.getWidth(null),
srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
null);
// 3、设置水印旋转
if (null != degree) {
g.rotate(Math.toRadians(degree),
(double) buffImg.getWidth() / 2,
(double) buffImg.getHeight() / 2);
}

// 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度
ImageIcon imgIcon = new ImageIcon(iconPath);

// 5、得到Image对象。
Image img = imgIcon.getImage();

g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));

// 6、水印图片的位置
g.drawImage(img, positionWidth, positionHeight, null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
// 7、释放资源
g.dispose();

// 8、生成图片
os = new FileOutputStream(targerPath);
ImageIO.write(buffImg, "JPG", os);

System.out.println("图片完成添加水印图片");

} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

/**
* 给图片添加水印文字
*
* @param logoText
* 水印文字
* @param srcImgPath
* 源图片路径
* @param targerPath
* 目标图片路径
*/
public static void markImageByText(String logoText, String srcImgPath,
String targerPath) {
markImageByText(logoText, srcImgPath, targerPath, null);
}

/**
* 给图片添加水印文字、可设置水印文字的旋转角度
*
* @param logoText
* @param srcImgPath
* @param targerPath
* @param degree
*/
public static void markImageByText(String logoText, String srcImgPath,
String targerPath, Integer degree) {

InputStream is = null;
OutputStream os = null;
try {
// 1、源图片
Image srcImg = ImageIO.read(new File(srcImgPath));
BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

// 2、得到画笔对象
Graphics2D g = buffImg.createGraphics();
// 3、设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.drawImage(
srcImg.getScaledInstance(srcImg.getWidth(null),
srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
null);
// 4、设置水印旋转
if (null != degree) {
g.rotate(Math.toRadians(degree),
(double) buffImg.getWidth() / 2,
(double) buffImg.getHeight() / 2);
}
// 5、设置水印文字颜色
g.setColor(color);
// 6、设置水印文字Font
g.setFont(font);
// 7、设置水印文字透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));
// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
g.drawString(logoText, positionWidth, positionHeight);
// 9、释放资源
g.dispose();
// 10、生成图片
os = new FileOutputStream(targerPath);
ImageIO.write(buffImg, "JPG", os);

System.out.println("图片完成添加水印文字");

} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != is)
is.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (null != os)
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {

String logoText = "三 年 一 梦";
String iconPath = "D:/pdf/dp/dp_1.png";

String targerTextPath2 = "d:/qie_text_rotate.jpg";

String targerIconPath = "d:/qie_icon.jpg";
String targerIconPath2 = "d:/qie_icon_rotate.jpg";
System.out.println("给图片添加水印文字开始...");

for (int i = 1; i < 10; i++) {
String srcImgPath = "D:/pdf/1/1_"+i+".png";
String targerTextPath = "d:/水印/qie_text"+i+".jpg";
// 给图片添加水印文字
markImageByText(logoText, srcImgPath, targerTextPath);
// 给图片添加水印文字,水印文字旋转-45
//markImageByText(logoText, srcImgPath, targerTextPath2, -45);
}
System.out.println("给图片添加水印文字结束...");



//System.out.println("给图片添加水印图片开始...");
//setImageMarkOptions(0.3f, 1, 1, null, null);
// 给图片添加水印图片
//markImageByIcon(iconPath, srcImgPath, targerIconPath);
// 给图片添加水印图片,水印图片旋转-45
//markImageByIcon(iconPath, srcImgPath, targerIconPath2, -45);
//System.out.println("给图片添加水印图片结束...");

}

}

PDF水印demo学习

第一步创建一个Application类 加上@SpringBootApplication的注解

打印控制台消息

System.out.println("SpringBoot启动成功");

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
System.out.println("SpringBoot启动成功");
}

}

水印程序

FileDTO文件的属性

文件序号 index

文件路径 path

构造有参无参

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
{

/**
* 文件序号
*/
private Integer index;

/**
* 文件路径
*/
private String path;

public Integer getIndex() {
return index;
}

public void setIndex(Integer index) {
this.index = index;
}

public String getPath() {
return path;
}

public void setPath(String path) {
this.path = path;
}
}

PDF拆分为image

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
package com.example.pdfwatermark;


import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Pdf2Image {

/**
* 将File PDF文件转化为每一张图片
* @param file PDF文件
* @return 返回每一张图片的实体对象集合
*/
public static List<FileDTO> generate(File file) {
try {
Long now = System.currentTimeMillis();

//读取PDF
PDDocument document = PDDocument.load(file);

//加载PDF对象
PDFRenderer pdfRenderer = new PDFRenderer(document);

//存储的PDF每一张图片的路径以及索引
List<FileDTO> dataList = new ArrayList<>();

for (int page = 0;page<document.getNumberOfPages();page++){

//读取PDF每一页的图片
BufferedImage img = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);

//生成图片的本地路径
String pathname = PdfWatermarkConstants.PDF_2_IMAGE + now + "/" + file.getName() + page + ".png";

//创建本地文件
File imageFile = new File(pathname);
//创建文件夹
imageFile.mkdirs();
//创建文件
imageFile.createNewFile();

FileDTO dto = new FileDTO();
dataList.add(dto);

dto.setIndex(page);
dto.setPath(pathname);

//生成PNG格式的图片
ImageIO.write(img, "png", imageFile);
}
//关闭Doc流
document.close();

return dataList;
} catch (Exception e) {
e.printStackTrace();
}
return new ArrayList<>();
}
}