"""PDF → 图片 (使用 PyMuPDF,无需 poppler 系统依赖)""" from __future__ import annotations from pathlib import Path from typing import List import fitz # PyMuPDF from loguru import logger from app.config import settings def pdf_to_images(pdf_path: str | Path, dpi: int | None = None) -> List[Path]: """把 PDF 每页渲染成 PNG,返回文件路径列表""" dpi = dpi or settings.pdf_dpi pdf_path = Path(pdf_path) out_dir = pdf_path.parent / f".{pdf_path.stem}_pages" out_dir.mkdir(exist_ok=True) doc = fitz.open(str(pdf_path)) saved: List[Path] = [] try: # 1.0 = 72 DPI 的 zoom 系数 zoom = dpi / 72.0 mat = fitz.Matrix(zoom, zoom) for idx, page in enumerate(doc, start=1): pix = page.get_pixmap(matrix=mat, alpha=False) out_path = out_dir / f"page_{idx:03d}.png" pix.save(str(out_path)) saved.append(out_path) finally: doc.close() logger.info("PDF 转图片: {} → {} 页 (dpi={})", pdf_path.name, len(saved), dpi) return saved