JAVA PDF 给PDF添加文字/图片水印(指定内容),并且设置位置

2024-07-12 1415阅读

提示:看完这个简单的demo 后就知道怎样去操作一个PDF了

文章目录

  • 前言
  • 一、前提准备
  • 二、使用步骤
    • 1.引入库
    • 2.以下是部分代码的作用
  • 总结

    前言

    提示:操作PDF其实是一件很简单的事情,比一般的CRUD都简单

    例如:我们拿到了一个需求,我需要给这个PDF设置一个电子签名(就是一张图片盖在这个PDF上,然后输出到服务器的某个指定文件夹中)和年月日(自定义的文字)


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、前提准备

    示例:因为我这个是demo 所以我们准备两个文件

               1.原始PDF(模板PDF,需要操作的文件)   J:/test.pdf

               2.需要放到PDF种的签名(就是一张图片嘛)J:/666.png

    二、使用步骤

    1.引入库

    代码如下(示例):

    其实我们只需要用到两个包,maven引入即可(复制过去)
    
    
        org.apache.pdfbox
        pdfbox
        2.0.28
    
    
    
        com.itextpdf
        itextpdf
        5.5.13.3
    

    2.以下是部分代码的作用

    代码如下(示例):

    首先我们需要读取这两个文件(路径换成你自己的服务器路径就好)File file = ResourceUtils.getFile("J:/test.pdf");
    Image img = Image.getInstance("J:/ikun.jpg");
      然后我们需要提前设置需要输出的路径(就是你生成后文件放到哪儿)
    PdfStamper stamper = new PdfStamper(reader, Files.newOutputStream(Paths.get("J:/abc.pdf")));

    图片操作的代码块

    PdfGState pdfGState = new PdfGState();
    pdfGState.setFillOpacity(0.7F);
    contentByte.setGState(pdfGState);
    //图片的位置
    img.setAbsolutePosition(430, 220);
    //这是图片的尺寸
    img.scaleAbsolute(100, 100);
    img.setCompressionLevel(100);
    

    文字的代码块

    //设置字体大小contentByte.setFontAndSize(BaseFont.createFont(fontFile.getAbsolutePath(),BaseFont                .IDENTITY_H,BaseFont.NOT_EMBEDDED), 13f);
    // 设置文字
    contentByte.setColorFill(BaseColor.LIGHT_GRAY);
    contentByte.showTextAligned(Element.ALIGN_CENTER, "13511111111", 450, 200, 0);
    contentByte.showTextAligned(Element.ALIGN_CENTER,                 String.valueOf(LocalDate.now().getYear()), 450, 143, 0);
    contentByte.showTextAligned(Element.ALIGN_CENTER,                 String.valueOf(LocalDate.now().getMonthValue()), 490, 143, 0);
    contentByte.showTextAligned(Element.ALIGN_CENTER,                 String.valueOf(LocalDate.now().getDayOfMonth()), 128, 130, 0);

    上面就是文件和文字的操作

    3.总体的DEMO代码

    package com.cm.email;
    import com.itextpdf.text.BaseColor;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.Element;
    import com.itextpdf.text.Image;
    import com.itextpdf.text.pdf.*;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.util.ResourceUtils;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.time.LocalDate;
    @Slf4j
    @RestController
    public class WaterMarkUtils {
        @PostMapping("/set-pdf")
        public void pdfs() throws DocumentException, IOException {
            File file = ResourceUtils.getFile("J:/test.pdf");
            Image img = Image.getInstance("J:/ikun(1).jpg");
            File fontFile = ResourceUtils.getFile("classpath:font/simfang.ttf");
            InputStream inputStream = Files.newInputStream(file.toPath());
            // 读取原始 PDF 文件
            PdfReader reader = new PdfReader(inputStream);
            PdfStamper stamper = new PdfStamper(reader, Files.newOutputStream(Paths.get("J:/abc.pdf")));
            try {
                // 获取 PDF 中的页数
                int pageCount = reader.getNumberOfPages();
                // 获取第几页pdf
                PdfContentByte contentByte = stamper.getOverContent(pageCount);
                contentByte.beginText();
                //给图片设置透明度
                PdfGState pdfGState = new PdfGState();
                pdfGState.setFillOpacity(0.7F);
                contentByte.setGState(pdfGState);
                //图片的位置
                img.setAbsolutePosition(430, 220);
                //这是图片的尺寸
                img.scaleAbsolute(100, 100);
                img.setCompressionLevel(100);
                //设置字体大小
                contentByte.setFontAndSize(BaseFont.createFont(fontFile.getAbsolutePath(),BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED), 13f);
                // 设置文字
                contentByte.setColorFill(BaseColor.LIGHT_GRAY);
                contentByte.showTextAligned(Element.ALIGN_CENTER, "13511111111", 450, 200, 0);
                contentByte.showTextAligned(Element.ALIGN_CENTER, String.valueOf(LocalDate.now().getYear()), 450, 143, 0);
                contentByte.showTextAligned(Element.ALIGN_CENTER, String.valueOf(LocalDate.now().getMonthValue()), 490, 143, 0);
                contentByte.showTextAligned(Element.ALIGN_CENTER, String.valueOf(LocalDate.now().getDayOfMonth()), 128, 130, 0);
                //添加图品结束等等
                contentByte.addImage(img);
                contentByte.endText();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                // 保存修改后的 PDF 文件并关闭文件流
                stamper.close();
                reader.close();
            }
        }
    }
    

    4.具体效果

    JAVA PDF 给PDF添加文字/图片水印(指定内容),并且设置位置


    总结

    提示:关于字体这些东西,还有比如说文字的颜色啊,可以自己去看看,这里只是简单的演示

             以上就是今天要讲的内容,本文仅仅简单介绍了java操作PDF的使用,代理直接拿过去运行即可。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]