图章(印章)是一种在合同、票据、公文等文件中表明法律效应、部门机关权威的重要指示物,常见于各种格式的文件、文档中。对于纸质文档可以手动盖章,但对于电子文档,则需要通过特定的方法来实现。本篇文档分享通过Java代码在PDF文档中添加图章的方法。内容将分两部分介绍:

1. 添加图片图章。即通过加载现有的图章(以图片形式),添加到PDF指定页面位置

2. 添加动态图章。即加载PDF文档,并在动态的添加印章内容,包括印章字样、日期、时间、经办人、组织名称等。

使用工具:Free Spire.PDF for Java v2.0.0

关于jar文件导入:

步骤1:步骤1:在Java程序中新建一个文件夹可命名为Lib。并将产品包中的2个jar文件复制到新建的文件夹下。

步骤2:复制文件后,添加到引用类库:选中这两个jar文件,点击鼠标右键,选择“Build Path” – “Add to Build Path”。完成引用。

Java示例(供参考)

1. 添加图片图章

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 java.awt.geom.Rectangle2D;

public class ImageStamp {

public static void main(String[] args) {

//创建PdfDocument对象,加载PDF测试文档

PdfDocument doc = new PdfDocument();

doc.loadFromFile("test.pdf");

//获取文档第3页

PdfPageBase page = doc.getPages().get(2);

//加载印章图片

PdfImage image = PdfImage.fromFile("stamp.png");

//获取印章图片的宽度和高度

int width = image.getWidth();

int height = image.getHeight();

//创建PdfTemplate对象

PdfTemplate template = new PdfTemplate(width, height);

//将图片绘制到模板

template.getGraphics().drawImage(image, 0, 0, width, height);

//创建PdfRubebrStampAnnotation对象,指定大小和位置

Rectangle2D rect = new Rectangle2D.Float((float) (page.getActualSize().getWidth() - width - 10), (float) (page.getActualSize().getHeight() - height - 60), width, height);

PdfRubberStampAnnotation stamp = new PdfRubberStampAnnotation(rect);

//创建PdfAppearance对象

PdfAppearance pdfAppearance = new PdfAppearance(stamp);

//将模板应用为PdfAppearance的一般状态

pdfAppearance.setNormal(template);

//将PdfAppearance 应用为图章的样式

stamp.setAppearance(pdfAppearance);

//添加图章到PDF

page.getAnnotationsWidget().add(stamp);

//保存文档

doc.saveToFile("ImageStamp.pdf",FileFormat.PDF);

}

}

图片图章添加效果:

2.添加动态图章

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.*;

import java.awt.*;

import java.awt.geom.Point2D;

import java.awt.geom.Rectangle2D;

import java.text.SimpleDateFormat;

public class DynamicStamp {

public static void main(String[] args) {

//创建PdfDocument对象

PdfDocument document = new PdfDocument();

//加载PDF文档

document.loadFromFile("test.pdf");

//获取第3页

PdfPageBase page = document.getPages().get(2);

//创建PdfTamplate对象

PdfTemplate template = new PdfTemplate(185, 50);

//创建两种字体

PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN ,15), true);

PdfTrueTypeFont font2 = new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN ,10), true);

//创建画刷

PdfSolidBrush solidBrush = new PdfSolidBrush(new PdfRGBColor(Color.blue));

Rectangle2D rect1 = new Rectangle2D.Float();

rect1.setFrame(new Point2D.Float(0,0),template.getSize());

//创建圆角矩形路径

int CornerRadius = 20;

PdfPath path = new PdfPath();

path.addArc(template.getBounds().getX(), template.getBounds().getY(), CornerRadius, CornerRadius, 180, 90);

path.addArc(template.getBounds().getX() + template.getWidth() - CornerRadius,template.getBounds().getY(), CornerRadius, CornerRadius, 270, 90);

path.addArc(template.getBounds().getX() + template.getWidth() - CornerRadius, template.getBounds().getY()+ template.getHeight() - CornerRadius, CornerRadius, CornerRadius, 0, 90);

path.addArc(template.getBounds().getX(), template.getBounds().getY() + template.getHeight() - CornerRadius, CornerRadius, CornerRadius, 90, 90);

path.addLine( template.getBounds().getX(), template.getBounds().getY() + template.getHeight() - CornerRadius, template.getBounds().getX(), template.getBounds().getY() + CornerRadius / 2);

//绘制路径到模板,并进行填充

template.getGraphics().drawPath(PdfPens.getBlue(), path);

//在模板上绘制文字及动态日期

String s1 = "已审核\n";

String s2 = "社区管理中心 " + dateToString(new java.util.Date(),"yyyy-MM-dd HH:mm:ss");

template.getGraphics().drawString(s1, font1, solidBrush, new Point2D.Float(5, 5));

template.getGraphics().drawString(s2, font2, solidBrush, new Point2D.Float(5, 28));

//创建PdfRubberStampAnnotation对象,并指定其位置和大小

Rectangle2D rect2= new Rectangle2D.Float();

rect2.setFrame(new Point2D.Float((float)(page.getActualSize().getWidth()-250),(float)(page.getActualSize().getHeight()-150)), template.getSize());

PdfRubberStampAnnotation stamp = new PdfRubberStampAnnotation(rect2);

//创建PdfAppearance对象,应用模板为一般状态

PdfAppearance appearance = new PdfAppearance(stamp);

appearance.setNormal(template);

//应用样式到图章

stamp.setAppearance(appearance);

//添加图章到Annotation集合

page.getAnnotationsWidget().add(stamp);

//保存文档

document.saveToFile("DynamicStamp.pdf");

document.close();

}

//将日期转化成字符串

public static String dateToString(java.util.Date poDate,String pcFormat) {

SimpleDateFormat loFormat = new SimpleDateFormat(pcFormat);

return loFormat.format(poDate);

}

}

动态图章添加效果:

java pdf添加图章_实例讲解Java处理PDF图章的方法相关推荐

  1. java自旋锁使用_实例讲解Java 自旋锁

    一直以来不是怎么清楚自旋锁,最近有点时间,好好的学习了一下: 所谓的自旋锁在我的理解就是多个线程在尝试获取锁的时候,其中一个线程获取锁之后,其他的线程都处在一直尝试获取锁的状态,不会阻塞!!!那么什么 ...

  2. java 内部类 加载_举例讲解Java的内部类与类的加载器

    内部类 class A { //Inner1 要在 A 初始化后 才能使用,即要被A的对象所调用 class Inner1 { int k = 0; // static int j = 0; //A加 ...

  3. java console 交互_实例讲解java中Console类的用法

    java的Console类的使用方法及实例 java的Console类的使用方法及实例 JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备.如果你的Java程序要与Win ...

  4. java 并发 变量_实例讲解Java并发编程之变量

    编写线程安全需要关心的: 1.共享的变量 2.可变的变量 共享意味着多个线程可以同时访问,可变意味着其值在生命周期可以改变. 例如以下count 变量: //线程不安全的类 public class ...

  5. java arraylist 添加对象_如何在Java中将对象添加到ArrayList

    我想向中添加一个对象ArrayList,但是每次我向ArrayList具有3个属性的新对象添加时objt(name, address, contact),都会出现错误. import java.uti ...

  6. java 流的概念_举例讲解Java中的Stream流概念

    1.基本的输入流和输出流 流是 Java 中最重要的基本概念之一.文件读写.网络收发.进程通信,几乎所有需要输入输出的地方,都要用到流. 流是做什么用的呢?就是做输入输出用的.为什么输入输出要用&qu ...

  7. java io 文件复制_实例讲述Java IO文件复制

    前言:IO流主要分为两大类,分别是字节流与字符流 注意: 1.音频文件.图片.视频(范围广),就用字节流 2.只涉及到文本的,就用字符流 使用字节流复制文本内容(其他文件也可以) 代码如下: impo ...

  8. java获取u盘_实例分享java监听u盘的方法

    package org.load.u; import java.io.File; import java.util.LinkedHashMap; import java.util.Map; // U盘 ...

  9. java 动态调用函数_深入讲解Java语言中的函数动态调用方式

    相 信 有 不 少 人 使 用C 语 言 的 函 数 指 针 实 现 过 函 数 的 动 态 调 用. 适 当 地 运 用 函 数 动 态 调 用 功 能 不 仅 能 减 少 代 码 数 量, 而 且 ...

最新文章

  1. java树 JTree实例(可动态添加节点)
  2. J2ME下的手机游戏的优化
  3. JQuery:多张图片的淡入淡出效果。
  4. POJ 2801 为什么相同功能的代码会wrong answer呢?求解释~~
  5. Java监控工具VisualVM
  6. Conversion of Continuous-Valued Deep Networks to Efficient Event-Driven Networks for Image
  7. AKKA HTTP 简单示例
  8. Centos7-安装Weblogic并配置 domain
  9. HDU1013 POJ1519 Digital Roots(解法三)
  10. c++时间片轮转rr进程调度算法_「学习笔记」时间片轮转(RR)调度算法(详解版)...
  11. Cameralink光端机
  12. 联想台式主机拆机教程_联想主机外壳怎么拆开_联想主机怎么拆图解
  13. 【面试】AI算法工程师---面试题!(第二部分:AI部分)
  14. dubbo之服务本地暴露
  15. 2020胡润80后白手起家富豪榜公布,掌门教育张翼强势登榜
  16. imx6q android nfs normal boot log
  17. mac系统如何新建文件
  18. 生活鸡汤---送给女人和男人的
  19. 数据分析终极一问:自然增长率,到底怎么算才合理!
  20. 京东联盟开发(6)——推广链接解析SKUID

热门文章

  1. 30岁生日快乐图片_50岁生日快乐心理
  2. linux中如何递归搜索文件,关于linux:递归查找具有特定扩展名的文件
  3. Centos7复制文件显示进度
  4. 基于QT的小型OA-ERP系统
  5. IDEA设置System.out.println()和main方法快捷键
  6. CSS布局——多列等高布局
  7. laravel 分表
  8. 不小心合并了icloud通讯录_如何在macOS和iCloud中合并和删除重复的联系人?
  9. HarmonyOS分布式教育,HarmonyOS Connect伙伴峰会,教育展品全新亮相
  10. Python SQLite3 安装 OpenVP* Web管理后台