spire.pdf盖章(无水印免费无限制)

下载老版的spire.pdf.jar,就会在一页有水印,添加一页pdf,然后删掉最后一页就可以了;

jar资源地址:spire.pdf-3.7.4.jar

复制代码
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.junit.Test;

import com.spire.pdf.FileFormat;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.annotations.PdfRubberStampAnnotation;
import com.spire.pdf.annotations.appearance.PdfAppearance;
import com.spire.pdf.graphics.PdfImage;
import com.spire.pdf.graphics.PdfTemplate;
import com.spire.pdf.widget.PdfPageCollection;

public class SomeTest {

  public static void main(String[] args) {

    //创建PdfDocument对象,加载PDF测试文档
    PdfDocument doc = new PdfDocument();
    doc.loadFromFile("xxx.pdf");
    System.out.println(doc.getPages().getCount());
    //添加空白文档
    doc.getPages().add();
    PdfPageCollection pages = doc.getPages();

    System.out.println(pages.getCount());
    for (int i = 0; i < pages.getCount(); i++) {
      PdfPageBase page = doc.getPages().get(i);
      PdfRubberStampAnnotation stamp = getStamp(page);
      //添加图章到PDF
      page.getAnnotationsWidget().add(stamp);
    }
    System.out.println(doc.getPages().getCount());
    //保存文档
    doc.saveToFile("ImageStamp.pdf", FileFormat.PDF);
    //删除空白文档
    removeLast("ImageStamp.pdf");
  }

  private static void removeLast(String filePath) {
    try {
      // 加载PDF文档
      PDDocument document = PDDocument.load(new File(filePath));
      int pageNumberToRemove = document.getPages().getCount() - 1;
      // 获取要删除的页
      PDPage pageToRemove = document.getPage(pageNumberToRemove);

      // 删除页
      document.removePage(pageToRemove);

      // 保存修改后的PDF
      document.save(new File(filePath));

      // 关闭文档
      document.close();

      System.out.println("成功删除第 " + pageNumberToRemove + " 页!");
    } catch (IOException e) {
      e.printStackTrace();
    }
  }


  private static PdfRubberStampAnnotation getStamp(PdfPageBase page) {
    //加载印章图片
    PdfImage image = PdfImage.fromFile("章.png");
    //获取印章图片的宽度和高度
    int width = image.getWidth();
    int height = image.getHeight();

    //创建PdfTemplate对象
    PdfTemplate template = new PdfTemplate(width, height);
    //将图片绘制到模板  要在pdf上调整好大小
    template.getGraphics().drawImage(image, 50, 0, 100, 100);

    //创建PdfRubebrStampAnnotation对象,指定大小和位置
    Rectangle2D rect = new Rectangle2D.Float((float) (page.getActualSize().getWidth() - width - 0),
        (float) (page.getActualSize().getHeight() - height + 50), width, height);

    PdfRubberStampAnnotation stamp = new PdfRubberStampAnnotation(rect);

    //创建PdfAppearance对象
    PdfAppearance pdfAppearance = new PdfAppearance(stamp);
    //将模板应用为PdfAppearance的一般状态
    pdfAppearance.setNormal(template);
    //将PdfAppearance 应用为图章的样式
    stamp.setAppearance(pdfAppearance);
    return stamp;
  }
}
相关推荐
2601_962106642 小时前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java
RuoyiOffice3 小时前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
2601_962106643 小时前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
杨凯凡4 小时前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard4 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android4 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤5 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
aiks_yuan7 小时前
Java CPU 100% 怎么排查:JDK 11 起 jstack 自带线程 CPU 时间,不用再 top -H 换算十六进制(JDK 8、11、17 实测)
java
Flynn Liang9 小时前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices
Flynn Liang9 小时前
LangChain4j 1.23 架构全景:Java 大模型应用的 6 层抽象
java·langchain·大模型·rag·ai agent·langchain4j