Java实现在PDF中添加骑缝章

Posted 梦与光同行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现在PDF中添加骑缝章相关的知识,希望对你有一定的参考价值。

什么是缝骑章?

骑缝章(Paging seal.)是海关常用词汇。为了保证海关监管货物留存单据的完整齐全以及核对有关单证,在单据交接处所加盖的印章。

在两张纸交接处的印章。这种印章多盖在条据、证书或其他应用文书与存根连接的地方。加盖这种印章,具有以备存查和防止伪造的作用。

骑缝章是用于往来业务合同,以确保合同真实、有效的印章加盖方法,是一种防范风险的重要方式

不理解?没关系,找几张图看下就知道了

类似这样

这样

还有这样

看到这我想起来了小学的时候在厚厚的课本的,用笔在书的全部页码上写自己的名字,这样每张纸都会有痕迹,是不是很像呀

好了言归正传,接下来就使用Java代码进行生成缝骑章

首先引入相关依赖

  <!--骑缝章相关依赖--->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.13</version>
        </dependency>

        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId>
            <version>2.0.1</version>
        </dependency>

在resources目录下新建license.xml 代码如下

<License>
  <Data>
    <Products>
      <Product>Aspose.Total for Java</Product>
      <Product>Aspose.Words for Java</Product>
    </Products>
    <EditionType>Enterprise</EditionType>
    <SubscriptionExpiry>20991231</SubscriptionExpiry>
    <LicenseExpiry>20991231</LicenseExpiry>
    <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
  </Data>
  <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>

造一个电子印章

印章哪里来呢? 我们可以做一个假的玩玩

这里用到一个平台 官网如下

http://www.395.net.cn/

根据自己的需求制造 然后保存本地

然后制造一个PDF(尽量多弄几页进行测试)

可以使用工具把word转换为pdf也是可以的
这里我用了三页

编写Java代码如下

package dmyz.util;

import com.spire.pdf.*;
import com.spire.pdf.graphics.PdfGraphicsUnit;
import com.spire.pdf.graphics.PdfImage;
import com.spire.pdf.graphics.PdfUnitConvertor;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * @Author  魏一鹤
 * @Description  骑缝章生成
 * @Date 17:03 2022/6/27
**/

public class AcrossPageSeal 
    public static void main(String[] args) throws IOException 
        //要生成的文件模板
        PdfDocument pdf = new PdfDocument();
        pdf.loadFromFile("D:\\\\File\\\\test\\\\wyh\\\\3页.pdf");
        //获取分割后的印章图片
        BufferedImage[] images = GetImage(pdf.getPages().getCount());
        float x = 0;
        float y = 0;
        //实例化PdfUnitConvertor类
        PdfUnitConvertor convert = new PdfUnitConvertor();
        PdfPageBase pageBase;
        //将图片绘制到PDF页面上的指定位置
        for (int i = 0; i < pdf.getPages().getCount(); i++)
        
            BufferedImage image= images[ i ];
            pageBase = pdf.getPages().get(i);
            x = (float)pageBase.getSize().getWidth() - convert.convertUnits(image.getWidth(), PdfGraphicsUnit.Point, PdfGraphicsUnit.Pixel) + 40;
            y = (float) pageBase.getSize().getHeight()/ 2;
            pageBase.getCanvas().drawImage(PdfImage.fromImage(image), new Point2D.Float(x, y));
        
        System.out.println("x = " + x);
        System.out.println("y = " + y);
        //最终生成缝骑章   的结果
        pdf.saveToFile("D:\\\\File\\\\test\\\\wyh\\\\Result.pdf");

    

    //定义GetImage方法,根据PDF页数分割印章图片
    static BufferedImage[] GetImage(int num) throws IOException 
        String originalImg = "D:\\\\File\\\\test\\\\wyh\\\\魏一鹤的测试印章.png";
        BufferedImage image = ImageIO.read(new File(originalImg));
        int rows = 1;
        int cols = num;
        int chunks = rows * cols;
        int chunkWidth = image.getWidth() / cols;
        int chunkHeight = image.getHeight() / rows;
        int count = 0;
        BufferedImage[] imgs = new BufferedImage[ chunks ];
        for (int x = 0; x < rows; x++) 
            for (int y = 0; y < cols; y++) 
                imgs[ count ] = new BufferedImage(chunkWidth, chunkHeight, image.getType());
                Graphics2D gr = imgs[ count++ ].createGraphics();
                gr.drawImage(image, 0, 0, chunkWidth, chunkHeight,
                        chunkWidth * y, chunkHeight * x,
                        chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, Color.WHITE,null);
                gr.dispose();
            
        
        return imgs;
    


记得把文件换成自己本地的哦

运行代码测试

查看结果

发现本地已经生成了结果

第一页

第二页

第三页

完美符合我们的期望!

缺陷和不足

第一页会有这个错
已经解决并且发布文章,详见

https://blog.csdn.net/weixin_46713508/article/details/125488915?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22125488915%22%2C%22source%22%3A%22weixin_46713508%22%7D&ctrtid=eX2p7

项目目录如下

注意事项

1 需要注意是不是本地文件目录
2 分割的签章图片是动态计算的,页数特别多的话有可能会分不过来

欢迎大家评论留言补充完善和观看!

以上是关于Java实现在PDF中添加骑缝章的主要内容,如果未能解决你的问题,请参考以下文章

Java 处理PDF图章(印章)——图片图章动态图章

C#如何在PDF文件添加图片印章

无法使用 itext7 使用 Java 语言在仅 skia 生成的 pdf 上放置印章(显示倒置印章)

C#如何在PDF文件添加图片印章

区块链云智能印章“甘道云玺”,让“萝卜章”无处遁形

使用iText7操作PDF