? ? ? ? 在word生成pdf后,或者上傳pdf文件,用戶希望給pdf文檔添加水印信息,具體代碼如下
? 一. 首先pom中需要引入
<!-- PDF水印-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<!-- 中文字體 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
核心代碼如下,寫在某個(gè) service 下面
public void signPdf(InputStream is, Supplier<OutputStream> os, List<WaterMarkInfoRequest> signList) {
PdfStamper stamper = null;
PdfReader reader = null;
try {
reader = new PdfReader(is);
stamper = new PdfStamper(reader, os.get());
for (WaterMarkInfoRequest s : signList) {
TextWaterMarkRequest textWaterMark = s.getTextWaterMark();
if (textWaterMark != null) {
//添加文字
BaseFont baseFont;
try {
baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
} catch (DocumentException | IOException e) {
log.info("pdf簽名獲取字體信息異常:{}", e.getMessage(), e);
throw new BusinessException(IO_ERROR.toErrorInfos("pdf簽名獲取字體信息異常"));
}
PdfContentByte content = stamper.getOverContent(textWaterMark.getPageNo());
PdfGState gState = new PdfGState();
//設(shè)置透明度
gState.setFillOpacity(textWaterMark.getAlpha());
content.setGState(gState);
content.beginText();
//設(shè)置字體
content.setFontAndSize(baseFont, textWaterMark.getFontSize());
//設(shè)置顏色
content.setColorFill(new BaseColor(0xFF << 24 | Integer.parseInt(textWaterMark.getFontColor(), 16)));
//設(shè)置水印內(nèi)容和位置
content.showTextAligned(Element.ALIGN_MIDDLE, textWaterMark.getText(), textWaterMark.getIntervalVertical(), textWaterMark.getIntervalHorizontal(), 0f);
content.endText();
}
ImageWaterMarkRequest imageWaterMark = s.getImageWaterMark();
if (imageWaterMark != null) {
//添加圖片
PdfContentByte content = stamper.getOverContent(imageWaterMark.getPageNo());
PdfGState gState = new PdfGState();
//設(shè)置透明度
gState.setFillOpacity(imageWaterMark.getAlpha());
//image
Image image = Image.getInstance(EncryptUtil.base64DecoderToBytes(imageWaterMark.getBase64Str()));
image.setAbsolutePosition(imageWaterMark.getPositionX(), imageWaterMark.getPositionY());
if (imageWaterMark.getScaleAbsoluteX() != null && imageWaterMark.getScaleAbsoluteY() != null) {
image.scaleToFit(imageWaterMark.getScaleAbsoluteX(), imageWaterMark.getScaleAbsoluteY());
} else if (imageWaterMark.getScalePercent() != null && imageWaterMark.getScalePercent() > 0) {
image.scalePercent(imageWaterMark.getScalePercent());
}
content.addImage(image);
content.stroke();
}
}
} catch (Exception e) {
e.printStackTrace();
log.info("添加簽名失?。簕}", e.getLocalizedMessage(), e);
WM_WRITE_ERR.throwException();
} finally {
if (null != stamper) {
try {
stamper.close();
} catch (Exception e) {
log.info("關(guān)閉失?。簕}", e.getMessage(), e);
}
}
if (null != reader) {
reader.close();
}
}
}
用到的實(shí)體類文章來源:http://www.zghlxwxcb.cn/news/detail-699786.html
public class ImageWaterMarkRequest{
@ApiModelProperty(value = "需要添加的頁碼,默認(rèn)所有頁碼都添加")
private Integer pageNo;
@ApiModelProperty(value = "水平位置 左下角坐標(biāo)(0,0)")
private Integer positionX;
@ApiModelProperty(value = "垂直位置 左下角坐標(biāo)(0,0)")
private Integer positionY;
@ApiModelProperty(value = "指定圖像寬度 ")
private Integer scaleAbsoluteX;
@ApiModelProperty(value = "指定圖像高度 ")
private Integer scaleAbsoluteY;
@ApiModelProperty(value = "縮放比例 與指定尺寸沖突 優(yōu)先使用指定圖像尺寸")
private Integer scalePercent;
@ApiModelProperty(value = "圖片的二進(jìn)制數(shù)據(jù)")
@NotNull
private String base64Str;
@ApiModelProperty(value = "透明度 0--1")
private Float alpha;
@ApiModelProperty(value = "透明度 0--1",hidden = true)
private Float opacity;
@ApiModelProperty(value = "是否水印打在最頂層 默認(rèn)true")
private Boolean isTop;
}
public class WaterMarkInfoRequest {
@ApiModelProperty(value = "文字水印信息")
private TextWaterMarkRequest textWaterMark;
@ApiModelProperty(value = "圖片水印信息")
private ImageWaterMarkRequest imageWaterMark;
}
?方法測(cè)試文章來源地址http://www.zghlxwxcb.cn/news/detail-699786.html
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
public class PdfWaterMarkServiceImplTest {
public static void main(String[] args) throws Exception {
InputStream is = Files.newInputStream(Paths.get("/Users/cong/Downloads/a.pdf"));
OutputStream outputStream = Files.newOutputStream(Paths.get("/Users/cong/Downloads/q-5.pdf"));
ArrayList<WaterMarkInfoRequest> requests = new ArrayList<>();
WaterMarkInfoRequest waterMarkInfo = addSign(1);
WaterMarkInfoRequest waterMarkInfo2 = addSign(1);
requests.add(waterMarkInfo);
requests.add(waterMarkInfo2);
//調(diào)用你自己服務(wù)的pdf水印方法
new PdfWaterMarkServiceImpl().signPdf(is, () -> outputStream, requests);
outputStream.close();
}
private static WaterMarkInfoRequest addSign(Integer pageNum) {
WaterMarkInfoRequest waterMarkInfo = new WaterMarkInfoRequest();
ImageWaterMarkRequest imageWaterMark = new ImageWaterMarkRequest();
imageWaterMark.setPageNo(pageNum);
imageWaterMark.setPositionY(200);
imageWaterMark.setPositionX(200);
imageWaterMark.setTop(true);
imageWaterMark.setAlpha(1.0f);
imageWaterMark.setBase64Str("圖片base64");
waterMarkInfo.setImageWaterMark(imageWaterMark);
TextWaterMarkRequest textWaterMark = new TextWaterMarkRequest();
textWaterMark.setText("我是一個(gè)水印");
textWaterMark.setRotation(0);
textWaterMark.setAlpha(1.0f);
textWaterMark.setFontSize(24);
textWaterMark.setIntervalHorizontal(10);
textWaterMark.setIntervalVertical(10);
textWaterMark.setFontColor("800000");
textWaterMark.setTop(true);
textWaterMark.setPageNo(pageNum);
waterMarkInfo.setTextWaterMark(textWaterMark);
return waterMarkInfo;
}
}
到了這里,關(guān)于Java給PDF文檔添加水印信息的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!