OCRmyPDF 终端演示(screencast)的录制与再生成完整指南
OCRCLI【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址https://gitcode.com/GitHub_Trending/oc/OCRmyPDF点击查看免费下载本篇指南围绕 misc/screencast/README.md 展开完整讲解 OCRmyPDF 仓库中终端演示动画demo.svg的录制、回放与再生成工作流并对照源码剖析演示中每个阶段背后的真实处理逻辑让读者既会“录演示”也看得懂演示里 OCRmyPDF 到底在做什么。OCRmyPDF 是一个为扫描版 PDF 添加 OCR 文本层、使其可搜索可复制的命令行工具。为了让用户一眼看懂它的真实用法项目在 misc/screencast/demo.svg 中内置了一段终端演示动画——它展示了一条以ocrmypdf为主角、包含“页面扫描 → 并行 OCR → PDF/A 转换 → 图像优化”的完整命令执行过程。本文首先完整呈现这段演示的产出物再逐步拆解“如何重新录制、如何加速重放、如何导出 SVG”最后逐一对照源码说明演示中每一步的底层实现方便你将该工作流复用到自己的项目演示制作中。一、先看成品演示动画到底演示了什么demo.svg是一张由 svg-term 从 asciinema 录像转换而来的自播放 SVGmisc/screencast/demo.svg1350×581内嵌 CSS 动画浏览器中即可循环播放。它被直接用于项目主页README.mdimg srcmisc/screencast/demo.svg altDemo of OCRmyPDF in a terminal sessionREADME_ZH.md同样引用了该图中文 alt 文本“OCRmyPDF 在终端会话中的演示”如果打开misc/screencast/demo.castasciinema v2 格式的原始录像宽 131 字符 × 高 24 行环境为fishshell xterm-256color可以看到录像中的命令序列与输出ocrmypdf multipage.pdf multipage_ocr.pdf # 键入命令含颜色/下划线高亮 Scanning contents: 100%|████| 6/6 [00:0000:00, 1270.68page/s] ← 第一步扫描 PDF 内容 Start processing 6 pages concurrently ← 第二步并发处理 6 页 OCR: 0%| ... | 0.0/6.0 ← 第三步逐页 OCR OCR: 100%|████| 6.0/6.0 [00:0600:00, 1.09s/page] Postprocessing... ← 第四步后处理 PDF/A conversion: 0%| ... | 0/6 ← 第五步PDF/A 转换 PDF/A conversion: 100%|████| 6/6 [00:0200:00, 2.71page/s] Some input metadata could not be copied because it is not permitted in PDF/A... Recompressing JPEGs: 0image ... Deflating JPEGs: 100%|████| 4/4 [00:0000:00, 238.28image/s] ← 第六步图像优化 JBIG2: 0item ... Image optimization ratio: 1.01 savings: 1.3% Total file size ratio: 1.02 savings: 1.6% Output file is a PDF/A-2b (as expected) ← 最终校验结果这段演示用一条命令完整串起了 OCRmyPDF 的核心处理链输入 PDF → 内容扫描 → 并行 OCR → 后处理 → PDF/A 转换 → 图像优化 → 输出校验。multipage.pdf是 tests/resources 中的测试样本如 tests/resources/multipage.pdf因此演示本身也兼任“冒烟测试”只要再生成流程跑得通说明整个 CLI 链路可用。图片使用说明demo.svg本身就是本指南主题——即“OCRmyPDF 终端演示”的成品属于强相关插图放在摘要之后配合文字阅读。二、准备工作安装 asciinema 与 svg-term根据 misc/screencast/README.md 的说明再生成流程依赖两个工具asciinema终端会话录制器负责把真实命令执行过程录成.cast文件JSON 行格式v2 版本。svg-termCLI 包名为svg-term-cli把.cast转换为可内嵌、可自播放的 SVG 动画。安装 svg-term 的命令在文档中已给出通过 npm 全局安装npm install -g svg-term-cli而 asciinema 通常通过系统包管理器安装如apt install asciinema本项目没有固定其版本要求只要支持rec、play两个子命令即可。注意demo.svg与demo.cast在仓库中属于 REUSE.toml 声明的文档资产misc/screencast/**SPDX 许可为 CC-BY-SA-4.0。再生成时请保持原路径与文件名避免破坏 README 中的相对引用。三、录制前配置让提示符“上镜”原始录像使用fishshell提示符被精简成避免录制画面出现过长、无关的 shell 提示信息。文档给出了对应的 asciinema 配置文件~/.config/asciinema/config[record] command fish --init-command alias fish_promptecho \\ 这段配置的含义[record]段下的command指定 asciinema 录制时启动的 shellfish --init-command ...让 fish 在启动时立即执行别名定义alias fish_promptecho \\ 把提示符重定义为固定字符串并转义了使其不被 fish 当作重定向符这样每次回车后提示符都是一致的录出来的动画干净且不带机器信息。如果你使用 bash/zsh可以等价地改为command bash --rcfile (echo export PS1 )之类的方式关键是让提示符恒定、简短、无颜色保证重放和 SVG 输出稳定。四、录制“原料”第一次 raw 录制文档给出的第一步是录制原始会话asciinema rec new_input.cast执行后会进入由配置文件指定的 fish shell此时你键入并执行演示命令例如ocrmypdf multipage.pdf multipage_ocr.pdf或仓库中的多页测试文件录制结束后按CtrlD退出new_input.cast即保存了完整的原始时序数据。.cast文件是纯文本、按行组织的 JSON 事件流第一行为元数据头version、width、height、timestamp、env其后每一行形如[相对秒数, o, 输出字节]o 代表 output另外还有 i 代表 input。例如demo.cast首行就是{version: 2, width: 131, height: 24, timestamp: 1687247006, env: {...}}。这意味着你完全可以用文本编辑器手工构造或修剪.cast为后续“去除停顿”的重录做准备。五、重录加速版去掉停顿加快节奏原始录制往往包含大量思考停顿和逐字键入过程不适合作为最终动画。README 给出的第二步是用 asciinema 自带的播放器配合重录来“压节奏”asciinema rec demo.cast -c asciinema play new_input.cast --speed 2 --idle-time-limit 0.5这条命令做了三件事asciinema play new_input.cast—— 重放刚才录制的 raw 会话--speed 2—— 以 2 倍速重放缩短逐字键入与输出动画的时间--idle-time-limit 0.5—— 把任意超过 0.5 秒的空闲时间压缩到 0.5 秒消除用户思考造成的长时间“静默”外层再用asciinema rec demo.cast -c ...把这次加速后的重放重新录制成新的.cast。也就是说以播放器为“表演者”再录一遍得到的就是节奏紧凑、停顿可控的demo.cast。参数调优提示--speed控制整体倍速--idle-time-limit的单位是秒值越大动画越“跳跃”。想让最终 SVG 更流畅可把 idle 上限进一步调小如0.2speed 调到3左右。六、导出为 SVGsvg-term 一步到位最后一步是把demo.cast渲染成 README 中引用的动画图svg-term --inmisc/screencast/demo.svg --outmisc/screencast/demo.svg --window注意 README 原文写作--inmisc/screencast/demo.cast --outmisc/screencast/demo.svg --window其中--in应为输入.cast路径svg-term --inmisc/screencast/demo.cast --outmisc/screencast/demo.svg --window参数说明--in输入 asciinema 录像文件路径--out输出 SVG 文件路径覆盖写入misc/screencast/demo.svg--window为 SVG 添加 macOS 风格窗口边框红黄绿三色圆点这就是demo.svg顶部三个圆点的来源。生成后可用浏览器直接打开demo.svg验证动画与配色demo.svg内嵌keyframes动画与等宽字体栈Monaco,Consolas,Menlo,...无需任何外部资源可离线播放。七、演示内容背后的源码实锤每一行进度条都对应真实处理阶段demo.cast里出现的每一行输出都能在源码中找到对应实现这也是该演示可以“充当冒烟测试”的原因。下表给出关键输出与源码的对应关系演示输出源码位置含义Scanning contents: ... page/ssrc/ocrmypdf/pdfinfo/_worker.py用并发 worker 分析每页进度条descScanning contentsStart processing 6 pages concurrentlysrc/ocrmypdf/_pipelines/ocr.py根据--jobs与 CPU 数计算并发数并输出日志OCR: ... page/ssrc/ocrmypdf/_pipelines/ocr.py每页 OCR 任务进度descOCRPostprocessing...src/ocrmypdf/_pipelines/ocr.py进入 PDF/A 与元数据后处理阶段PDF/A conversion: ... page/ssrc/ocrmypdf/_exec/ghostscript.py解析 Ghostscript 日志并驱动descPDF/A conversion进度条Some input metadata could not be copied...src/ocrmypdf/_metadata.pyPDF/A 不允许的元数据字段被丢弃时告警Recompressing JPEGs / Deflating JPEGs / JBIG2src/ocrmypdf/optimize.py图像优化各子阶段JPEG 重压缩、JPEG 解压重编码、JBIG2 识别Image optimization ratio: ... savings: ...src/ocrmypdf/_pipeline.py计算输入/输出文件大小比率与节省百分比Output file is a PDF/A-2b (as expected)src/ocrmypdf/pdfa.py 的 PDF/A 校验逻辑验证输出符合 PDF/A 规范7.1 页面扫描Scanning contentsOCRmyPDF 首先用 pdfminer 分析每个页面的内容判断“哪些页有文本、哪些页只有图像”这决定了后续 OCR 策略。实现见 src/ocrmypdf/pdfinfo/_worker.py根据页数自动计算 worker 数n_workers min(1 len(pages)//4, max_workers)并带有Scanning contents进度条。演示中6/6 [1270.68page/s]说明 6 页瞬间扫描完成——因为该阶段不做任何像素级工作。7.2 并发 OCR 与逐页回填src/ocrmypdf/_pipelines/ocr.py 中exec_concurrent根据options.jobs与可用 CPU 核数确定max_workers大于 1 时打印Starting processing with N workers concurrently演示中是 6 页并发。每页完成后通过update_page回调把 OCR 文本层“嫁接”graft回 PDF进度条每次更新 0.5前半用于 OCR后半用于回填。演示中OCR: 100%|...| 6.0/6.0 [00:06, 1.09s/page]即该阶段 6 页耗时约 6 秒的记录。7.3 PDF/A 转换与元数据告警OCRmyPDF 默认输出 PDF/A-2b。转换由 Ghostscript 完成进度解析逻辑在 src/ocrmypdf/_exec/ghostscript.py从 GS 日志正则匹配总页数与当前页驱动PDF/A conversion进度条。由于 PDF/A 对 XMP/元数据有严格约束部分输入元数据如 JavaScript、表单、特定 DocInfo 字段会被移除并打印演示中的那条黄色警告——对应 src/ocrmypdf/_metadata.py 的report_on_metadata。7.4 图像优化与体积比优化由内置插件 src/ocrmypdf/builtin_plugins/optimize.py 控制-O/--optimize取值 0–3默认 1无损安全优化--jpeg-quality0–100默认 0 表示使用默认值与--png-quality控制有损质量。演示中的Recompressing JPEGs、Deflating JPEGs、JBIG2对应 src/ocrmypdf/optimize.py 的三个子任务。最后 src/ocrmypdf/_pipeline.py 计算Image optimization ratio与Total file size ratio演示中savings: 1.6%说明输出略小于输入因为嵌入图片多以无损压缩存储优化空间有限属正常现象。7.5 进度条基础设施以上所有进度条统一走 src/ocrmypdf/_progressbar.py 定义的ProgressBar协议基于rich库实现文档注释特别强调“进度条绝不能写sys.stdout”否则会把 PDF 输出到标准输出时弄脏数据流。八、把该工作流复用到你自己的演示结合前几节你可以为任何 CLI 工具制作同样的“录制 → 加速重放 → SVG 导出”流水线# 1) 配置干净提示符以 fish 为例 mkdir -p ~/.config/asciinema cat ~/.config/asciinema/config EOF [record] command fish --init-command alias fish_promptecho \\ EOF # 2) 录制原始会话 asciinema rec new_input.cast # ... 键入演示命令CtrlD 结束 # 3) 加速重放并重录 asciinema rec demo.cast -c asciinema play new_input.cast --speed 2 --idle-time-limit 0.5 # 4) 导出 SVG--window 可选会绘制 macOS 窗口边框 svg-term --inmisc/screencast/demo.cast --outmisc/screencast/demo.svg --window # 5) 在 README 中引用注意用仓库根目录相对路径 # img srcmisc/screencast/demo.svg altDemo of OCRmyPDF in a terminal session实践建议演示脚本要短而完整挑选一条能展示“输入 → 处理 → 校验”全流程的命令如本演示的ocrmypdf multipage.pdf multipage_ocr.pdf结尾保留Output file is a PDF/A-2b (as expected)这类成功校验信息观众一眼看到预期结果固定终端尺寸与配色.cast头部的width/height决定 SVG 画布大小demo.svg使用 131×24 与 xterm-256color重录时尽量保持一致避免 SVG 变形注意许可证本仓库中该目录资产按 REUSE.toml 声明为 CC-BY-SA-4.0若将demo.svg/demo.cast复用到其他项目请保留许可证信息验证再生成从new_input.cast出发完整跑一遍本节命令若能产出可播放的demo.cast与demo.svg即说明你已复现了项目维护者的演示制作流程——这也是对该仓库“演示即冒烟测试”理念的实践。九、常见问题svg-term提示找不到命令确认已npm install -g svg-term-cli并把 npm 全局 bin 目录加入PATH。重录后动画仍有长停顿调小--idle-time-limit如0.2并适当提高--speed。SVG 宽度/高度异常检查录制终端尺寸是否与.cast头部一致必要时用--cols/--rows重录。演示输出与预期不符对照 7 节表格核对各阶段输出Postprocessing...之后仍可能因元数据、字体子集化等产生额外日志属正常现象。赞分享OCRCLI【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址https://gitcode.com/GitHub_Trending/oc/OCRmyPDF点击查看免费下载相关推荐Playwright CLI 视频录制指南用 playwright-cli 与 Screencast API 生成带章节与标注的 WebM 演示视频Playwright CLI 视频录制指南用 playwright cli 与 Screencast API 生成带章节与标注的 WebM 演示视频 Play测试开发工具浏览器控制Playwright 页面级 Screencast 完整指南录屏、JPEG 逐帧回调与演示叠加层v1.59Playwright 页面级 Screencast 完整指南录屏、JPEG 逐帧回调与演示叠加层v1.59 自 Playwright v1.59 起每测试开发工具浏览器控制React-H5-Audio-Player完全指南打造跨设备响应式音频播放体验React H5 Audio Player完全指南打造跨设备响应式音频播放体验 React H5 Audio Player是一款专为React应用设计的音频播上一篇PowerShellEditorServices性能优化指南提升大型PowerShell项目编辑体验的10个技巧下一篇读懂heretic-studyQwen3.8-27B-Uncensored-GGUF的200次Optuna搜索与帕累托数据分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考