pdf 加多列水印

效果如图

demo代码

package test;


import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;

import java.awt.*;
import java.io.*;

import java.util.*;
import java.util.List;

import javax.swing.*;

/**
 * 图片加水印,设置透明度
 */
public class WatermarkMainTest {

    public static void main(String[] args) throws DocumentException, IOException {
        List<String> watermarkNames = new ArrayList<>();
		watermarkNames.add("xx公司专用");
		watermarkNames.add("xxx|业务部");
		watermarkNames.add("2022-12-11 22:33");
		try {
            setWatermark2("C:\\Users\\demo\\Desktop\\out.pdf", "C:\\Users\\demo\\Desktop\\read.pdf",watermarkNames);
		} catch (Exception e) {
			e.printStackTrace();
		}

    }

    /**
     *
     * @param out 输出文件的位置
     * @param input 原PDF位置
     * @param waterMarkNames 水印内容
     * @throws DocumentException
     * @throws IOException
     */
    public static void setWatermark2(String out,  String input, List<String> waterMarkNames)
            throws Exception {
        PdfReader reader = null;
        PdfStamper stamper = null;
        try {
            File file2 = new File(out);
            if (file2.exists()) {
                file2.delete();
            }
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file2));
            reader = new PdfReader(input);
            stamper = new PdfStamper(reader, bos);
            // 获取总页数 +1, 下面从1开始遍历
            int total = reader.getNumberOfPages() + 1;
            // 使用classpath下面的字体库
            com.itextpdf.text.pdf.BaseFont base = null;
            // 区分Linux系统与windows系统
            String fontsPath = "C:/Windows/Fonts/simsun.ttc";//中文字体路径
            base = com.itextpdf.text.pdf.BaseFont.createFont(fontsPath+",1", com.itextpdf.text.pdf.BaseFont.IDENTITY_H, com.itextpdf.text.pdf.BaseFont.NOT_EMBEDDED);

            // 间隔
            int interval = -10;
            // 获取水印文字的高度和宽度
            int textH = 0, textW = 0;
            JLabel label = new JLabel();
            label.setText(waterMarkNames.get(0));
            FontMetrics metrics = label.getFontMetrics(label.getFont());
            //textH = metrics.getHeight();
            //textW = metrics.stringWidth(label.getText());
            // 根据自己需要可以调整水印的间隔
            textH = 16;
            textW = 182;
            System.out.println("textH: " + textH);
            System.out.println("textW: " + textW);

            // 设置水印透明度
            PdfGState gs = new PdfGState();
            gs.setFillOpacity(0.3f);
            gs.setStrokeOpacity(0.3f);

            Rectangle pageSizeWithRotation = null;
            PdfContentByte content = null;
            for (int i = 1; i < total; i++) {
                // 在内容上方加水印
                content = stamper.getOverContent(i);
                // 在内容下方加水印
                // content = stamper.getUnderContent(i);
                content.saveState();
                content.setGState(gs);

                // 设置字体和字体大小
                content.beginText();
                content.setFontAndSize(base, 9);

                // 获取每一页的高度、宽度
                pageSizeWithRotation = reader.getPageSizeWithRotation(i);
                float pageHeight = pageSizeWithRotation.getHeight();
                float pageWidth = pageSizeWithRotation.getWidth();

                // 根据纸张大小多次添加, 水印文字成30度角倾斜,根据自己的需要,对应的值调整
                for (int height = interval + textH; height < pageHeight; height = height + textH * 6) {
                    for (int width = interval + textW; width < pageWidth + textW; width = width + textW * 1) {
                        int len=0;
                        for (String waterMarkName : waterMarkNames) {
                            content.showTextAligned(Element.ALIGN_MIDDLE, waterMarkName, width - textW-90, height - textH-len*12, 30);
                            len++;
                        }
                    }
                }
                content.endText();
            }
        } catch (Exception e) {
            // 日志处理
           // log.error("水印异常--->waterName="+waterMarkNames.toString(),e);
            throw new Exception("水印异常");
        }finally {
            // 关流
            if(stamper != null){
                stamper.close();
            }
            if(reader != null){
                reader.close();
            }
        }
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
免费Spire.PDF for .NET 是一款由e-iceblue公司开发的专业性的PDF文档创建组件。它能够使用户在不用Adobe Acrobat和其他外部控件的情况下,运用.NET 应用程序阅读,编写和操纵PDF 文档。Spire.PDF for .NET不仅可以运用在服端比如:ASP.NET 或者其他环境,还可以应用在Windows Forms 应用程序中。Spire.PDF for .NET 适合应用于所有常见的坏境中,比如:创建好的PDF文档可以存到磁盘中, 还可以在Windows Forms应用程序,ASP.NET 应用程序客户端浏览器中保存为数据流。 Spire.PDF for .NET 功能丰富。 除了基本的功能比如:绘制多种图形,图片,创建窗体字段,插入页眉页脚,输入数据表,自动对大型表格进行分页外,Spire.PDF for .NET还支持PDF数字签名,将HTML转换成PDF格式,提取PDF文档中的文本信息和图片,存为文本格式和各种图片格式,甚至可以将PDF中的附件提取出来。 主要功能 支持嵌入式字体,Truetype 字体和CJK字体。 支持绘图。比如:矩形,环形,弧形,椭圆形,也可以自定笔刷将其填充。 可以将图片从数据流, 磁盘文件中载入到PDF 文档中。 在PDF 文档中既可以绘制梯状图形和矢量图像,还支持掩模和水印图像。 可以在PDF 文档中载入数据表。可以设置表中的行和的格式,还可以在表内加入图形元素。 自动对PDF 中的大型表格进行分页。 创建窗体字段。比如在PDF 文档中创建按钮,文本框,表框,复选框等等。 在PDF 中插入页眉页脚。 通过设置所有者密码和用户密码来加密PDF文档。 通过作者的签名来保护PDF文档。 读取当前PDF文档的表格并且填充表格。 HTML网页在转换到PDF文档时会拆分为多个大型页面,这些页面可以原原本本的展现在PDF文档中,而且在PDF文档的分页处没有任何文字的截断。用户还可以将这些网页在不需要临时文件的情况下,直接转换为数据流来创建PDF文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值