用 pptx-posters 技能生成可编辑、宏安全、可审计的科研会议 PPTX 海报
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
本指南围绕 scientific-agent-skills 仓库中的pptx-posters技能展开,讲解如何仅凭一份经过作者批准、完全本地化的 JSON manifest 与本地 PNG/JPEG 素材,生成一张真正可编辑、无宏、通过包安全与无障碍审计的单页 PowerPoint(.pptx)科研海报。读完本文,你将掌握从「建立尺寸需求」到「manifest 构建与哈希绑定审批」「资源/调色板审计」「PPTX 生成」「最终技术审计」再到「人工无障碍检查与导出印刷」的完整链路,并能复现仓库中 7 个无网络 CLI 工具的全部用法与退出码语义。
技能定位与适用范围
pptx-posters是仓库 skills/pptx-posters/SKILL.md 定义的一个 Agent 技能(skill),核心定位是:当请求的交付物是一张可编辑的 PowerPoint 科研/会议海报时才使用它,并且要求精确满足物理尺寸、打印机要求、无障碍、来源可追溯与包安全等检查。其 frontmatter 声明了版本 2.1、许可证 MIT、作者 K-Dense Inc.,并明确了严格的环境要求:
- Python 3.10+、
uv; - 精确锁定
python-pptx==1.0.2、Pillow==12.3.0、lxml==6.1.1; - 校验与 PPTX ZIP/XML 检查全程本地、无网络;
- 最终的 PowerPoint 打开验证、无障碍检查、PDF 导出、打印机与作者评审为人工环节。
版本 2.0 及以上的实现是从严格的本地 JSON 直接生成真实的单页 .pptx,不使用 HTML 转换、外部模板、示意图/图像生成服务、API 密钥、环境变量文件、网络请求,也不强制任何图形风格(见 SKILL.md 的 Scope 一节)。技能目录下的 7 个 CLI 工具全部实现了这一「严格本地、失败即停止」的设计哲学。
硬性闸门:不满足即停止,绝不猜测
技能定义了 8 条硬性闸门(Hard gates),任何一条未满足都必须停止而非猜测:
- 作者未提供精确的海报内容与来源记录;
- 任何声明、数字、引用、作者、单位、资助声明、图形、许可证或 QR 目标无法溯源;
- 当前的会议与打印机要求未确认;
- 作者批准未绑定到当前 manifest 的内容哈希;
- 资源是远程的、位于 manifest 目录之外、未哈希或未获批准;
- 输入是
.pptm,或包含宏/外部关系/OLE/嵌入文件,或是不可信模板; - 请求的工作流需要在自动化中打开或执行 PowerPoint;
- 脚本报告存在包、布局、DPI、对比度或输出计划的阻断项。
禁止伪造缺失材料或留下看似合理的占位符,草稿以失败关闭(fail closed)为默认行为。这一点在源码中同样被贯彻:validate_manifest.py对占位符 token、未验证来源、未批准元素和虚假确认一律拒绝(validate_manifest.py),而generate_poster.py在任意一步不满足时抛出CliError并以退出码 2 结束(generate_poster.py)。
安装精确锁定的生成依赖
在技能目录下执行:
uv venv uv pip install "python-pptx==1.0.2" "Pillow==12.3.0" "lxml==6.1.1"生成环节严格要求以下精确版本:
python-pptx==1.0.2 Pillow==12.3.0 lxml==6.1.1这种「精确 pin」是为了保证可复现生成。在 generate_poster.py 中,_require_exact_dependencies()会逐一读取已安装发行版的实际版本号,只要与期望值不一致就立即报错并给出安装提示。所有 CLI 采用惰性可选导入,因此python -B scripts/<tool>.py --help在没有这些包时也能运行;-B用于避免生成字节码(__pycache__)产物。
布局前先建立需求:没有通用的海报尺寸
在开始排版之前,必须将以下项目分开记录(SKILL.md 的 "Establish requirements before layout" 一节):
- 物理裁切宽/高与方向(orientation);
- 每个边缘的出血(bleed);
- 裁切线内部的安全边距(safe margin);
- PowerPoint 画布宽/高;
- 统一的物理版面/画布印刷比例(print scale);
- 会议最大尺寸与交付格式;
- 打印机的裁切、出血、边距、缩放、色彩模式与打样要求;
- 最终输出的字号与栅格 DPI 阈值,每一项都要标注是启发式还是绑定到精确来源;
- 所需字体、工作站可用性、嵌入许可以及替换/打样流程。
一个关键的工程事实是:并不存在通用的海报尺寸。Microsoft 目前将每张自定义 PowerPoint 尺寸限制在 1–56 英寸之间,并且所有幻灯片共用一个尺寸(plan_export 生成的计划中custom_dimension_range_in: [1.0, 56.0]、all_slides_same_size: True正是该约束的体现,见 plan_export.py)。如果物理版面更大,只有当打印机确认支持缩放时,才可以使用按比例缩小的画布。
布局设计细节请阅读 references/poster_layout_design.md。
构建 manifest:把一切内容绑定到来源与审批
模板与整体结构
将 assets/poster_manifest_template.json 复制进项目。该模板故意无效:包含REPLACE_ME_*替换 token、false确认标记和draft审批状态,因此无法被意外地生成海报。
清单规范请阅读 references/manifest_spec.md 与 references/poster_content_guide.md。Manifest 版本 2.0 要求顶层恰好包含这些键,多一个键都会被校验器拒绝(而不是静默忽略):
{ "schema_version": "2.0", "document": { "id": "REPLACE_ME_DOCUMENT_ID", "title": "REPLACE_ME_TITLE", "subject": "REPLACE_ME_SUBJECT", "language": "REPLACE_ME_BCP47_LANGUAGE", "authors": ["REPLACE_ME_AUTHOR"], "source_ids": ["REPLACE_ME_CONTENT_SOURCE_ID"] }, "canvas": { "width_in": "REPLACE_ME_POWERPOINT_WIDTH", "height_in": "REPLACE_ME_POWERPOINT_HEIGHT", "background_color": "#FFFFFF" }, "physical_output": { "trim_width_in": "REPLACE_ME_TRIM_WIDTH", "trim_height_in": "REPLACE_ME_TRIM_HEIGHT", "bleed_in": "REPLACE_ME_BLEED", "safe_margin_in": "REPLACE_ME_SAFE_MARGIN", "orientation": "REPLACE_ME_ORIENTATION" }, "requirements": { "conference": { "confirmed": false, "source_id": "REPLACE_ME_CONFERENCE_SOURCE_ID", "max_width_in": "REPLACE_ME_CONFERENCE_MAX_WIDTH", "max_height_in": "REPLACE_ME_CONFERENCE_MAX_HEIGHT", "orientation": "REPLACE_ME_CONFERENCE_ORIENTATION", "required_delivery_format": "REPLACE_ME_DELIVERY_FORMAT", "notes": "REPLACE_ME_CONFERENCE_NOTES" }, "printer": { "confirmed": false, "source_id": "REPLACE_ME_PRINTER_SOURCE_ID", "trim_width_in": "REPLACE_ME_PRINTER_TRIM_WIDTH", "trim_height_in": "REPLACE_ME_PRINTER_TRIM_HEIGHT", "bleed_in": "REPLACE_ME_PRINTER_BLEED", "safe_margin_in": "REPLACE_ME_PRINTER_SAFE_MARGIN", "accepted_color_mode": "REPLACE_ME_COLOR_MODE", "scaling_allowed": false, "notes": "REPLACE_ME_PRINTER_NOTES" } }, "quality": { "minimum_font_pt_final": "REPLACE_ME_FINAL_FONT_THRESHOLD", "font_guidance_basis": "heuristic", "font_guidance_source_id": null, "minimum_raster_dpi_final": "REPLACE_ME_FINAL_DPI_THRESHOLD", "raster_dpi_basis": "heuristic", "raster_dpi_source_id": null }, "palette": { "colors": { "black": "#000000", "white": "#FFFFFF" }, "contrast_pairs": [{ "id": "black_on_white", "foreground_color_id": "black", "background_color_id": "white", "usage": "normal_text" }], "data_series_redundant_encoding": false }, "sources": [ { "id": "REPLACE_ME_CONFERENCE_SOURCE_ID", "kind": "conference_rule", "citation": "REPLACE_ME_CONFERENCE_CITATION", "locator": "REPLACE_ME_CONFERENCE_LOCATOR", "author_verified": false }, { "id": "REPLACE_ME_PRINTER_SOURCE_ID", "kind": "printer_rule", "citation": "REPLACE_ME_PRINTER_CITATION", "locator": "REPLACE_ME_PRINTER_LOCATOR", "author_verified": false }, { "id": "REPLACE_ME_CONTENT_SOURCE_ID", "kind": "author_content", "citation": "REPLACE_ME_CONTENT_CITATION", "locator": "REPLACE_ME_CONTENT_LOCATOR", "author_verified": false } ], "assets": [], "elements": [ { "id": "title", "type": "text", "reading_order": 1, "x_in": "REPLACE_ME_X", "y_in": "REPLACE_ME_Y", "width_in": "REPLACE_ME_WIDTH", "height_in": "REPLACE_ME_HEIGHT", "source_ids": ["REPLACE_ME_CONTENT_SOURCE_ID"], "author_approved": false, "allow_in_bleed": false, "role": "title", "text": "REPLACE_ME_TITLE", "font_size_pt_design": "REPLACE_ME_DESIGN_FONT_SIZE", "font_face": "REPLACE_ME_FONT", "bold": true, "align": "left", "vertical_align": "middle", "contrast_pair_id": "black_on_white", "line_color_id": null, "line_width_pt": 0, "margin_in": "REPLACE_ME_MARGIN" } ], "approval": { "status": "draft", "approved_by": null, "approved_at": null, "content_sha256": null } }所有资产路径相对于 manifest 所在目录。校验器会拒绝:未知键、重复 JSON 键、非有限数值、远程资产路径、路径逃逸、未批准字段、未解决来源、未使用记录以及常见占位符。
顶层对象要点
- document:
id以字母开头;language为 BCP 47 风格标签;authors为精确的有序作者名。恰好一个 role 为title的文本元素必须与document.title逐字一致,且reading_order必须为 1——生成器会把它用作原生 PowerPoint 幻灯片标题占位符,而不是普通文本框(manifest_spec 与generate_poster.py中existing_shape=title_placeholder的逻辑一致)。 - canvas:
width_in、height_in为 1–56 英寸的幻灯片尺寸;background_color为不透明六位 sRGB 十六进制。这些是设计尺寸,不等于物理裁切尺寸。 - physical_output:
trim_width_in/trim_height_in为最终物理尺寸;bleed_in为每边出血;safe_margin_in为裁切线内非出血内容的缩进;orientation取portrait、landscape或square,必须与裁切尺寸吻合。物理版面 = 裁切 + 两倍出血,且必须与画布共享宽高比。 - requirements.conference:必须确认并提供精确
source_id、最大宽高、方向(含either)、所需交付格式(PDF、PPTX、PDF_AND_PPTX或OTHER)以及从已验证规则复制或总结的备注;物理裁切尺寸必须能放进去;对应 source 的 kind 必须是conference_rule。 - requirements.printer:必须确认并提供精确
source_id、与physical_output一致的裁切/出血/安全边距、可接受色彩模式(RGB、CMYK或PRINTER_MANAGED)、是否允许均匀缩放,以及描述已确认工作流的备注。若禁止缩放,画布与物理版面必须 1:1;CMYK 要求不阻止生成可编辑的 RGB PPTX,但导出计划会在获得打印机批准的转换/打样前阻断「可印刷」声明;对应 source 的 kind 必须是printer_rule。 - quality:
minimum_font_pt_final、minimum_raster_dpi_final等阈值的 basis 取值只有heuristic、source_specific、conference_requirement、printer_requirement四种;启发式必须为 null source ID,其余 basis 必须绑定精确 source ID;所有值作用于均匀缩放后的最终物理输出。 - palette:
colors映射稳定 ID 到不透明#RRGGBB;contrast_pairs每条含id、foreground_color_id、background_color_id和usage(normal_text、large_text或non_text)。校验器对正文文本应用 4.5:1、对大号文本/非文本应用 3:1;使用large_text的文本元素最终必须至少 18 pt,或至少 14 pt 且加粗。data_series_redundant_encoding必须为 true——这是作者关于颜色由标签、形状、标记、图案或线型补充的确认,而非自动化认证。 - sources:每条含
id、kind、citation、locator、author_verified: true。kind 包括作者内容、出版物、数据集、资产许可、会议规则、打印机规则、机构规则与其他。每个 source 必须被使用,每个被引用的 ID 必须存在;脚本不解析 URL、DOI 或本地记录。 - assets:数组可为空(图、Logo、QR 码都是可选的)。有资源时只接受本地 PNG/JPEG,每条含
id、manifest 相对path、role(figure/logo/qr_code)、小写 SHA-256、精确source_id、许可或权限声明、作者验证的来源/生成记录、精炼的alt_text、author_approved: true,以及qr_target(仅 QR 资产为非 null 的精确https://URL)。文件有大小上限、拒绝符号链接、路径不能逃逸 manifest 目录、哈希必须匹配。所有资源记录必须被放置到海报中;同一文件多次放置用一条记录,重复资产路径会被拒绝。 - elements:元素按
reading_order从 1 开始升序连续排列,列表顺序不会被静默改变。每个元素含id、type、reading_order、设计坐标x_in/y_in/width_in/height_in、一个或多个精确source_ids、author_approved: true、allow_in_bleed。所有框必须留在画布上;非出血元素必须位于映射到画布的物理安全区内;文本永远不允许出现在出血区。- 文本元素还指定
role(title、authors、affiliation、heading、body、caption、reference、acknowledgement、contact、qr_fallback、other 等)、精确text、font_size_pt_design、font_face、bold、水平/垂直对齐、contrast_pair_id、可选的line_color_id、line_width_pt、margin_in。字号在物理缩放后被检查,生成时自动缩小文本(auto-shrink)被禁用。 - 图像元素还指定
asset_id、fit: "contain"、fallback_text_element_id、long_description_element_id。Contain 拟合保持宽高比并居中图像。QR 资产要求正方形框,且必须有 role 为qr_fallback、文本包含精确qr_target的回退文本元素;其他资产的回退 ID 为 null。long_description_element_id在批准 alt text 加上相邻原生文本足够时为 null;复杂图形需要更长说明时,它引用一个 role 为body/caption/other的已批准原生文本元素,该元素必须在图像之后出现且包含图像用到的全部 source ID(QR 资产有可见回退文本,因此设为 null)。这个引用是结构性的,说明是否完整仍须由人来判断。
- 文本元素还指定
审批与内容哈希
在除approval外的所有字段通过校验后,获取内容哈希:
python -B scripts/validate_manifest.py poster.json \ --print-content-hash把这份确切的 manifest 和哈希交给作者审批。作者批准后,将approval.status设为approved、记录批准人与带 UTC 偏移的时间戳、并把哈希拷贝进approval.content_sha256。任何非审批字段的编辑都会使批准失效——哈希覆盖除approval外的所有顶层字段,使用规范化的排序 UTF-8 JSON 计算。也就是说,内容、来源、需求、调色板、坐标或资产元数据的任何改动都会让之前的批准作废。
批准后的完整校验(会读取并哈希资产、要求已批准):
python -B scripts/validate_manifest.py poster.json校验模式与退出码
--structure-only:跳过文件读取/哈希,但仍校验路径语法。仅供规划/审计使用,绝不可用于生成。--print-content-hash:允许 draft 审批状态,但不允许占位符、未验证来源、未批准元素或虚假确认。
所有 CLI 统一使用退出码:0 = 通过;1 = 审计发现阻断发布的严重问题;2 = 无效输入、不安全输入、缺失依赖或命令错误(这一约定在 manifest_spec.md 中有明文,且各脚本的CliError处理路径全部遵循)。
生成前审计:资源清单、调色板与导出计划
资源清单与有效 DPI
python -B scripts/inventory_images.py poster.json \ --output poster.assets.jsoninventory_images.py用精确 pin 的 Pillow 完整解码有界图像,并强制MAX_IMAGE_PIXELS = 100_000_000(1 亿像素)上限、把解压炸弹警告升级为错误、拒绝非 PNG/JPEG 格式、拒绝动图/多帧图、限制色彩模式为RGB/RGBA/L/LA(见 inventory_images.py)。
关键概念:有效 DPI = 像素数 ÷ 最终放置英寸数,而不是图像元数据里的 DPI。清单会拒绝 EXIF/XMP/注释以及嵌入的文本/应用元数据——应在离线的、作者评审的工作流中先展平并剥离这类元数据,再以新资产重新哈希、重新审批。ICC 配置文件和基本技术图像字段会被报告但不会被静默移除,这是为了避免在海报中发布隐藏的、可能暴露位置的信息。
调色板与 WCAG 对比度
python -B scripts/check_palette.py poster.json \ --output poster.palette.jsoncheck_palette.py采用WCAG 2.2 sRGB 数学计算声明对比度:正文文本 4.5:1(SC 1.4.3)、大号文本 3:1(且大号文本至少 18 pt 或 14 pt 加粗)、非文本 3:1(SC 1.4.11)。它同时输出所有颜色两两之间的对比度与 CIE L* 灰阶分离度作为筛查数据(check_palette.py 中THRESHOLDS与pairwise逻辑)。注意:把 WCAG 数值套用到物理海报上是设计目标而非独立的合规性声明;请保留颜色冗余的标签、标记、形状、图案或线型。
导出计划预检
python -B scripts/plan_export.py poster.json \ --output poster.export-plan.jsonplan_export.py会生成一份「需求绑定」的导出/印刷计划,明确区分 PowerPoint 画布、物理裁切、出血、缩放与色彩处理:
- 若打印机要求 CMYK,计划会添加
CMYK_CONVERSION_REQUIRED阻断项——不要声称原生 PowerPoint PDF 是符合 CMYK 的,必须取得打印机批准的转换/配置文件与打样; - 若交付格式为
OTHER,会添加DELIVERY_FORMAT_REVIEW阻断项,要求先记录组织者的确切工作流; - 计划列出
manual_actions:打开经技术检查的文件、运行无障碍检查、确认字体已安装并获得许可、检查替换/字形/溢出/对比度/所有边缘、按均匀比例print_scale * 100%输出(禁止非均匀的 fit-to-page 缩放)、对 QR 码保留可见 URL/文本并多设备测试、小尺寸打样并取得作者签署等。
设计原则详见 references/poster_design_principles.md。
生成 PPTX:从 JSON 到单页可编辑海报
使用新的输出路径:
python -B scripts/generate_poster.py poster.json \ --output poster.pptx \ --report poster.generation.json生成过程的行为(generate_poster.py 完整实现):
- 创建一个新的空白演示文稿,绝不加载用户模板(
Presentation()+presentation.slides.add_slide(presentation.slide_layouts[5]),即内置的 title-only 布局); - 在添加内容之前设置已批准的画布尺寸;
- 使用一个原生标题占位符、原生文本框和本地图片;
- 图片以
contain方式拟合、保持宽高比并居中(fit = min(box_width/width_px, box_height/height_px)的数学逻辑在_add_picture中); - 禁用文本自动缩小(
text_frame.auto_size = MSO_AUTO_SIZE.NONE); - 按已批准阅读顺序添加元素,形状命名为
R001_TEXT_<id>/R002_IMAGE_<id>这种可审计格式; - 把已批准的图片替代文本与显式文本语言写入 PresentationML(
p:cNvPr descr与非视觉绘制属性); - 不嵌入字体、音频、视频、OLE、ActiveX、链接或其他媒体;
- 移除默认的打印机设置二进制数据并规范化包内时间戳(
strip_generated_printer_settings); - 在 alt text 补丁前后各做一次包安全检查(
require_safe_pptx); - 拒绝重叠、越界形状、最终字号/DPI 过低、不安全的包以及已存在的输出路径。
生成器渲染的是 manifest 中的精确文本,它不负责创作、总结、研究或修正科学内容。同时,core.created/core.modified会被设为批准的 UTC 时间(approved_at以Z结尾时规范化为+00:00),把生成时间戳与作者审批绑定。
此外生成器在内部还做了几层自检:patch_accessibility_metadata之后再次运行包检查,若存在「图片缺少 alt text」「原生幻灯片标题占位符数量 ≠ 1」「文本 run 缺少显式语言」或直接形状顺序与批准阅读顺序不一致,都会抛出CliError拒绝发布(generate_poster.py)。
最终技术审计:包检查与布局检查
python -B scripts/inspect_pptx.py poster.pptx \ --output poster.package.json python -B scripts/check_layout.py poster.pptx \ --manifest poster.json \ --output poster.layout.json非执行的 ZIP/XML 包检查
inspect_pptx.py只读取有界的 ZIP 元数据与选中的 XML,从不解包成员、不打开也不执行演示文稿。它以严格的「单页生成海报」包档案(profile)为基准进行拒绝,拒绝项包括:
- 每一个非
.pptx扩展名,包括.pptm; - 超出有界单页生成器档案范围的包;
- 宏/VBA、ActiveX、自定义 UI、OLE、嵌入、可执行与二进制部件;
- 每一个外部关系,包括远程链接图像和超链接(即使普通超链接也被拒绝,QR 用可见回退文本代替可点击链接);
- 不安全的/重复的 ZIP 路径、符号链接、加密、过大的解压、过高的压缩比;
- 畸形或携带实体声明的被检 XML;
- 缺失的内部关系目标。
ZIP 预检的防御性本地策略限制(references/pptx_security.md):输入文件上限 512 MiB、中央目录上限 64 MiB、成员上限 4096、单个未压缩成员上限 128 MiB、总未压缩上限 1 GiB、压缩比上限 100:1、仅允许 stored/deflated 方法、拒绝加密与符号链接成员、拒绝绝对/穿越/反斜杠/重复/大小写冲突名称、拒绝多磁盘或 ZIP64、拒绝不在精确路径白名单内的部件。ZIP 脚注在 Python 构造ZipFile成员列表之前直接读取,因此在库实例化攻击者可控条目之前就先界定了声明成员数与中央目录大小。代码从不调用ZipFile.extract/extractall,从根源上消除路径逃逸。PNG/JPEG 媒体后缀必须匹配字节签名并通过 ZIP CRC 校验。
注意:标准 ZIP/XML 校验不是完整的 ECMA-376 schema 校验;包检查也不能充当杀毒软件结论。即使报告「干净」,仍需组织的恶意软件扫描、沙箱、Office 受保护视图与补丁管控。安全与威胁模型细节请阅读 references/pptx_security.md 与 references/security_validation.md。
布局检查
check_layout.py直接读取 PPTX 形状包围盒,检查重叠与越界放置、列出包内阅读顺序,并按最终印刷比例筛出显式字号。它支持--manifest(从已批准 manifest 读取印刷比例与字号要求)或独立的--print-scale+--minimum-font-pt-final(默认项目启发式 18 pt)。当与 manifest 一起使用时,它还会追加两项额外检查:
CANVAS_MISMATCH:PPTX 幻灯片尺寸与已批准 manifest 不符(容差 0.001 英寸);READING_ORDER_MISMATCH:PPTX 直接形状顺序/命名与已批准 manifest 的阅读顺序不符。
人工 PowerPoint 与无障碍闸门:自动化无法替代
自动化无法认证无障碍、文本渲染或科学准确性。必须在已打满补丁的 PowerPoint中人工完成(SKILL.md 的 Manual gate 一节):
- 只打开生成的、技术上干净的文件;
- 运行“审阅 > 检查辅助功能”(Review > Check Accessibility);
- 检查“阅读顺序”窗格和对象名称;
- 审查每一条替代文本与原生长描述;
- 测试键盘与屏幕阅读器导航;
- 确认字体已安装/已授权;检查嵌入选择、替换、字形、公式、溢出、对比度和所有边缘;
- 验证颜色绝不是唯一的编码方式;
- 测试每个 QR 码及其可见的回退 URL/文本;
- 获得作者对所有内容和引用的签署。
Microsoft 的 18 pt 幻灯片字号建议不是通用的海报下限——应使用 manifest 中标注了依据的字号基准与打样,在最终物理输出上评估字号。
导出与印刷
使用已批准的导出计划。当需要 PDF 时,从评审过的 PowerPoint 中以标准/高质量打印质量导出,而不是“最小文件大小”。
独立验证 PDF:页面/版面尺寸、方向、裁切与出血;若要求则单页输出;字体、裁切、字形、公式与图像重采样;标签、阅读顺序、替代文本、语言与链接;RGB/CMYK 转换与物理色彩打样;会议命名、文件大小与上传规则。
打印缩小比例的打样并取得打印机要求的打样。任何改动后都要重新运行全部检查。发布签署使用 assets/poster_quality_checklist.md。
七个 CLI 工具一览
| CLI | 作用 |
|---|---|
| validate_manifest.py | 严格的内容/来源/审批校验器,支持--structure-only与--print-content-hash |
| generate_poster.py | 精确锁定依赖的本地 PPTX 生成器,拒绝占位符、未批准内容、远程资源与覆盖写入 |
| inspect_pptx.py | 非执行的 ZIP/XML 安全检查器 |
| check_layout.py | 边界、重叠、阅读顺序与最终字号检查器 |
| inventory_images.py | 资产哈希/元数据/有效 DPI 清单 |
| check_palette.py | WCAG 对比度与启发式调色板报告 |
| plan_export.py | 尺寸、缩放、字体、色彩、媒体、导出与印刷预检 |
其中_common.py、_manifest.py、_pptx.py提供共享的校验、安全检查与原子发布工具函数。仓库中的测试(tests/pptx-posters/下含test_generation_smoke.py、test_scripts.py、test_static.py、synthetic_posters.py)对生成冒烟、各脚本行为与静态约束做了覆盖,可作为你验证自身使用方式正确性的参照。
端到端工作流速查
# 1. 安装精确依赖(在 skills/pptx-posters 目录) uv venv uv pip install "python-pptx==1.0.2" "Pillow==12.3.0" "lxml==6.1.1" # 2. 复制模板并填写(替换所有 REPLACE_ME_*、置 true 确认、作者批准每元素) cp assets/poster_manifest_template.json poster.json # 3. 计算内容哈希并交给作者批准 python -B scripts/validate_manifest.py poster.json --print-content-hash # 4. 批准后完整校验 python -B scripts/validate_manifest.py poster.json # 5. 生成前审计 python -B scripts/inventory_images.py poster.json --output poster.assets.json python -B scripts/check_palette.py poster.json --output poster.palette.json python -B scripts/plan_export.py poster.json --output poster.export-plan.json # 6. 生成 PPTX python -B scripts/generate_poster.py poster.json --output poster.pptx --report poster.generation.json # 7. 最终技术审计 python -B scripts/inspect_pptx.py poster.pptx --output poster.package.json python -B scripts/check_layout.py poster.pptx --manifest poster.json --output poster.layout.json # 8. 人工:PowerPoint 无障碍检查 → PDF 导出 → 印刷打样 → 作者签署设计边界与正确预期
最后需要明确本技能的能力边界(pptx_security.md 的 Residual technical limits 一节):
- 标准 ZIP/XML 校验不是完整的 ECMA-376 schema 校验;
- 独立的包检查校验图像签名/CRC,而非图像解码器安全性(生成环节另行做有界、精确 pin 的 Pillow 解码);
- 它不渲染文本、公式、字体、透明度或颜色;
- 它无法认证无障碍、科学准确性或印刷就绪状态;
- 它有意拒绝安全但非必需的特性(如超链接与嵌入文件);
- 受密码保护的加密包会被拒绝而非解密。
这些限制是设计边界,而不是绕过检查的邀请。正因如此,pptx-posters的产出路径始终是「严格本地 JSON → 可编辑单页 PPTX → 技术审计通过 → 人工无障碍与打印评审 → 作者签署」,每一层都独立可验证,最终交付给会议的是一张内容精确、来源可溯、包内无宏无外部关系、并经过人工确认的科学海报。
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考