@javascribe/pindoupic
把任意图片转成可照着拼的拼豆图纸:带色号格子、网格、行列坐标和材料清单的 PNG,外加各色号用量统计。生成引擎与 pindoupic.com 网页版同源,跑在你自己的机器上。
快速开始
npx -y -p @javascribe/pindoupic@latest pindoupic --image ./cat.png --width 52 --type miniapp_fast --colors
npx -y -p @javascribe/pindoupic@latest pindoupic --help
npx -y -p @javascribe/pindoupic@latest pindoupic \
--image cat.png --width 52 --type miniapp_fast --palette MARD/291 \
--bead-shape circle --colors --output cat_bead.png
进度与结果写在 stderr,色号统计表写在 stdout(方便脚本解析)。想把给人看的日志存下来请写 2> log.txt——只写 > log.txt 收到的是色号表。
参数说明
-i, --image <path> | 输入图片路径(与 --image-url / --image-base64 三选一) |
--image-url <url> | 输入图片 URL(只在本机下载,图片不上传) |
--image-base64 <data> | 输入 base64 图片(带不带 data:image/...;base64, 前缀都行) |
-w, --width <n> | 图纸宽度/格数,默认 70(=线上后台那一格,10-15 全端统一),范围 10–500(天花板由出图算法那层给出,不是本包随手设的数);高度按原图比例推导。超过 160 格(=画布长边上限 8000 ÷ 默认每格 50 像素)会自动压低每格像素——大图纸不会更清晰,而是印在格子里的色号先变糊,出图时那一行「每格像素 50→N」就是这件事的读数 |
-p, --palette <b/s> | 色板 品牌/型号,默认 MARD/291(291 色全色板);--help 会列出全部色板与色数。MCP 侧同形写法是 palette: "MARD/291"(也可用 palette_brand + palette_sub) |
-t, --type <id> | 图片类型(只是参考:不要按图片内容选 type,默认推荐 miniapp_fast;只有用户要多版本/多种模式效果图时才推荐其他 type 并同时输出多个版本):cartoon 卡通画、watercolor 水彩画、illustration 插画、lineart 线稿、photo 照片、pixelart 像素画、logo Logo图标、miniapp_fast 极速 |
--simplify-colors | 合并零散色号(默认不开启),颜色太多想省钱时用 |
--simplify-threshold <f> | 配合上一项:合并占比低于此值的色号,默认 0.005(0.5%)。⚠ 想控制在 N 色以内用 --target-colors,细线/小面积点缀会被合并掉;加大本值时不要推荐加大 --width,更不要自行加大——宽度只在用户明确提出时才改,只能给建议 |
--target-colors N | 色号预算:把最终色数压到 ≤N(在量化上游求最优子集,每步取代价最小的一合并)。实测拐点在 15~17 色(那一档几乎无损),N 低于 8 会告警并给出建议档位。与 --simplify-threshold 同时给时预算优先,阈值那步不跑并会说出来 |
--lock-colors A,B | 配合预算:这些色号不参与合并("这颗豆我买了,别并掉")。锁住的色号数量本身占掉预算,所以 N 小于锁定数会直接报错。⚠ 与 pattern set --lock(逐格锁)是两件事 |
--exclude-colors A,B | 排除色号:直接从本次候选色板里拿掉 ⇒ 产物里该色号命中数必然为 0(量化器根本没有这个选项);排空整块色板会报错并列出可用色号,不回退内置 |
--merge-colors "A->B,C->D" | 指定合并:源色的格子 100% 变成目标色(这是它与 exclude 的本质区别——不是"落到最近邻")。传递收敛(A→B→C ⇒ 到 C)、有环报错、同一源色给两个目标报错;逐条明细(谁并到谁、影响几格、每格 ΔE2000 代价)写进网格文档与报告 |
--palette-file allowed.json | 按你手上的豆子库存出图:读一份色板 JSON(colors[] 或裸数组,每条需 code + hex 形如 #RRGGBB)。与 --palette 互斥(两个真值源不猜优先级);文件非法会点名第几条,不静默回退内置色板 |
--dither(none 或 floyd_steinberg 或 atkinson 或 bayer) | 抖动算法(默认沿用 --type 预设;8 个预设里 7 个本就是 none)。⚠ 它的价值是照片质感的控制权,不是降色数——实测打开 floyd_steinberg 色号反而变多。与预设同时给时旗标优先,读数会写明被覆盖的是哪个值 |
--dither-strength <0~1> | 抖动强度。实测极限如实说明:默认 solidRegionProtection 会把平坦区的强度归零,所以 floyd_steinberg/atkinson 在普通图上两档强度可能产物相同;要按强度可观测地变化请用 bayer |
--bg-mode(none 或 white 或 dark 或 auto) | 背景策略(默认 none=行为一字不动):边界连通抠图——从四条边扩开,只吞与背景连通的同族格;不与边缘连通的同色描边不会被抠掉(全局阈值那类实现会连描边一起带走)。auto 按四角参照色自动归族,深底与白底给的不是同一句建议 |
--trim-bg | 配合 --bg-mode:把内容包围盒之外的背景带整条裁掉(格数与豆子都不占)。单独给会明确说"一格未裁",不会静默无事发生 |
| (重采样无旗标) | --type lineart / pixelart 自动走 nearest,其余 smooth;生效值写进网格文档的 params_used.resize_mode。⚠ 早年那个重采样旗标仍处于已撤销状态,本包不接受它(要改重采样请用 --type,见上) |
-V, --version | 只打印包版本号,退出码 0 |
-q, --quiet | 关掉 [Pipeline] 等算法诊断日志(10-30 起默认已经静音,这条只是显式再压一遍;要打开用 -v/--verbose 或 PINDOUPIC_DEBUG=1) |
--format(只有 png) | 交付出口只剩 PNG。pdf/svg 两档已在 10-30 一起去掉(用户逐字「去掉 pdf 导出,只导出 png 文件」+「一起去掉,只留 PNG」):给了 --format pdf 或 svg 会整次拒绝、一个文件都不写,并点名"本包只写 PNG"。不存在"把 png 写成 .pdf/.svg 扩展名"的降级——那等于交出一个扩展名与内容不符的文件 |
-o, --output <path> | 输出路径,默认 <输入>_bead.png |
--shopping-list <path> | 另存一份采购清单 CSV(色号,名称,HEX,颗数,建议瓶数,备注):颗数合计与网格实算豆数互印,纯白那行按本次是否绘白底分型措辞 |
--board-tiling <n> | 按实体豆板切块(例 16):每板出一张带板号的图并落 boards.json(板号→行列范围,1 起含边界)。块数 == ceil(宽/n)×ceil(高/n),各板拼回与原图逐格一致 |
--boards-dir <dir> | 分板产物落在哪个目录(默认与 --emit-pattern 同目录) |
| (出图与重画同权) | 上面三件交付物在 pattern render <p.json> 上同样可用(改完格子不必重跑生成);四处共用 core/delivery.ts 这一份实现 |
| --bead-shape <s> | 豆子形状:square 方形/circle 圆形 |
| --cell-size <px> | 每格像素大小,默认 50 |
| --emit-pattern <path> | 出图时同时把逐格色号写成一份 JSON(网格文档)。写它几乎不花时间,却让你之后能读任意一格、改完再重画 |
| pattern get <p.json> --cell 行,列 / --region 行1,列1,行2,列2 | 读回格子。坐标从 1 起,跟图纸四周印的行列号一致;填越界会点名报错并给出合法范围,不会偷偷裁掉 |
| pattern render <p.json> -o out.png | 从网格重画,绝不重新量化。没显式指定的开关沿用文档里记录的出图设置 ⇒ 同一份文档重画两次逐字节相同 |
| --mirror | 镜像翻转图纸(默认不翻转;只翻导出画面,不改颜色统计) |
| --transparent-bg | 把纯白格当透明(不绘出,但仍计入材料清单;默认是绘出,与 MCP 一致)。⚠ 深色主体必读:主体偏黑时不要加它,空格子在深色查看器上会与黑色豆融为一体、整图不可辨认 |
| --keep-bg | (旧写法)10-02 起白色格子绘出已是默认:生成时给不给产物相同,只会多一句点名读数。⚠ 例外:pattern render 重画一份记着「不绘出」的旧文档时它会覆盖那一项 ⇒ 产物会变,同批会说出来。要「不绘出」请用 --transparent-bg |
| --no-color-codes | 不显示「色号」 |
| --no-grid | 不显示「网格」 |
| --no-rulers | 不显示「行列坐标」 |
| --no-materials | 不显示「材料清单」 |
| -c, --colors | 打印各色号用量统计 |
| --offline | 本站端点(配置/用量/反馈)一条请求都不发,渲染参数改用包内默认值;图片来源是 URL 时那一次下载不在其列(会另说一句 ⚠) |
| --no-telemetry | 不记录、也不补报使用量(仍会拉公开配置) |
选参数建议:杯垫/钥匙扣 32–52 格;头像/装饰画 60–100 格;大幅作品 100–200 格。type 默认推荐 miniapp_fast;像素画档 --type pixelart、黑白线稿档 --type lineart 只是参考,仅当用户明确要该风格或多版本对照效果时才用。
文字转图纸
10-30 用户裁定:文字转图纸回到本包(10-16 那批的撤下已撤回)。走的是与网页「文字转拼豆图纸」同一份引擎,
是二值直出,不经过图片量化。给 --text 就是文字流;--text 与三个图片入口同给=整次拒绝(退出码非 0,一个文件都不写)。
npx -y -p @javascribe/pindoupic@latest pindoupic \
--text "平安喜乐" --font shuhei --char-height 24 --output text_bead.png
npx -y -p @javascribe/pindoupic@latest pindoupic --text "平安" --check-text
npx -y -p @javascribe/pindoupic@latest pindoupic --list-fonts
--text <文字> | 要转成图纸的文字(参数里可直接换行)。给了就进文字流,与 --image / --image-url / --image-base64 互斥 |
--font <key> | 内置九款:fus12/fus8(点阵像素风)与 shuhei/pu85/huangyou/kuaile/noto400/wenkai/seal(艺术字),默认 shuhei。seal=崇羲篆體(印章),是限定字库:可写 2727 个字(由这款字体自己的 cmap 现算),表外字逐字点名拒绝。sys(系统黑体)在本包不可用——它靠操作系统自带字体,换台机器就换一个字形 |
--font-file <路径> | 用你自己手上的字体文件(ttf/otf/woff/woff2)代替内置九款:给了它=零字体请求;解析不动会点名那份文件并整次拒绝,绝不换成内置字体顶一张。字高下限按 16 格处理(保守工程线,不是对你这款字的实测) |
--list-fonts | 只查字体清单(key/名称/点阵还是轮廓/最低字高/篆书可写字数/本机有没有留档),不出图、一个请求都不发,断网照样答 |
--check-text | 预检:把出图那一发的判据原样全跑一遍,但一个文件都不写;退出码 0 的意思是"这组参数能出图",不是"图已经出了" |
--char-height <n> | 字高(格/字,默认 24)。低于该字体下限会被拒绝并说出下限(点阵 8/12;数黑 16;普惠/黄油/快乐/思源 24;篆书 28;文楷 32) |
--letter-gap <n> / --line-gap <n> | 字距/行距(格),默认各 7 |
--align left 或 center 或 right | 多行对齐,默认 center |
--stroke none 或 char 或 whole 或 cloud / --stroke-width <n> | 描边种类(默认 cloud)/描边宽度 0–6(默认 1) |
--face-color / --stroke-color / --cloud-color A,B,C | 字面色号(默认 H2)/描边色号(默认 R1)/云朵三色(默认 F14,E12,E6,顺序=内环/中环/外环);色号必须在本色板内,查无会点名 |
--bg-color <色号 或 none> | 整张底色,默认 none=透明底不放豆。它是整张铺底,与文字块自己的描边是两件事 |
--board-height <n> | 板高(格)。不给=按文字块自动贴合(四周各留 8 格)。不设人为格数上限:200 只是常见底板尺寸(超过只给一句建议),真拦人的是每边 1700 格那根防死机红线(实测 1700×1700 还能出图,再大一档渲染库拒收位图) |
--anchor <行,列> | 文字块左上角锚点(例 12,18);不给=板内自动居中(与网页/iOS 同一条算式)。放不下时整块夹回板内 |
| (被有意拒绝的一族) | 图片流的量化开关 --type、--dither、--simplify-colors、--simplify-threshold、--target-colors、--bg-mode、--mirror、--report、--compare 在文字流里没有意义:带着会整次拒绝并逐条点名,不是静默忽略,也不要替用户删参数后重跑 |
第一次用某款内置字体会从 pindoupic.com 取一次字体文件,存进 ~/.pindoupic/fonts 之后离线可用(给 --font-file 就没有这一次联网)。
带着 --offline 且本地没留档时命令会点名失败——既不偷偷发请求,也不换一款字体顶替。图片流不受影响,断网照样出图。
文字效果要更多档(10 种艺术字、59 套方块吉语、18 套印章、底色矩阵、卡通形象)请用本站免费网页功能:
https://www.pindoupic.com/text-to-bead-pattern?ref=npm
给 AI Agent:MCP Server
所有宿主同一条安装命令(它自己认宿主、把配置并进那家宿主自己的文件、只增改 pindoupic 一个键、写完读回来核对,然后告诉你还差哪一下 reload):
npx -y -p @javascribe/pindoupic@latest pindoupic install
配套的三条:pindoupic doctor 体检(包能跑/配置对不对/技能在不在场,三类读数分开报);pindoupic install --list-hosts 打印宿主登记表(每家配置路径、顶层键名、生效方式、取证状态);pindoupic install --undo 按备份字节级还原。要手工粘的话,它写进去的就是这一段:
{
"mcpServers": {
"pindoupic": {
"command": "npx",
"args": ["-y", "-p", "@javascribe/pindoupic@latest", "pindoupic-mcp"]
}
}
}
⚠ 各家顶层键名并不相同:多数是 mcpServers,VS Code/Copilot 是 servers,opencode 是 mcp(且 type 必须写 local、command 是一个数组),Zed 是 context_servers,Codex 是 TOML 的 [mcp_servers.…]。这些差异住在 cli/src/core/hostRegistry.ts 一处,由安装器消化——本文与任何交付文档都不该再按宿主给第二条命令。有官方 CLI 的宿主(Claude Code、code 的 add-mcp 子命令、Codex、Gemini、Cline、Kiro)安装器优先走 CLI,不自己拼它的配置文件。
tools/list 提供的工具名与入参以包为准(pindoupic install --list-hosts 同源打印;逐条对照见文末矩阵),当前是:generate_bead_pattern、get_pattern_grid、render_pattern、edit_pattern_grid、diff_pattern_grids、report_pattern、analyze_input、list_palettes、list_image_types、submit_feedback。
想手动确认服务能起、工具齐全,直接跑这一条(stdin 进 JSON-RPC,stdout 出结果):
npx -y -p @javascribe/pindoupic@latest pindoupic-mcp
{ "image_path": "/abs/path/cat.png", "width": 52, "palette_sub": "291", "image_type": "miniapp_fast", "mirror": false }
image_path / image_url / image_base64 三选一(与 CLI 的 --image / --image-url / --image-base64 同一份实现);
cell_size 与 show_grid / show_color_codes / show_rulers / show_materials(默认 true,传 false 即关)、
以及本次调用级的 offline / no_telemetry 都是 09-29 补齐的参数。
agent(同 CLI 的 --agent)标注是哪个宿主在调用,写进匿名用量记录;不传记为 mcp-host。palette: "MARD/291" 是与 CLI 同形的一段式写法,也可继续用 palette_brand + palette_sub。
文字转图纸在本包里(10-30 用户裁定回到 npm 产物):generate_bead_pattern 的 text 一族 17 个入参重新在册(text / font / font_file / list_fonts / check_text / char_height / letter_gap / line_gap / align / stroke / stroke_width / face_color / stroke_color / cloud_color / bg_color / board_height / grid_anchor),与 CLI 的 17 颗旗标逐一对应(见上面「文字转图纸」那一节)。text 与 image_path / image_url / image_base64 互斥,同给整次拒绝、不出图也不写文件,回执点名互斥的是哪两条通道;10-16 那套「旧写法整次拒绝并转介网页版」的行为已经不存在了。图片流不受影响。
默认返回 width / height / total_beads / colors_used / color_stats / png_file(本机图纸路径)与 param_source(本次生效参数来源:server / builtin / offline),
并同时给出 structuredContent 供宿主直接解析。不再内联 base64:一张 52 格图纸的 base64 是 MB 级
(实测 1.5–2.4 MB ≈ 数十万 token),会把 agent 上下文直接打满——需要内联时显式传 include_image: true。
可指定 output_path 决定落盘位置;传了 schema 之外的键会在 warnings 里明确列出(不再静默丢弃)。
bead_shape / format / simplify_colors / simplify_threshold / transparent_bg 与 CLI 对齐(白底默认值两边同源:09-29 先对齐、10-02 两边一起翻成绘出纯白格,见下一节那条矩阵行);
09-29 补齐后 CLI 的画面可调项 MCP 也都有了:cell_size(每格像素)、show_grid / show_color_codes /
show_rulers / show_materials(四个默认 true 的显示开关,传 false 即关,对应 CLI 那四个关掉显示项目的旗标),
以及本次调用级的 offline / no_telemetry(对应 --offline / --no-telemetry;MCP 是常驻进程,
所以这两个开关只作用于这一次调用,不会像 CLI 那样设成进程全局)。
反过来 CLI 也补了 --image-url / --image-base64,与 MCP 的 image_url / image_base64 同一份实现。
默认色板 MARD/291、默认宽度 70、默认方形豆、默认不套图片类型预设。
逐条对照见 skill/pindoupic-bead-pattern/references/cli-mcp-matrix.md(09-29 起两出口默认值也一致,只剩写法形态差异)。
给 AI Agent:Agent Skill 也随包发布
装法与 MCP 同一条命令(pindoupic install 顺带把技能一起装好):说明书有中英两份独立包,装哪一份由输出语言决定——10-30 起默认就是中文,所以默认落的就是下面那个中文位置;要英文那一份得带 PINDOUPIC_LANG=en(这台机器的 LANG/Intl 信号不参与这个判定)。实体只有一份,住跨宿主中立位 ~/.agents/skills/pindoupic-bead-pattern/,各宿主自己的技能目录放软链指过去;没有技能目录的宿主,则由 MCP 握手的 instructions 字段把同一本手册的精简版送达(逐句照抄 SKILL.md,门禁核对同源性)。
已撤销的旧写法不得再教:往项目的 .ai/skills/ 复制(实测静默失效、不出现在技能列表)、手抄 node_modules/... 相对路径(只走 npx 的机器上根本没有那个目录)、以及 Windows 上不存在的 cp -r。技能路径与宿主目录住在 cli/src/core/hostRegistry.ts 一处,本文不重复抄。
使用意见回传(给 agent)
每生成一张图纸,本包都会在 stderr 打出一条 FEEDBACK_REQUEST,提示 agent 征询用户后回传一条使用意见:
pindoupic feedback --rating 4 --note "色号偏多,希望默认更省豆" --agent "<宿主 agent 名>"
意见会进入网站「留言」模块并标注为 agent 提交(与人类留言在后台可区分)。payload 只含参数与评价文本,不含图片内容、不含图片路径。MCP 侧对应工具 submit_feedback。
隐私与联网
- 你的图片只在本机处理,不上传到任何地方;文件名与路径也不会被上报。
- 算法与色板都在包内 ⇒ 图片转图纸完全断网也能出图。 联网只做两件可选的事:
- 启动时尝试拉一次公开配置(管理员调过的渲染参数)。拉不到就用包内默认值,绝不阻塞出图;
每次运行都会打印这批参数的生效来源(站点下发 / 包内默认),便于复现。
- 把使用量先记在本地,下次联网时补报(只含包版本、平台、宽度/色板/色数/豆数这类参数摘要)。
- 想彻底关掉:
--offline 一条网络请求都不发;--no-telemetry 只关用量上报(仍拉配置);
或设环境变量 PINDOUPIC_OFFLINE=1 / PINDOUPIC_TELEMETRY=0。
- 输出语言与诊断日志两个环境变量(10-30 定稿):
PINDOUPIC_LANG=zh|en 直接定语言——默认就是中文,什么都不用设。这台机器的 LC_ALL/LANG/Intl 信号不再参与判定:
它们量的是机器的语言,不是用户的语言(本机实测 LANG 为空而 Intl 报 en-US,使用者全程讲中文,旧版却因此整套输出英文)。
要整套英文输出才带 PINDOUPIC_LANG=en(MCP 形态写在 spawn env 里);这条同时决定 install 装的是哪一份说明书——默认装中文那份。
PINDOUPIC_DEBUG=1 把算法逐阶段诊断日志([Pipeline] 那几十行)要回来,默认它们不打。
- 本地会写两类文件:
~/.pindoupic/install.json(匿名装机标识 uuid4)、~/.pindoupic/outbox.jsonl(待补报队列)。删除 ~/.pindoupic/ 目录即可全部清掉。
逐格编辑:读、改、比、量都在命令行里;可视化精修另有官方网页工具(免费)
本包负责「图片 → 图纸」这一步,并且把图纸交回成可读写的数据:加 --emit-pattern p.json 之后——
pindoupic analyze <图> | 出手前的诊断:背景判定(纯白底/深色底/无纯色底,并说清该不该加 --transparent-bg)、预估色数与梯度密度、构图建议、色板近邻色警告,末尾给一条可直接执行的 next_step.command |
pindoupic pattern get p.json --cell 3,4 / --region 1,1,12,12 | 读任意一格或一块(坐标 1 起,与图纸四周标尺同序) |
pindoupic pattern set p.json --cell 3,4 --to B22 | 就地改格(绝不重新量化)。选择器四选一:--cell / --region / --where A13(整色号)/ --flood 3,4(该格所在的边界连通同色块);擦成空格传 --to "" |
pindoupic pattern set … --rules "A13->B22,B22->C3" | 整色号规则链:传递收敛(A13 最终到 C3)、两种书写顺序结果相同、有环或一源多目标直接报错 |
pindoupic pattern set … --lock "30,20;31,20" | 锁格:写进 p.json,后续任何重算都逐格不动(没有锁就没法反复试错——每次生成都会冲掉上一轮调好的地方) |
pindoupic pattern set … --dry-run | 只算回执、一个文件都不写 |
pindoupic pattern diff 改前.json 改后.json | 逐格比对(格数不同直接拒绝比较,不按较小者截断) |
pindoupic pattern render p.json -o 重画.png | 从网格只重画,未显式指定的开关沿用当初出图时的设置 |
pindoupic report p.json --image <原图> [-o 报告.json] [--check 报告.json] | 结果层量化报告:mean/p50/p95/max ΔE2000、palette_budget_loss(相对整块色板多付的色差)、最差区块、逐色号代价与孤立豆、长尾统计;--check 会拒绝一份配不上当前网格的旧报告 |
--report / --preview / --compact-preview / --compare | 出图时一次拿到报告、缩小预览与「源图 | 图纸」并排图(预览只用于观察,逐格数据一律走 p.json) |
每次 pattern set 都回一份动作回执(stdout 一行 JSON,或 --receipt r.json):applied_cells、
skipped_locked、逐格 changes(改前→改后,超 500 格截断并标 changes_truncated)、
以及给了 --image 才算得出的 de(改前/改后 mean ΔE 与差值;没给就是 null 并说明原因,不会给你一个 0)。
目标色号必须在这份文档的色板里——写了不存在的色号会报错并列出可用色号,不会"就近换一个"。
要做可视化的逐格精修(点哪改哪、擦除杂豆、色号合并微调、多图层、空画布手拼),请访问官方网页工具,免费、无需安装:
限制
- 文字转图纸属于本包(10-30 用户裁定回到 npm 产物,覆盖 10-16 那批的撤下):见上面「文字转图纸」那一节的 17 颗开关。
两条边界照实说:
sys(系统黑体)在本包不可用(换台机器就换一个字形,同一串参数出不了同一张图);
图片流的量化开关在文字流里没有意义,带着是整次拒绝并逐条点名,不是静默忽略。
- 请求包里不存在的色板会直接报错并列出可用清单,不会静默换色板;新增色板随包版本更新。
排错
npx 下载失败 / sharp 装不上 | 网络或镜像问题,重试或挂代理 |
| 提示取不到站点配置 | 不影响出图,会自动改用包内默认值;想完全不联网跑就加 --offline |
色板 X/Y 不在本包内 | 按错误里列出的清单换型号,或升级本包版本 |
| 想确认参数有没有生效 | --cell-size 显式指定即覆盖后台下发值 |
许可证
AGPL-3.0-only(全文见包内 LICENSE)。你可以自由使用、修改、再分发,也可以商用——
唯一义务是:改了代码或把它做成通过网络对外提供的服务时,必须把对应源码同样以 AGPL 提供给你的用户。
不想承担这个义务(例如要嵌进闭源产品或闭源 SaaS、要去掉图纸上的品牌 logo 做白标;底部那行引导文案 10-31 起默认不印),
请取得商业授权,见包内 COMMERCIAL-LICENSE.md;联系入口:https://www.pindoupic.com/jiaoliu?from=commercial
品牌名与官网内容不在授权范围内。