java pdf 水印_java pdf添加水印

该博客介绍了一个Java方法,利用iText库为PDF文档添加水印。通过创建PdfStamper对象并设置透明度、字体及角度,将文本水印添加到PDF的每一页上。
摘要由CSDN通过智能技术生成

import com.itextpdf.text.Element;

import com.itextpdf.text.Rectangle;

import com.itextpdf.text.pdf.BaseFont;

import com.itextpdf.text.pdf.PdfContentByte;

import com.itextpdf.text.pdf.PdfGState;

import com.itextpdf.text.pdf.PdfReader;

import com.itextpdf.text.pdf.PdfStamper;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.util.ClassUtils;

import javax.swing.*;

import java.awt.*;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.util.Objects;

/**

* @author zly

* @since 2020/8/13 16:46

*/

public class PdfAddWatermark {

private final static Logger logger = LoggerFactory.getLogger(PdfAddWatermark.class);

/**

* 字体路径

* private static final String TTF_PAHT = "TTF文件路径";

*/

private static final String TTF_PATH = Objects.requireNonNull(ClassUtils.getDefaultClassLoader().getResource("")).getPath() + "static/files/ttf";

/**

* 添加水印

* 备注:

* 在内容下方加水印

* content = stamper.getUnderContent(i);

* 间隔

* int interval = -5;

* 根据纸张大小多次添加, 水印文字成30度角倾斜

* for (int height = interval + textH; height < pageHeight; height = height + textH * 3) {

* for (int width = interval + textW; width < pageWidth + textW; width = width + textW * 2) {

* content.showTextAligned(Element.ALIGN_LEFT, waterMarkName, width - textW, height - textH, 30);

* }

* }

*

* @param pdfPathAndName 原pdf位置

* @param waterMarkName 水印内容

* @param fileOutPutPathAndName 输出路径

*/

public static String pdfAddWatermark(String pdfPathAndName, String waterMarkName, String fileOutPutPathAndName) {

logger.info("-----------------------------pdf添加水印--------------------------------------");

long start = System.currentTimeMillis();

PdfReader reader = null;

PdfStamper stamper = null;

try {

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(fileOutPutPathAndName)));

reader = new PdfReader(pdfPathAndName);

stamper = new PdfStamper(reader, bos);

// 获取总页数 +1, 下面从1开始遍历

int total = reader.getNumberOfPages() + 1;

// 使用classpath下面的字体库

BaseFont base = BaseFont.createFont(TTF_PATH + "/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

// 获取水印文字的高度和宽度

JLabel label = new JLabel();

label.setText(waterMarkName);

FontMetrics metrics = label.getFontMetrics(label.getFont());

// 文字高度

metrics.getHeight();

// 文字宽度

metrics.stringWidth(label.getText());

// 设置水印透明度

PdfGState gs = new PdfGState();

gs.setFillOpacity(0.4f);

gs.setStrokeOpacity(0.4f);

Rectangle pageSizeWithRotation;

PdfContentByte content;

for (int i = 1; i < total; i++) {

// 在内容上方加水印

content = stamper.getOverContent(i);

content.saveState();

content.setGState(gs);

// 设置字体和字体大小

content.beginText();

content.setFontAndSize(base, 100);

// 获取每一页的高度、宽度

pageSizeWithRotation = reader.getPageSizeWithRotation(i);

float pageHeight = pageSizeWithRotation.getHeight();

float pageWidth = pageSizeWithRotation.getWidth();

content.showTextAligned(Element.ALIGN_LEFT, waterMarkName, pageWidth / 2 - 100, pageHeight / 2 - 100, 30);

content.endText();

}

long end = System.currentTimeMillis();

logger.info("------------------------pdf添加水印完成,用时:" + (end - start) + "ms--------------------------");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (stamper != null) {

stamper.close();

logger.info("-------------------------------------流关闭-------------------------------------------");

}

} catch (Exception e) {

logger.error("----------------------pdf添加水印失败,异常信息:" + e.getMessage() + "--------------------------");

}

try {

if (reader != null) {

reader.close();

logger.info("-------------------------------------流关闭-------------------------------------------");

}

} catch (Exception e) {

logger.error("----------------------pdf添加水印失败,异常信息:" + e.getMessage() + "--------------------------");

}

}

return fileOutPutPathAndName;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于 PDF 文件一旦生成,无法直接修改,因此要去除 PDF 文件中的水印,需要使用专门的 PDF 编辑器软件。以下是使用 Java 编程语言实现去除 PDF 水印的步骤: 1. 导入 PDF 编辑器库:Java 中常用的 PDF 编辑器库有 iText、PDFBox 等,可以通过 Maven 或 Gradle 等构建工具引入相关库。 2. 加载 PDF 文件:使用 PDF 编辑器库中的 API,加载需要去除水印PDF 文件。 3. 定位水印位置:使用 PDF 编辑器库中的 API,定位 PDF 文件中水印的位置。 4. 删除水印:使用 PDF 编辑器库中的 API,将定位到的水印删除。 5. 保存 PDF 文件:使用 PDF 编辑器库中的 API,保存已删除水印PDF 文件。 下面是使用 iText 库实现去除 PDF 水印的示例代码: ```java import java.io.File; import java.io.IOException; import com.itextpdf.io.IOException; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfName; import com.itextpdf.kernel.pdf.PdfObject; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfReader; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor; import com.itextpdf.kernel.pdf.canvas.parser.listener.TextRenderInfo; public class PdfWatermarkRemover { public static void main(String[] args) throws IOException { // 加载 PDF 文件 PdfDocument pdfDoc = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("output.pdf")); // 遍历 PDF 文件中的所有页面 for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) { PdfPage page = pdfDoc.getPage(i); // 遍历页面中的所有文本 PdfCanvasProcessor parser = new PdfCanvasProcessor(new TextRenderListener()); parser.processContent(page); } // 保存 PDF 文件 pdfDoc.close(); } private static class TextRenderListener implements IEventListener { @Override public void eventOccurred(IEventData data, EventType type) { if (data instanceof TextRenderInfo) { TextRenderInfo text = (TextRenderInfo) data; String textContent = text.getText(); // 判断文本是否为水印,如果是则删除该文本 if (textContent.contains("watermark")) { PdfObject obj = text.getPdfObject(); obj.getIndirectReference().getPdfObject().remove(PdfName.Matrix); } } } @Override public Set<EventType> getSupportedEvents() { return Collections.singleton(EventType.RENDER_TEXT); } } } ``` 以上代码中,我们遍历 PDF 文件中的所有页面和文本,判断文本是否为水印,如果是则删除该文本的 Matrix 对象,最后保存已删除水印PDF 文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值