Java生成pdf工具——openPdf加图片水印功能介绍
继上一篇Java生成pdf工具——openPdf加文字水印功能介绍后,这里主要介绍使用openPdf 生产pdf,给pdf加图片水印的功能,希望对大家有所帮助!
1、增加相应的依赖
<dependency>
<groupId>com.github.librepdf</groupId>
<artifactId>openpdf</artifactId>
<version>1.3.34</version>
</dependency>
<dependency>
<groupId>com.github.librepdf</groupId>
<artifactId>openpdf-fonts-extra</artifactId>
<version>1.3.34</version>
</dependency>
这个版本是最后支持jdk1.8, 后续的版本需要jdk9+,使用时,根据jdk版本进行相应的选择。
2、针对中文的支持,必须创建支持中文字符的基础字体
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font docFont = new Font(bfChinese, 12, Font.UNDEFINED, Color.BLACK);
3、具体代码实现
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.*;
import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class Test6 {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
try {
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font docFont = new Font(bfChinese, 12, Font.UNDEFINED, Color.BLACK);
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(new File("D:/example6.pdf")));
writer.setPageEvent(new PdfPageEventHelper() {
@Override
public void onEndPage(PdfWriter writer, Document document) {
PdfContentByte waterMar = writer.getDirectContentUnder();
String text = "光与松果";
addImgAndTextWaterMark(waterMar, text, bfChinese);
}
});
document.open();
Paragraph paragraph = new Paragraph("心中所属唯独你\n" +
"不管天似海深\n" +
"今生再没遗憾\n" +
"即使分开仍念记\n" +
"伤心得你恻隐\n" +
"温馨我这半生\n" +
"若某天 风花雪月似金\n" +
"我倾心 只等你回来时贴近\n" +
"俗世间 江山雨落无尽放任\n" +
"与沧海 未尽缘分\n" +
"愿晚风将我吹 吹进你心内\n" +
"晚灯映花正开\n" +
"月映照伤我心 痴情难自禁\n" +
"夜半莺歌叹息我孤身\n" +
"愿晚风心里吹 吹散我的泪\n" +
"似风筝把你追\n" +
"愿等你一辈子 真情留住你\n" +
"梦里归家那一扇灯\n" +
"心中所属唯独你\n" +
"不管分隔千里\n" +
"痴心也在原地\n" +
"旧日片段曾属你\n" +
"紧紧拥抱不弃\n" +
"终于再没逃避\n" +
"若某天 风花雪月如泪\n" +
"我等你 悲欢过后 如愿再聚\n" +
"俗世间 江山雨落 无尽唏嘘\n" +
"与沧海 一生回味\n" +
"愿晚风将我吹 吹进你心内\n" +
"晚灯映花正开\n" +
"月映照伤我心 痴情难自禁\n" +
"夜半莺歌叹息我孤身\n" +
"愿晚风心里吹 吹散我的泪\n" +
"似风筝把你追\n" +
"愿等你一辈子 真情留住你\n" +
"梦里归家那一扇灯\n" +
"愿晚风心里吹 吹散我的泪\n" +
"似风筝把你追\n" +
"愿等你一辈子 真情留住你\n" +
"梦里归家那一扇灯\n" +
"愿等你一辈子 真情留住你\n" +
"梦里归家那一扇灯", docFont);
paragraph.setAlignment(Element.ALIGN_CENTER);
document.add(paragraph);
document.close();
System.out.println("PDF file created successfully." + (System.currentTimeMillis() - startTime));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void addTextWaterMark(PdfContentByte waterMar, String text, BaseFont bfChinese) {
waterMar.beginText();
PdfGState gs = new PdfGState();
// 设置填充字体不透明度为0.2f
gs.setFillOpacity(0.2f);
waterMar.setFontAndSize(bfChinese, 40);
// 设置透明度
waterMar.setGState(gs);
// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
waterMar.showTextAligned(Element.ALIGN_RIGHT, text, 475, 600, 45);
// 设置水印颜色
waterMar.setColorFill(Color.GRAY);
//结束设置
waterMar.endText();
waterMar.stroke();
}
public static void addTextFullWaterMark(PdfContentByte waterMar, String text, BaseFont bfChinese) {
waterMar.beginText();
PdfGState gs = new PdfGState();
// 设置填充字体不透明度为0.2f
gs.setFillOpacity(0.2f);
waterMar.setFontAndSize(bfChinese, 40);
// 设置透明度
waterMar.setGState(gs);
// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
for (int x = 0; x <= 700; x += 200) {
for (int y = 0; y <= 800; y += 200) {
waterMar.showTextAligned(Element.ALIGN_RIGHT, text, x, y, 35);
}
}
// 设置水印颜色
waterMar.setColorFill(Color.GRAY);
//结束设置
waterMar.endText();
waterMar.stroke();
}
public static void addImgAndTextWaterMark(PdfContentByte waterMar, String text, BaseFont bfChinese) {
waterMar.beginText();
PdfGState gs = new PdfGState();
// 设置填充字体不透明度为0.2f
gs.setFillOpacity(0.2f);
waterMar.setFontAndSize(bfChinese, 40);
// 设置透明度
waterMar.setGState(gs);
// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
for (int x = 0; x <= 700; x += 200) {
for (int y = 0; y <= 800; y += 200) {
waterMar.showTextAligned(Element.ALIGN_RIGHT, text, x, y, 35);
}
}
byte[] byteArray = new byte[0];
try (InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("IMG_20240120_164731.jpg")) {
if (inputStream != null) {
byteArray = new byte[inputStream.available()];
inputStream.read(byteArray);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
com.lowagie.text.Image image = null;
try {
image = com.lowagie.text.Image.getInstance(byteArray);
} catch (IOException e) {
throw new RuntimeException(e);
}
image.scaleAbsolute(300,400);
image.setAbsolutePosition(90, 270);
image.setRotation(30f);
waterMar.addImage(image);
// 设置水印颜色
waterMar.setColorFill(Color.GRAY);
//结束设置
waterMar.endText();
waterMar.stroke();
}
}
4、代码效果
希望对你有所帮助!!!