Java添加PDF图章、动态图章

主要实现以下功能:

    1. 添加图片图章。即通过加载现有的图章(以图片形式),添加到PDF指定页面位置
    2. 添加动态图章。即加载PDF文档,并在动态的添加印章内容,包括印章字样、日期、时间、经办人、组织名称等。

具体实现过程

首先,准备要加图章(1.png)以及所加的文件(main.pdf、test.pdf),其次需要一些外部.jar包(Spire.Pdf.jar).

下载地址:Free Spire.PDF for Java v2.4.4(免费版)

添加图章


实现代码如下:    package org.zxd.com;

    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");

            //获取文档第1页            PdfPageBase page = doc.getPages().get(0);

            //加载印章图片            PdfImage image = PdfImage.fromFile("1.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("main.pdf",FileFormat.PDF);        }    }

运行截图:

    

添加动态图章

实现代码如下:    package org.zxd.com;

    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");

            //获取第1页            PdfPageBase page = document.getPages().get(0);

            //创建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.red));            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.getRed(), path);

            //在模板上绘制文字及动态日期            String str1 = "Audited\n";            String str2 = "Blog Center " + dateToString(new java.util.Date(),"yyyy-MM-dd HH:mm:ss");            template.getGraphics().drawString(str1, font1, solidBrush, new Point2D.Float(5, 5));            template.getGraphics().drawString(str2, 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("javatest.pdf");            document.close();        }

        //将日期转化成字符串        public static String dateToString(java.util.Date poDate,String pcFormat) {            SimpleDateFormat loFormat = new SimpleDateFormat(pcFormat);            return loFormat.format(poDate);        }    }

运行结果:


转载请标明出处!!!

【知识点】Java机密的更多相关文章

  1. 面试知识点——Java

    目录 Java容器 hashmap实现原理 java多线程 jvm内存模型 java 垃圾回收机制 对象存活状态检查 垃圾收集算法 垃圾收集器 内存分配与回收策略 java nio Java容器 ha ...

  2. 学校项目过程中知识点 Java 2015/9/15 晚

    ##命令行运行Java程序1.文件Java的源代码存放在扩展名为“.java”的文件中:Java源文件编译后,得到“.class”的文件2.方法命令行下编译java源代码的方法:javac  文件名. ...

  3. 面试常考知识点——Java(JVM,JDK,JRE)

    1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 答:(1)Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. ...

  4. Java基础知识点

    以下10点为JAVA 基础知识,后面将足以总结和完善以备面试 数据类型 (包装类,字符串,数组) 异常处理 Java IO和NIO 数据结构 (集合和容器 ) 多线程(并发) 网络通信(协议) 面向对 ...

  5. 知名互联网公司校招 Java 开发岗面试知识点解析

    天之道,损有余而补不足,是故虚胜实,不足胜有余. 本文作者在一年之内参加过多场面试,应聘岗位均为 Java 开发方向.在不断的面试中,分类总结了 Java 开发岗位面试中的一些知识点. 主要包括以下几 ...

  6. Java开发岗面试知识点解析

    本文作者参加过多场面试,应聘岗位均为 Java 开发方向.在不断的面试中,分类总结了 Java 开发岗位面试中的一些知识点. 主要包括以下几个部分: Java 基础知识点 Java 常见集合 高并发编 ...

  7. Java入门知识点

    Java入门知识点   Java源代码的流程 Java程序由.java文件生成,通过JVM进行编译得到字节文件.class class HelloWorld { public static void ...

  8. Java 开发岗面试知识点

    本文作者在一年之内参加过多场面试,应聘岗位均为 Java 开发方向.在不断的面试中,分类总结了 Java 开发岗位面试中的一些知识点. 主要包括以下几个部分: Java 基础知识点 Java 常见集合 ...

  9. 【笔试题】Java笔试题知识点

    Java高概率笔试题知识点 Java语法基础部分 [解析]java命令程序执行字节码文件是,不能跟文件的后缀名! 1.包的名字都应该是由小写单词组成,它们全都是小写字母,即便中间的单词亦是如此 2.类 ...

随机推荐

  1. iOS - 小功能 跳转到淘宝或天猫的商品展示详情页

    最近做iOS项目的时候遇到一个需求,点击广告页,跳转到淘宝或天猫的商品详情页. 具体需要是这样: 1)安装了淘宝:跳转到淘宝详情页. 2)没装淘宝,装了天猫:跳转到天猫详情页 3)淘宝.天猫都没装:跳 ...

  2. 【转载】 C#使用Math.Round方法对计算结果进行四舍五入操作

    在C#的数值运算中,有时候需要对计算结果进行四舍五入操作,此时就可使用内置方法Math.Round方法来实现四舍五入操作,Math.Round方法有多个重载函数,支持设置有效位数进行四舍五入,如果没有 ...

  3. Vue的11个生命周期函数的用法

    实例的生命周期函数(官方11个):beforeCreate:在实例部分(事件/生命周期)初始化完成之后调用.created:在完成外部的注入/双向的绑定等的初始化之后调用.beforeMount:在页 ...

  4. Android里的Dalvik、ART、JIT、AOT有什么关系?

    JIT,Just-in-time,即时编译,边运行边编译: AOT,Ahead Of Time,提前编译,指运行前编译. 区别 这两种编译方式的主要区别在于是否在“运行时”进行编译 优劣JIT优点: ...

  5. live555的使用(转载)

    Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现 了对多种音视频编码格式的音视频数据的流 ...

  6. xadmin安装

    1 安装满足django2的版本 pip3 install https://codeload.github.com/sshwsfc/xadmin/zip/django2 2 urls.py里面增加路由 ...

  7. JavaScript仿百度图片浏览效果(转载)

    转载来源:https://www.jb51.net/article/98030.htm 这是一个非常好的案例,然而jquery的时代正在徐徐关闭. 当你调整浏览器宽高,你会发现它不是自适应的.当你想把 ...

  8. 本地安装部署ActiveCollab

    ActiveCollab是一个非常易于使用.基于Web.开源的协作开发与项目管理工具. 我们公司一直在用这款工具,进行任务分配和时间填写,十分简便 ActiveCollab可以利用它轻松地搭建一个包括 ...

  9. com.mysql.jdbc.Driver not loaded. Are you sure you've included the correct jdbc driver in :jdbc_driver_library?

    把对应的jdbc jar包放到 /usr/share/logstash/logstash-core/lib/jars/路径 下即可.可以在配置文件不用配置驱动库.

  10. python高级特性-生成器

    在python中一边循环一边计算的机制成为生成器(generator) 在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行. 生成list > ...