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

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

文章目录


前言

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

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


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

一、前提准备

示例:因为我这个是demo 所以我们准备两个文件
           1.原始PDF(模板PDF,需要操作的文件)   J:/test.pdf

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

二、使用步骤

1.引入库

代码如下(示例):

其实我们只需要用到两个包,maven引入即可(复制过去)
<!-- pdfbox -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.28</version>
</dependency>
<!-- itextpdf -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.3</version>
</dependency>

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的使用,代理直接拿过去运行即可。

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实现PDF 转换为图片可以使用 Apache PDFBox 库,而将图片转换为 PDF 可以使用 iText 库。以下是实现PDF 转换为图片,去掉水印后再转换为 PDF 的示例代码: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.rendering.RenderDestination; import org.apache.pdfbox.rendering.RenderedImage; import org.apache.pdfbox.rendering.RenderingHints; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import java.util.List; public class PdfWatermarkRemover { public static void main(String[] args) { try { // 读取原始 PDF 文件 PDDocument document = PDDocument.load(new File("original.pdf")); // 获取 PDF 页面数量 int pageCount = document.getNumberOfPages(); // 创建一个 PDF 渲染器 PDFRenderer renderer = new PDFRenderer(document); // 创建一个图片列表 List<BufferedImage> images = new ArrayList<>(); // 遍历每一页 for (int i = 0; i < pageCount; i++) { // 渲染 PDF 页面为图片 BufferedImage image = renderer.renderImageWithDPI(i, 300, RenderingHints.VALUE_RENDER_QUALITY); // 将图片添加到列表中 images.add(image); } // 关闭 PDF 文档 document.close(); // 创建一个 iText 文档 com.itextpdf.text.Document itextDocument = new com.itextpdf.text.Document(); // 创建一个 PDF 输出器 com.itextpdf.text.pdf.PdfWriter writer = com.itextpdf.text.pdf.PdfWriter.getInstance(itextDocument, new FileOutputStream("output.pdf")); itextDocument.open(); // 遍历每张图片 for (BufferedImage image : images) { // 去掉图片上的水印 Graphics2D g2d = image.createGraphics(); g2d.setComposite(AlphaComposite.Clear); g2d.fillRect(0, 0, image.getWidth(), image.getHeight()); g2d.dispose(); // 将图片添加到 iText 文档中 com.itextpdf.text.Image itextImage = com.itextpdf.text.Image.getInstance(image, null); itextDocument.add(itextImage); } // 关闭 iText 文档 itextDocument.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 需要注意的是,这段代码只能移除一些简单的文字水印,如果水印图片或者其他复杂的形式,可能需要更复杂的处理方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值