自由签章接口文档
基本介绍
该签章接口不依赖方案的设置的签章内容,直接使用接口传递过来的信息进行签署。接口传递的数据包括所有需要签署的印章。 每个印章涉及到签章类型、签章图片、签章位置等信息。
需要签署的文件和签章图片等,通过接口进行传输。
接口名称
/api/rawsign?plan_id=5&app_id=
接口调用方法
POST方法,采用使用multipart/form-data格式上传。
FORM中上传文件的字段名
- file2signed:需要签署的文件,一次接口调用签署一个文件,文件大小不能超过100M。该字段的名称固定。
- 其它文件:其它文件,如图片等,名称可以自定义,但是不能与file2signed重复。确保唯一。用于传输签名文件、数字证书文件。
- stamps: list列表,utf8编码,json格式,用于传输需要签署的印章信息,包括印章类型、印章图片、印章位置等信息。印章信息的具体细节如下所示。
- metadata: json格式,utf8编码,文件元数据,可以为空。
印章信息定义
- 骑缝章字段
字段名称 | 字段类型 | 是否必须 | 描述 |
---|---|---|---|
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 居下,默认居中 |
- 文字印章字段
文字印章支持边框、底纹颜色和链接设置
字段名称 | 字段类型 | 是否必须 | 描述 |
---|---|---|---|
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)