Skip to main content

说明文档

接口功能

基础功能对应字段ps-APIadobe-API
文字图层内容修改new_contents✔️✔️
文字图层字体修改new_fonts✔️⛔(官方API限制,仅支持部分adobe的字体)
文字图层大小修改font_sizes✔️✔️
智能对象图层文字内容修改new_contents✔️⚠(官方API限制,通过多次调用实现)
智能对象图层文字字体修改new_fonts✔️⛔(官方API限制,仅支持部分adobe的字体)
智能对象文字超边界修复font_sizes✔️✔️
智能对象图层图片替换new_contents✔️✔️
自定义尺寸:长、宽widthheight✔️✔️
自定义分辨率(DPIdpi✔️✔️
支持多种格式输出:jpgpngpdftiffoutput_type✔️✔️
  • 接口已实现接口所有需求的所有功能
  • 国内使用的话,ps-API对图图片处理较快
  • adobe-API对智能对象修改有一定局限性,部分需求通过调用多次实现,官方明确表示后续接口会增加该方面功能。
  • adobe-API需要用国外服务器部署,国内延迟非常大
  • 官方支持的字体:https://github.com/AdobeDocs/photoshop-api-docs/blob/master/SupportedFonts.md

项目架构

目录结构

项目目录
|-- data # 关键数据存放目录
| |-- adobe # 存放adobe账号后台对应的项目文件 config.json、private.key, 一个文件夹对应一个项目名
| |-- bucket # 存储桶相关key的文件,比如aws-s3的文件就有 new_user_credentials.csv、 rootkey.csv
| |-- psd # psd 文件预处理后的存放文件夹
| `-- fonts # psd文件所有第三方字体(需要手动另外安装到系统),接口会定期上传这里的字体到存储桶
|-- docs # 一些以往的说明文件
|-- docker
| |-- web/ # docker
| | |-- Dockerfile #
| | `-- requirements.txt # docker 部署专用的requirements.txt
| |-- redis/ #
| | |-- data/ # redis容器挂载后的data目录
| | `-- redis.conf # docker挂载后映射的redis配置文件
| |-- build.sh # 部署脚本
| |-- check.sh # 环境检查脚本
| `-- docker-compose.yml # compose配置文件
|-- logs # 日志文件
|-- src # 源码目录
| |-- modules # module层,也可以当作是server层
| |-- tools # 接口层面的工具函数
| |-- utils # 关键的一些工具函数层
| |-- storages # 存储桶层
| |-- routers # 路由层
| | `-- v1 # 接口
| `-- static # 所以文件都会上传到本文件夹
| |-- temp # 临时文件夹,首次上传的文件都会存放到这里,处理后会自动删除,接口定期清理
| `-- upload # 临时文件夹
|-- config.py # 次级的配置文件,最终以config.ini 为准
`-- main.py # 接口启动文件 启动命令:python3 main.py (工作目录确保为src目录)

关键目录

以下所有目录均可以在config.ini或者config.py内重新自定义,建议使用绝对路径明确指定

目录作用备注
logs/*.log日志文件以日期来存储
data/adobeadobe的项目文件夹,新建文件夹即可动态的添加key每个key每月限制5000次
data/fonts第三方字体的文件夹,任何用到的字体都要直接拷贝到这里,然后重启接口即可
data/psd所以预处理后的psd文件存放
src/static静态服务器的根目录
src/static/upload所有上传文件后首次存放的目录

关键文件

文件说明备注
config.ini服务器关键配置优先等级最高
config.py服务器详细配置文件优先等级紧接config.ini
private.key通过adobe账号新建项目后获得一个账号每月调用限制为5000
xxxxxx(JWT).json通过adobe账号新建项目后获得请注册多个账号获取多个key

配置文件

配置文件路径:{项目路径}/config.ini

配置示例:

  • 等号两边建议带上一个空格,方便查看
  • 一些开关类的属性使用 "on" | "off" 来表示
# config.ini 文件
app_name = xxxxx # 接口名称
default_engine = ps # 优先调用本地ps还是adobe接口处理请求
domain = http://你的域名.xxx.xx # 本地调用ps处理后的图片前缀,默认为空也可以
HAS_PS = on # 是否使用本地的ps处理请求
port = 80 # 最终对外的端口 默认4040

psd_files_path = d:/abc/psd # 将预处理的文件存放到 d盘的 abc下面的psd目录中
upload_path = d:/abc/upload # 将上传的文件存放到 d盘的 abc下面的upload目录中

config.ini

config.ini管理整个接口的所有配置入口文件

# 基础格式
字段名 = 字段值
# config.ini 文件
# 开发模式(实际上线请设置为 off)
DEV = on
port = 4040

# 默认使用ps处理请求
default_engine = ps

# 完全关闭ps
PS_API_ENABLE = off

# 本地合成图片输出的前端部分url路径,建议设置为空即可
domain = ""

# 存储桶路径
bucket_url = ""
# 指定存储桶类型
bucket_type = "bunny"
# 存储桶key
bucket_api_key = ""

# 预处理后是否上传
pre_upload_psb_enable = on

基础配置

字段说明默认值备注
DEV调式模式,实际测试无问题后,请务必设置为offonDEV = off
port接口的端口4040port = 80
default_engine优先调用本地ps还是adobe接口处理请求psdefault_engine = adobe
PS_API_ENABLE是否启用PS总开关,设置为off,任何环境下都不会再调用本地PSonPS_API_ENABLE= off

关键目录

字段说明默认值备注
upload_path所有文件上传的目录,
自动清理存放超过30天的文件
{接口目录}/static/uploadd:/xxxx/upload
psd_files_path预处理关键目录{接口目录}/static/psdd:/xxxx/psd
font_path字体文件本地存放的路径
同时请确保系统也要手动安装
{接口目录}/static/fontsd:/xxxx/fonts

字体文件存放到font_path后,每次接口启动都会扫描一次该目录并记录所有字体到数据库

存储桶相关

字段说明默认值备注
bucket_url完整的存储桶路径http://xxxx.xxx.com
bucket_typebunnyaws-s3 仅支持这两个aws-s3
bucket_api_key存储桶的访问密钥
bucket_access_token存储桶的访问token,s3会有,bunny 不需要
bucket_font_path存储桶上放字体的目录
最终会与bucket_url拼接组成完整路径
http://xxxx.xxx.com/fonts
fonts
bucket_img_upload存储桶图片上传的后存放的位置temp
bucket_psd_path存储桶预处理psd文件上传的位置psd

adobe-api相关

字段说明默认值备注
adobe_token_expiretoken每7小时续期 (官方有效期是24小时)25200(7小时)单位是秒
adobe_config_pathtoken 文件存放的目录,每7小时自动更新{接口上层目录}/data/adboeadobe_config_path = d:/config/adboe

预处理相关

字段说明默认值备注
pre_except_group预处理时忽略的图层组,明确设置可以加快预处理的速度["BG", "FG"]
pre_small_width预处理时,小尺寸文件的宽度,高度自动计算500
pre_medium_width预处理时,中尺寸文件的宽度,高度自动计算1000
pre_upload_psb_enable是否同步上传文件到存储桶offpre_upload_psb_enable = on
pre_quality_enable是否生成 small、medium等小尺寸文件on

字体相关的

字段说明默认值备注
font_ext哪些后缀的文件被认作字体[".ttf", ".otf"]
font_path字体文件上传后保存的目录
font_auto_upload字体是否自动上传存储桶

注意

请不要修改config.py,除非你明确了解它的作用,接口所有配置都以 config.ini 为准

并发处理

  • 由于ps-API同一时间单位只能处理一个请求,要支持并发,可以采用多服务器部署方案。
  • 默认情况接口会优先采用ps-API进行处理,如果处理途中有请求进入,请求会被放到等待队列中,等待1秒(参数可配置),1秒后无处理则会调用官方API处理。
  • 通过修改config.default_engine,可以指定接口默认采用哪种方式处理请求,支持"ps"|"adobe"
  • 因为当前并发处理实际只是转发请求,所以理论上adobe支持多少并发,接口就支持多少并发,唯一问题是官方API处理延迟大(国内),国外经测试至少还能比国内快1秒以上。
  • 建议预处理的服务器硬盘空间要给够,经过处理后,最高会多占原来的4~5倍空间

添加Adobeapi-key

由于一个账号每月限制调用次数为5000次,所以请注册多个账号,通过以下步骤将关键文件添加指定目录(config.adobe_config_path)中,建议目录名称与账号同名,这样比较好管理。

具体步骤

  • 注册一个adobe官方账号
  • 登陆账号,进入后台
  • 下载config.zip文件内含(private.key)
  • 下载xxxxxx(JWT).json文件

一、登陆账号,进入控制台

image-20220628180447717

二、创建一个photoshop-api的项目,获取private.key 文件

  • 官方的调用限制是以账号为单位的,所以需要注册多个账号,每个账号新建一个项目

image-20220628180616989

image-20220628180819737

image-20220628180848519

选择 photoshop API

image-20220628180934341

获得private.key 文件

image-20220628181052164

三、得到 config.zip

image-20220628181352262

image-20220628181359030

将文件内的private.key存放到 {项目目录}/data/adobe/新建一个项目名/private.key

image-20220628181711398

建议将文件夹的名称改为与项目账号名称一致,因为每个账号无论多少个项目都是共享调用次数的,一个账号相当于一个key

image-20220628181847191

四、获取项目xxxxxx(JWT).json文件

image-20220628182336414

image-20220628182406066

将新下载的(JWT).json文件拷贝到private.key同一目录即可

image-20220628182449395

五、更新数据到接口

  • 方法1 :手动重启接口

  • 方法2 :等待接口定时更新即可,默认7小时,可在config.py.adobe_token_expire字段来配置

六、修改配置文件的存放目录

  • config.ini 中修改 adobe_config_path字段: adobe_config_path = 你想要的目录

数据库

本接口仅采用了redis作数据库

数据库说明
db0存储桶相关数据,api-apiaccess-token
db1psd预处理数据,图层类型
db3字体相关

Adobe 权鉴数据

KEY类型说明
{project_name}string

image-20220628213005459

// {project_name}的项目数据结构
{
// 小写key部分
"project_name":"psd-tools", // 项目名
"count":"4800", // 该key已经使用的次数
"create_time":"1656034078", // 该key创建的时间
"access_token":"xxxxxxxxx", // 未添加Bearer 的jwt-token

// 大写key部分:完全对应 xxx(JWT).json 的内容,该文件通过官网项目下载
"CLIENT_SECRET": "p8e-m0NLC7Jyh4PdxK6LXMI4Qm5OD-tS1lTF",
"ORG_ID": "3CC3266C626B9B030A495F8A@AdobeOrg",
"API_KEY": "daa0f550d4c641f68e08d1d74fcf594f",
"TECHNICAL_ACCOUNT_ID": "55C94A89628B83F50A495F9C@techacct.adobe.com",
"TECHNICAL_ACCOUNT_EMAIL": "61a86121-6c3f-48fb-836d-3113b1436931@techacct.adobe.com",
}

字体数据

KEY类型说明
FONT:{font_name}Hash Table每个字体的详细数据

image-20220721220956824

psd预处理数据

KEY类型说明
{file_name}string:json对应预处理后的.info文件
RECEN_PROJECT_NAMEstring最近一次使用的项目key数据
// FONT:{font_name} 的数据格式
{
"font_name":str,
"font_url":"xxxx", // 字体位于存储桶链接
}
  • 预处理.info文件格式
{
"file_name": "1-2.psd",
"file_ext": ".psd",
"file_path": "W:\\CPS\\MyProject\\python-tools\\ps-tools\\src\\static\\psd\\1-2.psd\\1-2.psd",
"file_size": "18.01mb",
"file_len": 18880279,
"group_list": [
"DYNAMIC "
],
"layer_list": [
"Background copy 拷贝 2",
"背景"
],
"width": 2000,
"height": 2000,
"layer_count": 3,
"FONT_LIST":["字体名称"],
"TEXT_LAYERS_INFO": [
{
"layer_name": "__D__",
"layer_type": "text",
"text_content": "88",
"has_mask": false,
"text_raw": "88\r",
"layer_id": 7,
"font_name": "2019ProBowl",
"font_size": 443.59
},{.../}
],
"SMART_LAYERS_INFO": [
{
"layer_name": "__C__",
"layer_id": 69,
"layers": [
{
"layer_name": "TRUBISKY",
"layer_kind": "文字图层",
"visible": true,
"has_mask": false,
"layer_id": 70,
"layer_type": "text",
"text_content": "TRUBISKY",
"text_raw": "TRUBISKY\r",
"font_name": "2019ProBowl",
"font_size": 180.0
}
],
"layer_count": 1,
"layer_type": "smart_text",
"change_type": "text",
"inside_layer_name": "TRUBISKY",
"inside_layer_id": 70,
"max_text_len": 8,
"font_list": [
"2019ProBowl"
],
"psb_path": "W:\\CPS\\MyProject\\python-tools\\ps-tools\\src\\static\\psd\\1-2.psd\\DYNAMIC __C__.psb",
"psb_linked": false,
"psb_name": "__C__.psb"
}
]
}

预处理

PSD文件

linux 环境下,因为无法调用ps,所以不会进行预处理

image-20220628172654833

文件说明是否上传备注
backup.psd原始文件
1-2.psd优化后的原始尺寸文件✔️
1-2_small.psd小尺寸的设计文件(500x500)✔️可修改: config.pre_small_width 字段自定义
1-2_medium.psd中尺寸的设计文件(1000x1000)✔️中尺寸固定是小尺寸的两倍
1-2.psd_backup优化后的原始尺寸文件的备份
图层组_图层名.psb智能对象图层文件✔️用于给官方api修改智能对象字体内容时使用
图层组_图层名.psb_backup智能对象图层文件的备份
1-2.psd.infojson格式的文件预处理数据保存在本地和数据库各一份
  • 预处理后,本地文件大概会比原来大4~5倍
  • 上传部分的文件一般是源文件的2倍

服务器配置

测试服务器配置

硬件型号规格
CPUInter i7-6820HQ (Thinkpad p50移动工作站)3.2Ghz 四核八线程
内存16G
硬盘SSD 固态(M.2 NGFF SATA协议2280)
显卡NVIDIA Quadro M1000M

云服务器器配置(建议)

硬件型号规格备注
CPU3.0Ghz 以上 3核以上photoshop软件比较吃cpu主频,频越高处理越快
内存8GB以上新版的photoshop 最低8G才能对当前的文件流畅处理
硬盘NVMe硬盘影响文件打开速度

vultr 建议方案

  • 高主频的cpu
  • 内存大于8GB
  • 硬盘越快越好

方案1

image-20220618152432840

方案2

image-20220618152625448

文件上传

接口支持任意文件上传,目前仅以文件后缀来区分文件名,没做太深入的文件验证

  • .psd、.psb 文件上传后会调用预处理,同时上传到存储桶
  • 字体文件需要通过上传接口上传后,接口会自动上传到对应的存储桶
  • 图片文件一般上传的目的是用来替换psd内的某一图层,接口会定期清理存在超过30天的图片文件
支持的文件格式上传后保存的目录存储桶路径
.psd、.psbconfig.pre_pathconfig.bucket_psd_path
.ttf、.otfconfig.font_pathconfig.bucket_font_path
.jpg、.jpeg、.png、.bmp、.ttfconfig.temp_pathconfig.bucket_img_upload

注意事项【重要】

  • 所有psd图片等文件不要采用空格命名,或者过长的命名。
  • 如果遇到缺少的字体,photoshop软件会被卡住,导致接口无法继续预处理,此时请手动关闭缺少字体提示和文件,重启接口
    • 如果ps卡住,此时接口无法再处理任何文件上传和预处理,但是可以调用adobe进行图片合成和修改
  • 后续adobe可能会更新支持外链智能对象和修改智能对象文字的功能
  • 请确保本系统中只有一个版本的Photoshop
  • 请确保字体文件的名字与ps内选择该字体时显示的名称保持一致
    • 字体文件原名:CVB__123117.ttf
    • PS软件内选择名为:Cvb-123117
    • 请将名字改为:Cvb-123117.ttf