基于springboot的spire.pdf添加印章

在一些场合,我们往往需要使用印章来给每页文档加盖一个印章,以表示该文档经过某个部门的认证的,常规的做法就是打印文档后盖章,如果需要电子档再行扫描一下。这样的处理,如果文档很多,且仅仅需要电子文档的就很麻烦了,需要打印再盖章再扫描,而且电子文档往往有失真的问题。本篇随笔介绍如何在在Winform程序中使用Spire.Pdf实现页面添加印章处理,解决这一痛处。下面我使用springboot利用spire.pdf添加印章。

代码结构如下:

 我们先弄一个透明的图章:

pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tlgen</groupId>
    <artifactId>tlgen-pdf-signature</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>tlgen-pdf-signature</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>e-iceblue</groupId>
            <artifactId>spire.pdf</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>com.e-iceblue</id>
            <url>http://repo.e-iceblue.cn/repository/maven-public/</url>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 核心代码如下:

package com.stamp;

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("pdf/04视图.pdf");
 
        System.out.println(doc.getPages().getCount());

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

        //加载印章图片
        PdfImage image = PdfImage.fromFile("signature/1600222639915.png");
        System.out.println("印章信息" + image);
        //获取印章图片的宽度和高度
        int width = image.getWidth();
        int height = image.getHeight();

        //创建PdfTemplate对象
        PdfTemplate template = new PdfTemplate(width, height);
        //将图片绘制到模板 -300是我自己生成的印章大小比300大 要在pdf上调整好大小
        template.getGraphics().drawImage(image, 210, 0, width-300, height-300);

        //创建PdfRubebrStampAnnotation对象,指定大小和位置
        Rectangle2D rect = new Rectangle2D.Float((float) (page.getActualSize().getWidth() - width  -0), (float) (page.getActualSize().getHeight() - height + 180), 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);
    }
}

运行如下:

可以看到印章出来了,但是页面有报错

Evaluation Warning : The document was created with Spire.PDF for Java.

我们 用一个白底的图片覆盖字样,最后在删除即可:

代码改动如下:

package com.stamp;

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("pdf/04视图.pdf");

        //添加空白文档
        doc.getPages().add();

        System.out.println(doc.getPages().getCount());

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

        //加载印章图片
        PdfImage image = PdfImage.fromFile("signature/1600222639915.png");
        System.out.println("印章信息" + image);
        //获取印章图片的宽度和高度
        int width = image.getWidth();
        int height = image.getHeight();

        //创建PdfTemplate对象
        PdfTemplate template = new PdfTemplate(width, height);
        //将图片绘制到模板 -300是我自己生成的印章大小比300大 要在pdf上调整好大小
        template.getGraphics().drawImage(image, 210, 0, width-300, height-300);

        //创建PdfRubebrStampAnnotation对象,指定大小和位置
        Rectangle2D rect = new Rectangle2D.Float((float) (page.getActualSize().getWidth() - width  -0), (float) (page.getActualSize().getHeight() - height + 180), 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.getPages().remove(doc.getPages().get(doc.getPages().getCount()-1));

        //保存文档
        doc.saveToFile("ImageStamp.pdf",FileFormat.PDF);
    }
}

也就是初始化的时候先生成一个空白文档,最后在删除。

效果如下:

 以上就是生成 电子盖章的一个插件,这种可以批量生成盖章文件,doc.getPages().get(0) 找到多少页,调整印章位置即可

猜你喜欢

转载自blog.csdn.net/lchmyhua88/article/details/119980039
今日推荐