跳转至

自由签章接口文档

基本介绍

该签章接口不依赖方案的设置的签章内容,直接使用接口传递过来的信息进行签署。接口传递的数据包括所有需要签署的印章。 每个印章涉及到签章类型、签章图片、签章位置等信息。

需要签署的文件和签章图片等,通过接口进行传输。

接口名称

/api/rawsign?plan_id=5&app_id=

接口调用方法

POST方法,采用使用multipart/form-data格式上传。

FORM中上传文件的字段名

  1. file2signed:需要签署的文件,一次接口调用签署一个文件,文件大小不能超过100M。该字段的名称固定。
  2. 其它文件:其它文件,如图片等,名称可以自定义,但是不能与file2signed重复。确保唯一。用于传输签名文件、数字证书文件。
  3. stamps: list列表,utf8编码,json格式,用于传输需要签署的印章信息,包括印章类型、印章图片、印章位置等信息。印章信息的具体细节如下所示。
  4. metadata: json格式,utf8编码,文件元数据,可以为空。

印章信息定义

  1. 骑缝章字段
字段名称 字段类型 是否必须 描述
id int 印章编号,必须填写,确保唯一,可以自定义
stamp_type string 印章类型,I为图片印章,T为文字印章, S为骑缝章
name string 印章名称,便于后续调试
image string 图片印章必选 骑缝章/图片印章时,FORM表单对应的文件字段名称
image_width int 骑缝章/图片印章必选 宽度,毫米
image_height int 骑缝章/图片印章必选 高度,毫米
maxpages_one_seal int 可选 一个骑缝章默认最多盖多少页?超过这个页数,自动盖下一个骑缝章
firstpage_coverage int 可选 默认20。骑缝章第一页和最后一页至少占据印章宽度的百分比,防止页数过多,第一页和最后一页印章上的图片很少。20表示占据20%
skip_first_pages int 可选 前多少页不盖骑缝章,默认是0
skip_last_pages int 可选 后多少页不盖骑缝章,默认是0
pos_type char(1) 可选 M居中,U 居上,B 居下,默认居中
  1. 文字印章字段

文字印章支持边框、底纹颜色和链接设置

字段名称 字段类型 是否必须 描述
id int 印章编号,必须填写,确保唯一,可以自定义
stamp_type string 印章类型,I为图片印章,T为文字印章, S为骑缝章
name string 印章名称,便于后续调试
content string 文字印章必选 文字印章时的文字内容
font_size int 文字印章可选 字体大小,默认14px
font_color string 文字印章可选 颜色,默认黑色#000000,使用#16进制表示颜色
at_pages string 可选 印章所在页面 1~-1,表示第一页到最后一页 1,-2,3~5 表示第1页,第2页,第3页到第5页
link_href string 可选 设置后,点击文字,将跳往该链接
draw_rect string 可选 是否启用底纹边框设置
rect_fill_color string 可选 底纹颜色 #ffffff 16进制表示颜色
rect_border_color string 可选 边框颜色 #ffffff 16进制表示颜色
rect_fill_opacity int 可选 底纹透明度 0~100,默认100,不透明
rect_border_opacity int 可选 边框透明度 0~100,默认100,不透明
rect_border_width int 可选 边框宽度 0~15
rect_border_radius int 可选 边框圆角 0~15
rect_border_dash int 可选 边框虚线间隔 0~15
rect_padding int 可选 边框缩进 0~15
  • 印章定位见下方印章定位

  • 图片印章字段

字段名称 字段类型 是否必须 描述
id int 印章编号,必须填写,确保唯一,可以自定义
stamp_type string 印章类型,I为图片印章,T为文字印章, S为骑缝章
name string 印章名称,便于后续调试
image string 图片印章必选 骑缝章/图片印章时,FORM表单对应的文件字段名称
image_width int 骑缝章/图片印章必选 宽度,毫米
image_height int 骑缝章/图片印章必选 高度,毫米
at_pages string 可选 印章所在页面 1~-1,表示第一页到最后一页 1,-2,3~5 表示第1页,第2页,第3页到第5页
stamp_cert char(1) 可选 是否添加数字证书, T 使用数字证书,F 不使用
cert string stamp_cert="T" 时必填 FORM表单对应的文件字段名称
cert_password string stamp_cert="T" 时必填 数字证书密码
sign_at string stamp_cert="T" 时生效 , 设置签署时间,格式为 "2022-11-01T10:10:10", 不填写默认为当前时间
opacity int 可选 印章透明度,默认100,不透明
  • 印章定位见下方印章定位

  • 印章定位相关字段

对于文字章和图片章的系统定位,系统提供“基于坐标”和“基于文字”进行定位。

4.1 通过坐标进行定位

字段名称 字段类型 是否必须 描述
pos_type Char(1) 定位方式 C 坐标定位,T 文字定位
pos_cord string 坐标定位值, 形如 40x50,左下角为0点,图片的左下角将被设置为该坐标

4.2 通过文字进行定位

字段名称 字段类型 是否必须 描述
pos_type Char(1) 定位方式 C 坐标定位,T 文字定位
pos_txt string 通过文字的位置来定位,图片的中心和文字的中心重合
pos_offset string 坐标偏移。找到文字之后,基于文字位置继续进行偏移。形如:{"top":10,"bottom":10,"left":10,"right":10}, 表示上、下、左、右的偏移量,单位为毫米

示例代码

python3 版本,需要安装requests库。 pip install requests

import requests
import json
import time
import hashlib


def test_raw_sign_api(pdffile, pfx, pfxpwd, png):
    # API endpoint

    # 定义请求参数  
    timestamp = int(time.time())
    plan_id = 5 
    appid = 'rr16vt69h9a3av00pfgnbzei3l'
    appsecret = 'u8taf3f4hfd221mkky48awp1ec'
    token = str(appid) + str(appsecret) + str(timestamp) + str(plan_id)

    url = 'http://localhost:3000/api/rawsign?plan_id=%s&app_id=%s' % (plan_id, appid)

    # 定义请求头  
    headers = {
        'timestamp': str(timestamp),  # 自定义的请求头内容  
        'token': hashlib.md5(token.encode()).hexdigest()  # 自定义的请求头内容  
    }

    # Prepare files to be signed
    files = {
        'file2signed': ('test.pdf', open(pdffile, 'rb'), 'application/pdf'),
        'stamp1.png': ('stamp.png', open(png, 'rb'), 'image/png'),
        'stamp2.png': ('stamp.png', open(png, 'rb'), 'image/png'),
        'cert.pfx': ('cert.pfx', open(pfx, 'rb'), 'application/x-pkcs12')
    }

    # Prepare stamps information
    stamps = [
        # Image stamp with digital certificate
        {
            "id": 1,
            "name": "api测试印章",
            "stamp_type": "I",
            "image": "stamp1.png",
            "image_width": 40,
            "image_height": 40,
            "at_pages": "1",
            "stamp_cert": "T",
            "cert": "cert.pfx",
            "cert_password": pfxpwd,
            "opacity": 30,
            "pos_type": "C",
            "pos_cord": "40x50",
            "sign_at": "1995-01-01T10:04:32"
        },
        # Text stamp
        {
            "id": 2,
            "name": "api签名1",
            "stamp_type": "T",
            "content": "测试签名",
            "font_size": 14,
            "font_color": "#FF0000",
            "pos_type": "T",
            "pos_txt": "检验检测专用章",
            "pos_offset": {"top": 10,  "left": 10}
        },
        {
            "id": 3,
            "name": "api签名2",
            "stamp_type": "T",
            "content": "测试签名",
            "font_size": 14,
            "font_color": "#FF0000",
            "at_pages": "1",
            "pos_type": "C",
            "pos_cord": "80x150",
        },
        # Cross-page stamp
        {
            "id": 4,
            "name": "api公司奇峰章",
            "stamp_type": "S",
            "image": "stamp2.png",
            "image_width": 40,
            "image_height": 40,
            "maxpages_one_seal": 10,
            "firstpage_coverage": 20,
            "skip_first_pages": 0,
            "skip_last_pages": 0,
            "pos_type": "M"
        },
    ]

    # Add stamps information to the form data
    data  = {'stamps': json.dumps(stamps)}

    try:
        # Make the POST request
        response = requests.post(url, headers=headers, files=files, data=data)

        # Check response
        if response.status_code == 200:
            print(response.text)
        else:
            print(f"Error: {response.status_code}")
            print(response.text)

    except Exception as e:
        print(f"An error occurred: {str(e)}")
    finally:
        # Close all opened files
        for file in files.values():
            if hasattr(file, 'close'):
                file[1].close()

if __name__ == "__main__":
    pdffile = r"E:\before-fangwei.pdf"
    png = r"E:\logo.b8208e02.png"
    pfx = r"E:\test.pfx"
    pfxpwd = "thisis_password_str"
    test_raw_sign_api(pdffile, pfx, pfxpwd, png)