# 05 — PDF 缩略图渲染 **What to build:** `ThumbnailRenderer` 的 PDF 实现,扩展缩略图覆盖范围到 PDF 文件。新建 PDF 渲染实现类,使用 PDFBox 的 `PDFRenderer` 渲染 PDF 第一页为 `BufferedImage`(DPI 150 兼顾清晰度与性能),再走和图片缩略图相同的缩放 + JPEG 输出路径。`ThumbnailGenerationTask` 的类型判断逻辑扩展:上传 PDF 时 `thumbnail_status` 置 `PENDING` 并提交异步任务,渲染器路由到 PDF 实现。完成后上传一个 PDF,等异步任务跑完,调缩略图 API 能拿到第一页缩略图。 **Blocked by:** 03 — 图片异步生成 **Status:** ready-for-agent - [x] `ThumbnailRenderer` 的 PDF 实现:PDFBox `PDDocument.load()` → `PDFRenderer.renderImageWithDPI(0, 150)` → BufferedImage - [x] PDF 实现复用图片缩略图的缩放 + JPEG 输出逻辑(抽取为共用工具方法或基类) - [x] `ThumbnailRenderer.supports()` 覆盖 PDF(contentType `application/pdf` 或扩展名 `.pdf`) - [x] `ThumbnailGenerationTask` 渲染器路由:根据文件类型选择对应的 ThumbnailRenderer 实现 - [x] 上传 PDF 时 `thumbnail_status` 置 PENDING + 提交异步任务(扩展 03 的类型判断) - [x] 测试:upload PDF → thumbnail_status 为 PENDING + 提交异步任务 - [x] 测试:PDF 渲染成功 → 第一页缩略图写入 MinIO + 状态 READY - [x] 测试:ThumbnailRenderer.supports 对 PDF 返回 true,对非图片非 PDF 返回 false