• 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    造一个电子印章

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

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

    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;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

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

    运行代码测试

    在这里插入图片描述

    查看结果

    发现本地已经生成了结果
    在这里插入图片描述
    第一页
    在这里插入图片描述
    第二页
    在这里插入图片描述
    第三页
    在这里插入图片描述
    完美符合我们的期望!

    缺陷和不足

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

    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 分割的签章图片是动态计算的,页数特别多的话有可能会分不过来

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

  • 相关阅读:
    在Arm/Linux下安装python的pytorch库
    基于nodejs的电影交流网站
    阅读 | 003《知识图谱发展报告2022》(二)知识表示学习
    2022 MySQL8.0.29安装详细教程(妈妈级)
    JUC并发编程——单例模式(基于狂神说的学习笔记)
    hadoop解决数据倾斜的方法
    RESTful 接口设计规范-个人总结
    复习单片机:IO串转并(内含:1. 74HC595 芯片介绍+2. 硬件设计+3. 软件设计+4.原始代码+5. 实验现象)
    编写支持灵活过滤的列表接口以解析前端过滤表达式
    C#中Visual Studio如何为解决方案设置启动项目
  • 原文地址:https://blog.csdn.net/weixin_46713508/article/details/125488202