视觉画布设计
canvas-design
基于设计原则创作静态视觉作品,用于海报与品牌图形。
img2pdf【文档与办公】将图片或 PDF 页面编排为 A4 PDF,按原文页边界裁切文书滚动截图,或将连续长图转为长页 PDF。本技能应在用户需要截图合并为 PDF、庭审笔录截图裁掉手机界面和上下邻页、每页只留当页内容时使用。不要用于:OCR 文字识别、PDF 正文编辑、独立图片格式转换。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
本技能解决"大量截图/照片需要编排为紧凑 PDF 提交"以及"超长截图(微信聊天、庭审笔录)需要保留上下逻辑转为 PDF"的问题。核心场景是法律证据材料整理。
核心职责:
本技能不做 OCR、不编辑 PDF 内容、不处理视频文件。若需要从视频提取截图,先使用 video-screenshot。
| 输入与用户目标 | 处理方式 |
|---|---|
| 文书阅读器截图,露出相邻页,要求“每页只有当页” | 先逐图确认完整页四边、原页码和顺序,再按原图像素裁切,显式 --per-page 1;读取文书截图裁切 |
| 没有原文分页的连续长截图,希望保留整段上下文 | --mode vertical;这是连续长图模式,不因内容叫庭审笔录就自动采用 |
| 连续长内容需分段后紧凑排版 | --split 配合 --per-page;按高度切段,不识别原文页 |
| 普通照片、视频截图、已有独立 PDF 页 | 沿用 N 张/页编排 |
文书截图裁切先看每张原图;不能用截图固定坐标、最长白块或 A4 比例代替页身份确认。保留当页正文、页眉、原页码、签字/印章及原有水印,去掉页面外 UI 和邻页。缺失或被遮挡的正文不补写。
执行本模式时按 reference 中的逐图六步执行卡操作:取得原尺寸 → 列候选纸页 → 确认完整当页 → 沿四边定原图坐标 → 试裁看结果 → 编排后看 PDF。先试一张再处理整批;候选页不完整或边界看不清时回看局部/同页其他源图,不批量猜坐标。reference 提供靠上/居中/靠下示意、界面与页内内容对照、坐标换算算例和失败修正表。
脚本需要本地 Python 执行、指定输入的文件读取及指定输出目录的文件写入;不外传。裁切清单/收据包含来源路径和页身份,放在用户私有材料目录。保留原文件,选择新 PDF 输出名。固定高度切段流程只清理自身创建的临时目录。
--normalize-a4 只做页面标准化,不做多图编排。无额外系统依赖。
| 包名 | 用途 | 安装命令 |
|---|---|---|
pypdf>=4.0.0 | PDF 页面变换与合并 | python3 -m pip install -r scripts/requirements.txt |
Pillow>=10.0.0 | 图片格式检测 | 同上 |
PyMuPDF>=1.24.0 | 图片转 PDF 页面 | 同上 |
只看图规划无需 Python 包;裁切脚本只需 Pillow,编排 PDF 需要上表全部依赖。优先使用宿主已有运行环境,缺包时按首次使用位置安装。
根据 --input 参数收集图片或 PDF 文件。如果是目录,扫描其中所有支持格式的图片。按文件名或修改时间排序。
需要原文页裁切时,先按文书截图裁切核对页身份、逐张四边、遗漏/重复和文书分组,用 scripts/crop_document_pages.py 生成顺序编号 PNG,再执行以下编排。文件名只作为线索,顺序以原页码及正文衔接复核。
根据 --per-page 和页面方向计算每张图片的可用区域:
per-page=1:整页减去边距,横竖由图片方向决定。per-page=2:A4 横版,左右两列。per-page=3:A4 横版,三列并排。per-page=4:A4 横版或竖版,2×2 网格。per-page=auto(默认):竖版图多 → 3张/页,横版图多 → 1张/页。每张图片等比缩放适配其可用区域,居中放置。
将编排后的页面写入输出 PDF。不修改任何原始文件。
首次使用时安装依赖:
python3 -m pip install -r scripts/requirements.txt
python3 scripts/img_to_pdf.py \
--input /path/to/screenshots/ \
--output /path/to/output.pdf
# 自动检测:竖版图多 → 3张/页
python3 scripts/img_to_pdf.py \
--input /path/to/desktop-screenshots/ \
--output /path/to/output.pdf
# 自动检测:横版图多 → 1张/页(A4横版)
python3 scripts/img_to_pdf.py \
--input /path/to/screenshots/ \
--output /path/to/output.pdf \
--per-page 2
python3 scripts/img_to_pdf.py \
--input /path/to/frames/ \
--output /path/to/output.pdf \
--per-page 3
python3 scripts/img_to_pdf.py \
--input /path/to/original.pdf \
--output /path/to/repacked.pdf \
--per-page 2
python3 scripts/img_to_pdf.py \
--input img1.jpg img2.jpg img3.png \
--output /path/to/output.pdf \
--per-page 3
python3 scripts/img_to_pdf.py \
--input /path/to/wechat_long.png \
--output /path/to/wechat.pdf \
--split \
--per-page 3
# 1080×6000 → 按 1080×√2≈1527px 切 4 段 → 2 页 A4 横版
python3 scripts/img_to_pdf.py \
--input /path/to/wechat_long.png \
--output /path/to/wechat.pdf \
--split \
--split-height 1500 \
--per-page 3
python3 scripts/img_to_pdf.py \
--input /path/to/transcript.png \
--output /path/to/transcript.pdf \
--mode vertical
# 不切割,1080×5000 → 1 页 595×2573pt
# 页面高度按图等比缩放,保留上下逻辑
截图显示多张原文纸页、用户要求每页仅当页时,改走原文页裁切,不要把手机界面和邻页一起塞进长页,也不要用固定高度切断原文分页。
python3 scripts/img_to_pdf.py \
--input /path/to/dir/ \
--per-page 2 \
--dry-run
| 参数 | 说明 | 默认值 |
|---|---|---|
--input / -i | 图片文件、PDF 文件或目录(必填) | - |
--output / -o | 输出 PDF 路径 | <输入名>_编排.pdf |
--mode | 编排模式:nup(N 张/页)或 vertical(单图一长页) | nup |
--per-page / -n | nup 模式下每页图片数:1/2/3/4,或省略自动 | auto(竖版3张,横版1张) |
--margin / -m | 页边距(pt) | 25 |
--orientation | nup 模式页面方向:auto/landscape/portrait | auto |
--sort | 排序:name/time/none | name |
--split | 启用长截图切割(nup 模式) | 关闭 |
--split-height | 切割段高(px);不传 = 按 A4 比例(图宽 × √2);vertical 模式忽略 | A4 比例 |
--dry-run | 仅预览不输出 | false |
| 维度 | nup | vertical |
|---|---|---|
| 是否切割 | 视 --split 而定 | 不切(强制) |
| 每页图数 | 1/2/3/4 | 必为 1 |
| 页面尺寸 | A4 固定 | 宽度固定 A4 595pt,高度按图等比 |
| 适用场景 | 微信聊天、视频截图、证据照片 | 庭审笔录、单页长截图 |
完成后检查:
--split-height 或 A4 比例默认;vertical 模式页面高度 = 图高 × (A4 宽 - 2×margin) / 图宽 + 2×margin。/tmp/img2pdf-splits-* 不残留)。