ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在 Python 应用中调用 ocrmypdf.ocr:OcrOptions、日志配置与 stdout 约束

在 Python 应用中调用 ocrmypdf.ocr:OcrOptions、日志配置与 stdout 约束 在 Python 应用中调用 ocrmypdf.ocrOcrOptions、日志配置与 stdout 约束【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF如果你的 Python 应用需要给扫描版 PDF 加上可搜索的 OCR 文本层又不想走 subprocess 拼命令行OCRmyPDF 提供了高层函数ocrmypdf.ocr传入输入输出文件和一组选项函数运行完整 OCR 流程并返回退出码。本文覆盖调用这个函数时的三件关键事用OcrOptions组织参数、配置日志、以及遵守它对 stdout 的严格约束。适用前提你的 Python 环境可以import ocrmypdf该包以命令行程序起家但文档明确说明其部分能力可以被其他 Python 应用导入使用。文档同时提示有些应用更宜通过 subprocess 调用命令行以隔离其行为本文是进程内调用这条路径。用 OcrOptions 发起一次 OCROcrOptions自 17.0 起从顶层ocrmypdf模块导出。它是一个 Pydantic 模型提供完整类型提示、IDE 自动补全并在构造时校验选项值。推荐的调用方式是构造一个OcrOptions对象作为唯一参数import ocrmypdf from ocrmypdf import OcrOptions if __name__ __main__: # To ensure correct behavior on Windows and macOS options OcrOptions( input_fileinput.pdf, output_fileoutput.pdf, deskewTrue, languages[eng], ) ocrmypdf.ocr(options)其中input.pdf/output.pdf替换为你的实际输入输出路径。OcrOptions中的字段与命令行参数一一对应例如languages是识别语言列表、deskew控制纠偏。旧的位置参数风格面向 OCRmyPDF 17 的兼容仍然受支持import ocrmypdf if __name__ __main__: # To ensure correct behavior on Windows and macOS ocrmypdf.ocr(input.pdf, output.pdf, deskewTrue)这一风格下所有命令行参数都可以作为等价的关键字参数传入。两个已知差异verbose和quiet不可用。API 中与命令行--quiet/--verbose没有对应物输出必须通过配置 logging 管理见后文。旧式调用里传verbose只会被忽略并产生警告提示改用ocrmypdf.configure_logging()。传入OcrOptions时不要同时传其他 OCR 参数否则会抛ValueError需要额外设置请写进OcrOptions本身。plugins和plugin_manager例外可以与OcrOptions同时传入但二者互斥。让调用在子进程中进行ocrmypdf.ocr的运行方式接近命令行执行它会创建 worker 进程或线程、管理 worker 的信号标志、执行其他子进程fork 并运行其他程序。因此调用它的 Python 进程必须有足够权限完成这些动作。文档给出的建议是创建子进程来调用ocr()这样即使 OCRmyPDF 因任何原因失败你的应用也能存活并保持交互from multiprocessing import Process import ocrmypdf from ocrmypdf import OcrOptions def ocrmypdf_process(): options OcrOptions(input_fileinput.pdf, output_fileoutput.pdf) ocrmypdf.ocr(options) def call_ocrmypdf_from_my_app(): p Process(targetocrmypdf_process) p.start() p.join()同一文档列出的几条与父进程相关的约束ocr()会持有线程锁防止同一解释器进程内多个实例同时运行由于插件系统与 Python 导入机制的原因它不是线程安全的。需要并行时请用多进程。jobs参数限制 worker 进程数量目前没有其他调度手段。除 Windows 外调用ocr()的程序应安装 SIGBUS 信号处理器以便内存映射文件访问失败时抛出异常——OCRmyPDF 可能使用内存映射。在 Windows 和 macOS 上调用脚本必须带if __name__ __main__保护否则进程语义会导致 OCRmyPDF 无法正确工作。上面的示例都保留了这个守卫。配置日志configure_logging 或自行管理OCRmyPDF 在名为ocrmypdf的 logger 下记录日志此外它导入的pdfminer和PIL也分别在这两个命名空间下打日志。你有两条路调用ocrmypdf.configure_logging让日志输出与 ocrmypdf 命令行界面一致。第一个参数是Verbosity枚举取值quiet -1、default 0、debug 1、debug_all 2import ocrmypdf ocrmypdf.configure_logging(ocrmypdf.Verbosity.default)自行配置如果不调用configure_loggingocrmypdf 不会替你配置日志由调用方用标准库logging按需处理ocrmypdf命名空间。源码文档提示pdfminer在logging.INFO级别下非常啰嗦可以一并调高它的级别。几个必须知道的边界configure_logging的细节是内部微调、随时可能变化它是为想要和 ocrmypdf 命令行几乎一致的包装脚本设计的。如果你的应用自己管理日志文档明确说你可能并不想要这个函数。该函数不会创建命令行在特定 verbose 级别下会生成的debug.log日志文件应用要自己配置 debug 日志。进度条基于rich包实现。configure_logging会把日志输出配置到sys.stderr其方式与进度条显示兼容不想显示进度条时用ocrmypdf.ocr(..., progress_barFalse)。stdout 约束进程内调用时最容易踩的坑OCRmyPDF 严格地不向标准输出写任何东西目的是让用户可以安全地把它用在管道中并得到合法输出文件。对进程内调用者这意味着两点如果你的应用希望兼容这一行为、支持把结果管道到文件你自己的代码也不要向 stdout 写东西。上面的子进程方案还有一个附带好处ocrmypdf 的杂散输出不会干扰父进程的 stdout。当output_file-时最终 PDF 直接写到sys.stdout此时 stdout 上的字节必须恰好是 PDF 且别无其他。可选地在调用ocr()之前调用ocrmypdf.configure_stdout_protection()可以强化这一保证它把文件描述符 1 重定向到 stderr同时保存真实 stdout 的私有副本这样任何误写 stdout 的内容会无害地落到 stderr而 OCRmyPDF 仍把最终 PDF 输出到保留的描述符。这要求尽早、只调用一次在加载任何插件或启动任何 worker 之前让后续代码继承重定向后的描述符。反过来管理自己 stdout 的应用例如长驻服务在进程内反复调用ocr不应该调用它因为它会改动进程全局的文件描述符。如何判断这次调用是否成功ocrmypdf.ocr的返回值是ocrmypdf.ExitCode整数退出码条件性成功时以返回码表达而不是抛异常import ocrmypdf from ocrmypdf import OcrOptions if __name__ __main__: options OcrOptions(input_fileinput.pdf, output_fileoutput.pdf) code ocrmypdf.ocr(options) print(fexit code: {code}, filesys.stderr) # 注意不要写 stdoutExitCode定义在 exceptions.pyok 0表示正常其他取值如bad_args 1、input_file 2、missing_dependency 3、already_done_ocr 6、encrypted_pdf 8、other_error 15、ctrl_c 130。失败则体现为异常。api.py 的函数文档列出了可能抛出的异常父进程应当提供异常处理器常见包括异常触发条件MissingDependencyError依赖的命令行程序缺失或不在 PATH 上UnsupportedImageFormatError输入图像无法读取或输入不是 PDFDpiError输入是图像但分辨率不可信继续会产生糟糕的 OCREncryptedPdfError输入 PDF 加密受保护OCRmyPDF 不解除密码PriorOcrFoundError输入 PDF 疑似已有 OCR 或数字文本而设置未指示继续OutputFileAccessError写入目标输出文件失败InputFileError/SubprocessOutputError/TesseractConfigError其他输入文件问题 / 子进程执行错误 / Tesseract 报告配置无效此外还可能出现标准 Python 异常、部分与 multiprocessing 相关的异常以及KeyboardInterrupt。发生异常时OCRmyPDF 会自动清理其临时文件和 worker 进程你的处理逻辑不需要替它善后。限制与下一步同一个 Python 进程同时只能运行一个 OCRmyPDF 任务线程锁水平扩展请用多个 Python 进程。传入OcrOptions与其他 OCR 关键字参数并存会直接ValueError不是覆盖关系。插件开发相关自 16.13 起插件钩子接收OcrOptions对象而非argparse.Namespace但二者鸭子类型兼容多数现有插件无需修改。更多参数含义以 docs/api.md 和与命令行参数一一对应的选项文档为准公开 API 的完整参考见 docs/apiref.md。【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表