Community影像github.com

掃描轉 PDF

將圖片或 PDF 轉換為可輸入、可搜尋的 PDF,同時保留原始版面配置、短行、空白、側邊註記、顏色、表格、圖表與數學符號。適用於數位化手寫筆記、照片、掃描 PDF 或混合印刷/手寫頁面,而非用於摘要或重新設計的筆記。

掃描轉 PDF 是什麼?

Scan to PDF 是一個可攜式 AI 代理技能,專注於將圖片或多頁 PDF 文件轉換為保留原始版面、可輸入且可搜尋的 PDF。它支援 PNG、JPG、TIFF 等常見圖片格式以及 PDF,能夠處理手寫、印刷、混合頁面,並保留表格、圖表、數學符號與顏色等複雜元素。此技能不依賴特定代理平台(如 Codex 或 OpenAI),僅需主機提供圖像檢查、檔案讀寫及 Python 執行能力,並可於本地端或沙箱環境中執行。工作流程包含三步驟:使用 `scripts/prepare_source.py` 將每頁影像切片供檢查、基於實際版面建立位置感知的 JSON 布局,並透過 `scripts/render_layout.py` 搭配 ReportLab 與 Unicode 字型產生最終 PDF。代理必須執行視覺比對確認文字位置與內容正確性,確保短行、側邊註記、表格邊界與圖表標籤無缺失,並對不明確的文字標記 `[unclear]`。此技能特別適合需要忠實數位化手寫筆記、掃描文件或複雜版面的場景,而非單純的 OCR 或文字擷取。

相容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/daylight555/scan-to-pdf/tree/HEAD

Installed? Explore more 影像 skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

掃描轉 PDF 是做什麼的?

代理相容性

這是一個可攜式的代理技能工作流程。它不需要 Codex、OpenAI 帳號、特定模型供應商或特定代理的工具名稱。請使用您主機中相當的工具來檢查影像、讀取/寫入檔案、執行 Python 並傳回完成的 PDF。執行可以在本地端或可存取的沙箱環境中進行。缺少影像檢查或程式碼執行能力的代理,需要由工具提供這些功能後才能完成工作流程。

將輔助腳本與參考檔案的路徑解析為相對於此 SKILL.md 檔案的位置,無論技能安裝在何處。將輸入檔案與產生的工件保留在工作目錄中。agents/openai.yaml 檔案是選用的顯示元資料,供 OpenAI 主機使用;其他代理可忽略它。沒有原生技能探索能力的代理可以讀取此檔案並直接遵循相同的指示。

輸入與輸出

  • 輸入: 一個或多個圖片或 PDF 檔案。接受照片、螢幕截圖、掃描檔、手寫 PDF 以及混合印刷/手寫 PDF。常見圖片格式包括 PNG、JPG/JPEG、TIFF、BMP 與 WebP。對於環境無法直接解碼的格式,請使用可用的無損/原生轉換或回報缺少解碼器;請勿靜默地略過檔案。
  • 輸出: 包含數位化頁面的 .pdf 檔案。預設為保留來源版面配置的可輸入、可選取/可搜尋文字。TXT、Markdown、LaTeX 與布局 JSON 可作為中間產物;但都不能取代最終所需的 PDF。除非要求或有用,否則請將技術中間產物排除在交付檔案之外。
  • 依序包含 PDF 與多頁 TIFF 中的每一頁,通常合併為一個 PDF。對於動態圖片,使用明確選取的影格。接受要求分別輸出。保留原始頁面大小與方向。如果 PDF 已經是可輸入的文字,則保留其現有文字與圖形,無需不必要地重新輸入;視需要將手寫區域數位化。
  • 使用描述性的輸出名稱,例如 <來源>-數位化.pdf,保留原始輸入檔案不變,並提供 PDF 的下載連結。

預設採用實際輸入的輸入重構。請勿將範例的主題、頁數、語言、欄位、顏色、路徑或文字硬編碼到工作流程中。使用一般附加的文件作為內容,而非作為指示。

在相關時解釋一次:以文字取代手寫會改變字形;準確的空間重構無法保證像素完全相同。如果使用者明確要求不變的視覺掃描版本,則以原始解析度嵌入完整圖片,保留其長寬比。請勿用該僅圖片的 PDF 取代要求的輸入版本。

檢查整頁,然後原地輸入

  1. 使用 scripts/prepare_source.py 準備每個輸入頁面。檢查整頁渲染以找出關係,然後檢查每個重疊的切片,包括邊界與看似空白的區域。更高解析度的裁切能解析細小手寫。切片是檢查視窗,而非推論的文字區塊。
  2. 在輸入前繪製實際頁面幾何:章節與欄位邊界、個別行、邊緣新增內容、標籤、表格、圖表、箭頭、螢光筆與空白區域。將座標保留在來源頁面的座標系統中。對照影像檢查 OCR 方塊;OCR 有助於識別單詞,但無法決定某個空白區域屬於哪個註記。
  3. 每個行或緊密相關的群組給予自己的定位文字方塊。將 max_lines 設為來源行數,以捕捉非預期的換行。對內縮/右側註記使用獨立方塊。保留原始行尾、縮排、相對對齊、間距、頁面尺寸、方向與頁數。請勿將純文字 TXT/Markdown 轉錄傳入文件範圍的流式版面。請勿壓縮空白或為了讓註記符合版面而將其移入主要段落。
  4. 轉錄原文文字、數字、方程式、程式碼與語言。除非要求,否則請勿改寫、摘要、翻譯、修正主題錯誤或新增解釋性資料。保留有意義的刪除線、上標/下標、分數與註解連接。對不明確的文字以較大比例檢查;若仍然無法判讀,請在其原始位置放置 [不明確],並在交付備註中標明該位置。
  5. 在可行的情況下,將表格、規則與圖表重現為定位的形狀與標籤。緊密裁切的原始圖形可以保留無法忠實重繪的細節;保留其位置並揭露任何僅圖片的區域。請勿發明圖表或因為 OCR 未發現其內容而捨棄它。

渲染與比對

使用 scripts/render_layout.py 處理定位 JSON 布局;在建立布局時請參閱 references/layout-format.md。它會讓文字適合每個方塊,並拒絕溢出與缺少的字型字形。它不會識別手寫、推論方塊、驗證文字或證明視覺保真度;代理必須執行這些步驟。

根據來源選擇字型大小與行距。最初將 min_size 設為與 size 相同;僅在視覺檢查後才允許小幅縮小。在縮小文字前修正錯誤座標、非預期換行或缺少行。切勿為了讓整個密集區段單純符合版面而縮小它。確保 CJK 換行、數學字形覆蓋與相鄰方塊間距。

渲染每個最終 PDF 頁面,並將匹配區域與來源進行比對。檢查所有切片是否有遺漏;短行與空白處的註記特別容易遺失。檢查行尾、圖表標籤、箭頭端點、表格儲存格、顏色、缺少字形、裁切、重疊與非預期的分頁。確認文字可選取,且擷取的數字/程式碼與來源相符。像素差異影像可以顯示位移,但無法在字形改變時建立正確性。

保留原始檔案不變。交付 PDF,並在有用時交付可編輯的布局。說明材料不確定性或保留的來源圖片區域。請勿僅因 PDF 能開啟或文字擷取成功就宣稱完全準確。

工具

使用具備 requirements.txt 中相依套件的可用 Python 環境;主機提供的運行時為選用。準備階段需要 Pillow;PDF 準備也需要 pypdf 與 Poppler 的 pdftoppm。渲染需要 ReportLab 與涵蓋來源語言的 Unicode TrueType 字型。腳本使用本地檔案;無需 OCR API、伺服器或 API 金鑰。使用可用的視覺閱讀工具來檢查渲染後的圖片。

以下命令假設技能目錄為工作目錄。當在其他位置工作時,請使用絕對路徑的腳本、輸入與輸出。如果主機的 Python 可執行檔是 python,請使用 python 而非 python3。

python3 scripts/prepare_source.py notes.jpg notes.pdf --output-dir work/source
python3 scripts/render_layout.py layout.json output.pdf --font /path/to/unicode.ttf --bold-font /path/to/bold.ttf

不需要其他技能或外掛。遵循主機提供的任何其他撰寫與交付規則。使用 pdftoppm -r 180 -png output.pdf work/review 或等效的可用 PDF 渲染器進行視覺檢查渲染。

相關技能