Java使用itextpdf实现生成PDF并添加图片,水印和文字

 更新时间:2024年02月15日 08:05:57   作者:alex很累  
这篇文章主要为大家详细介绍了Java在使用itextpdf实现生成PDF时如何实现添加图片,水印和文字等效果,感兴趣的小伙伴可以跟随小编一起学习一下

一、概述

在上一篇博客中,介绍了excel转pdf的方法;在这里,整理了一些方法:在生成pdf时,插入图片、新增水印、添加文字等。

二、依赖

依赖和上一篇博客相同,在这里不再赘述。

三、相关工具类

1. FontGenerater.java (在上篇博客中,已贴出)

2. Excel2Pdf.java (在上篇博客中,已贴出)

3. PDFUtil.java

public class PDFUtil {
    /**
     * 给pdf添加图片水印
     * @param waterMar
     * @param imgpath 图片路径
     * @throws Exception
     */
    public static void addImgWaterMark(PdfContentByte waterMar, String imgpath) throws Exception {
        waterMar.beginText();

        PdfGState gs = new PdfGState();
        // 设置填充字体不透明度为0.4f
        gs.setFillOpacity(0.2f);
        waterMar.setFontAndSize(FontGenerater.getFont(FontGenerater.FONT_SONTI_NAME), 40);
        // 设置透明度
        waterMar.setGState(gs);
        // 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
        Image img = Image.getInstance(imgpath);
        img.setAbsolutePosition(200, 380);
        img.scaleAbsolute(200, 200);

        waterMar.addImage(img);
        // 设置水印颜色
        waterMar.setColorFill(BaseColor.GRAY);

        //结束设置
        waterMar.endText();
        waterMar.stroke();
    }

    /**
     * 给pdf添加文字水印(平铺)
     * @param waterMar
     * @param text 水印文本
     * @throws Exception
     */
    public static void addTextFullWaterMark(PdfContentByte waterMar, String text) throws Exception {
        waterMar.beginText();

        PdfGState gs = new PdfGState();
        // 设置填充字体不透明度为0.4f
        gs.setFillOpacity(0.2f);
        waterMar.setFontAndSize(FontGenerater.getFont(FontGenerater.FONT_SONTI_NAME), 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(BaseColor.GRAY);

        //结束设置
        waterMar.endText();
        waterMar.stroke();
    }

    /**
     * 给pdf添加文字水印(单个)
     * @param waterMar
     * @param text 水印文本
     * @throws Exception
     */
    public static void addTextWaterMark(PdfContentByte waterMar, String text) throws Exception {
        waterMar.beginText();

        PdfGState gs = new PdfGState();
        // 设置填充字体不透明度为0.4f
        gs.setFillOpacity(0.2f);
        waterMar.setFontAndSize(FontGenerater.getFont(FontGenerater.FONT_SONTI_NAME), 80);
        // 设置透明度
        waterMar.setGState(gs);
        // 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
        waterMar.showTextAligned(Element.ALIGN_RIGHT, text, 475, 600, 45);

        // 设置水印颜色
        waterMar.setColorFill(BaseColor.GRAY);

        //结束设置
        waterMar.endText();
        waterMar.stroke();
    }

    /**
     * 添加页眉、页脚
     * @param writer
     * @param content
     * @param pagewidth
     * @param pageheight
     * @throws Exception
     */
    public static void addText(PdfWriter writer, String content, int pagewidth, int pageheight) throws Exception {
        PdfPTable table = new PdfPTable(1);
        table.setTotalWidth(530);
        PdfPCell cell = new PdfPCell(new Phrase(content, Excel2Pdf.getFont(FontGenerater.FONT_SONTI_NAME, 12, false)));
        cell.setBorder(0);
        // cell.setPaddingLeft(30f);
        cell.setPaddingTop(-15f);
        cell.setPaddingRight(20f);

        table.addCell(cell);
        Header event = new Header(table, pagewidth, pageheight);
        writer.setPageEvent(null);
        writer.setPageEvent(event);
    }

    //页眉事件
    private static class Header extends PdfPageEventHelper {
        public static PdfPTable header;
        public int pagewidth;
        public int pageheight;

        public Header(PdfPTable header, int pagewidth, int pageheight) {
            Header.header = header;
            this.pagewidth = pagewidth;
            this.pageheight = pageheight;
        }

        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            //把页眉表格定位
            header.writeSelectedRows(0, -1, this.pagewidth, this.pageheight, writer.getDirectContent());
        }
    }

    /**
     * 添加图片
     * @param document
     * @param imgPath
     * @param newWidth
     * @param newHeight
     * @param absoluteX
     * @param absoluteY
     * @throws IOException
     * @throws DocumentException
     */
    public static void addImg(Document document, String imgPath, float newWidth, float newHeight,
                              float absoluteX, float absoluteY) throws IOException, DocumentException {
        Image img1 = Image.getInstance(imgPath);
        img1.setAbsolutePosition(absoluteX, absoluteY);
        img1.scaleAbsolute(newWidth, newHeight);
        document.add(img1);
    }
}

四、示例

1.添加图片水印

// A4大小
RectangleReadOnly shuban = new RectangleReadOnly(PageSize.A4);
Document document = new Document(shuban);
// 获取一个pdfwriter实例
FileOutputStream stream = new FileOutputStream("D:\\website\\demo.pdf");
PdfWriter writer = PdfWriter.getInstance(document, stream);
// 打开document
document.open();
// 新增页
document.newPage();
// **************添加水印**************
PdfContentByte waterMar = writer.getDirectContentUnder();
PDFUtil.addImgWaterMark(waterMar, "D:\\website\\java.png");
// **************完成图片水印添加***********
// 关闭
document.close();
writer.close();
stream.close();

添加图片水印示例

2.添加平铺的文字水印

// **************添加平铺的文字水印**************
PdfContentByte waterMar = writer.getDirectContentUnder();
String text = "这是一个示例";
PDFUtil.addTextFullWaterMark(waterMar, text);
// **************完成水印***********************

添加平铺的文字水印示例

3.添加单个文字水印

// **************添加单个的文字水印**************
PdfContentByte waterMar = writer.getDirectContentUnder();
String text = "这是一个示例";
PDFUtil.addTextWaterMark(waterMar, text);
// **************完成水印***********************

添加单个文字水印示例

4.插入文字、图片

// 插入文字,最后两个参数是文字的位置
PDFUtil.addText(writer, "这是一段文字", 480, 802);
// 插入图片,第二、三个参数表示图片宽高,第四、五个参数表示位置
PDFUtil.addImg(document, "D:\\website\\start.png", 100, 100, 70, 700);

插入文字、图片示例

以上就是Java使用itextpdf实现生成PDF并添加图片,水印和文字的详细内容,更多关于Java itextpdf生成PDF的资料请关注脚本之家其它相关文章!

相关文章

  • Mybatis plus实现Distinct去重功能

    Mybatis plus实现Distinct去重功能

    这篇文章主要介绍了Mybatis plus实现Distinct去重功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Spring Boot多数据源事务@DSTransactional的使用详解

    Spring Boot多数据源事务@DSTransactional的使用详解

    本文主要介绍了Spring Boot多数据源事务@DSTransactional的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • mybatis中oracle实现分页效果实例代码

    mybatis中oracle实现分页效果实例代码

    实现分页的方式有很多,但常用的是通过SQL来显示分页。这篇文章主要介绍了mybatis中oracle实现分页效果实例代码,有兴趣的可以了解一下。
    2017-04-04
  • Java 线程安全与 volatile与单例模式问题及解决方案

    Java 线程安全与 volatile与单例模式问题及解决方案

    文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字可同时解决内存可见性和指令重排问题,并结合单例模式中的饿汉与懒汉实现方式分析线程安全的处理,感兴趣的朋友一起看看吧
    2025-06-06
  • @Transactional注解异常报错之多数据源详解

    @Transactional注解异常报错之多数据源详解

    这篇文章主要介绍了@Transactional注解异常报错之多数据源详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Mybatis-Plus雪花id的使用以及解析机器ID和数据标识ID实现

    Mybatis-Plus雪花id的使用以及解析机器ID和数据标识ID实现

    这篇文章主要介绍了Mybatis-Plus雪花id的使用以及解析机器ID和数据标识ID实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Spring Security结合JWT的方法教程

    Spring Security结合JWT的方法教程

    这篇文章主要给大家介绍了关于Spring Security结合JWT的方法教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • Java将字符串String转换为整型Int的两种方式

    Java将字符串String转换为整型Int的两种方式

    这篇文章主要介绍了Java如何将字符串String转换为整型Int,在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换,本文通过实例代码给大家详细讲解,需要的朋友可以参考下
    2023-04-04
  • java图论普利姆及克鲁斯卡算法解决最小生成树问题详解

    java图论普利姆及克鲁斯卡算法解决最小生成树问题详解

    这篇文章主要为大家介绍了java图论普利姆算法及克鲁斯卡算法解决最小生成树问题的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • Java微信扫码登录功能并实现认证授权全过程

    Java微信扫码登录功能并实现认证授权全过程

    这篇文章主要给大家介绍了关于Java微信扫码登录功能并实现认证授权的相关资料,要在Java中实现微信扫码登录,您可以按照以下步骤进行操作,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10

最新评论