A5 硬幣檢查表 PDF 產生器
使用時機
- 使用者想要一份可列印的硬幣收藏檢查表
- 使用者提及 A5、Filofax、活頁夾或適合硬幣的計畫表頁面
- 使用者想要將 Numista 匯出清單與系列主清單做交叉比對
- 使用者正在迭代之前產生的硬幣檢查表 PDF
頁面設定
from reportlab.lib.pagesizes import A5
PAGE_W, PAGE_H = A5 # 148mm x 210mm (419.53 x 595.28 pts)
LEFT_M = 18*mm # 較寬 — 可避開 6 孔 Filofax 打孔
RIGHT_M = 6*mm
TOP_M = 9*mm
BOT_M = 8*mm
USABLE_W = PAGE_W - LEFT_M - RIGHT_M # ~124mm
6 孔打孔導引
每頁皆繪製。Filofax A5 標準孔位距紙張頂端距離:
HOLE_POSITIONS_MM = [19, 51, 70, 140, 159, 191]
for h in HOLE_POSITIONS_MM:
y = PAGE_H - h*mm
c.setStrokeColor(HexColor("#CCCCCC"))
c.setLineWidth(0.25)
c.circle(4.5*mm, y, 2.2*mm, stroke=1, fill=0)
字型
使用 Carlito(與 Calibri 公制相容,基於 SIL 開放字型授權免費提供)。在 Linux 上通常位於:
/usr/share/fonts/truetype/crosextra/Carlito-Regular.ttf
/usr/share/fonts/truetype/crosextra/Carlito-Bold.ttf
/usr/share/fonts/truetype/crosextra/Carlito-Italic.ttf
在 Windows 或 macOS 上,請從 Google Fonts 下載 Carlito,並將路徑指向那些檔案。
請註冊所有三種變體。切勿退回使用 Helvetica:以下版面是針對 Calibri 風格的度量調校的。
排版規則(強制限制)
| 元素 | 字型 | 大小 | 備註 |
|---|---|---|---|
| 封面標題 | Carlito-Bold | 20pt | 置中,位於黑色橫幅中 |
| 封面副標題 | Carlito-Bold | 16pt | 標題下方 |
| 章節標題 | Carlito-Bold | 8.5-9pt | 白字,黑底橫條 |
| 欄位標題 | Carlito-Bold | 7.5pt | 灰色,位於分隔線上方 |
| 內文 — 所有欄位 | Carlito / Carlito-Bold | 11pt | 名稱、時期、現有欄位統一使用 |
| 已收集明細行 | Carlito-Italic | 8.5pt | 灰色,位於已收集行下方 |
| 頁尾 | Carlito | 6pt | 頁碼 + 檢查表名稱 |
| 面額欄 | Carlito | 9pt | 靠右對齊,縮寫(5Y、10Y、1J) |
關鍵:保持名稱、時期與現有欄位使用相同的字型大小 (11pt)。 混合大小在列印頁面上顯得不專業。
行版面
ROW_H = 16-18 # pts — 行之間寬敞的間距
SEC_H = 17 # 章節標題列高度
COL_H = 13 # 欄位標題高度
COLLECTED_EXTRA = 11 # 已收集行額外詳情行的高度
- 在每行底部繪製一條細分隔線 (0.2pt, #DDDDDD)
- 交替行底色:每個偶數行填滿 #EBEBEB
- 已收集行:粗體文字 + 勾選記號在核取方塊中
欄位位置(從 LEFT_M 起算)
COL_CK = 0 # 核取方塊
COL_YR = 11 # 年份
COL_NM = 36 # 硬幣名稱(主要欄位)
# 右側欄位 — 向右推,避免與時期文字重疊
COL_ERA = 84*mm # 時代標記 (B/P/N) 或面額
COL_NOW = 89*mm # 目前狀態 / 次要資訊
關鍵教訓:像「300 BCE-1279」的字串在 11pt 下約 28mm 寬。時代標記與 NOW 欄位必須從 84mm 之後開始,以避免重疊。 這是經過多次反覆修正的成果。
灰階設計(強制)
專為灰階雷射印表機設計。絕不依賴顏色傳達含義。
| 視覺元素 | 灰階處理方式 |
|---|---|
| 已收集行強調 | 對角線條紋(非顏色填滿) |
| 章節標題 | 白字,純黑底橫條 |
| 交替行 | #EBEBEB 與白色交替 |
| 時代指示 | 文字字母 (B/P/N),非有色圓點 |
| 已收集鑄造標記 | 粗體 vs 一般粗細(非顏色) |
| 核取方塊 | 以線條繪製勾選記號,非 Unicode |
條紋實作:
def hatch(c, x, y, w, h):
c.saveState()
p = c.beginPath(); p.rect(x, y, w, h)
c.clipPath(p, stroke=0)
c.setStrokeColor(HexColor("#CCCCCC"))
c.setLineWidth(0.35)
for i in range(-int(h), int(w+h), 5):
c.line(x+i, y, x+i+h, y+h)
c.restoreState()
勾選記號(非 X,非 Unicode):
c.setStrokeColor(BLK); c.setLineWidth(1.2)
cx = LEFT_M + COL_CK + 1; cy = ty - 1
c.line(cx+2, cy+4, cx+4, cy+1.5)
c.line(cx+4, cy+1.5, cx+8, cy+7.5)
頁面流程(連續)
切勿讓每個章節獨佔一頁。 章節應連續排列。小型章節(3-5 項)必須與前一章節的尾端排在同一頁上。
# 防止孤兒:章節標題至少需要標題 + 欄位標題 + 1 行的最小空間
if item_type == 'section_header':
needed = h + COL_H + 2 + ROW_H + 4
if y - needed < BOT_M:
y = new_page(c)
封面頁面結構
- 黑色橫幅包含標題 (20pt) 與副標題 (16pt)
- 橫幅下方副標題行 (12pt, 灰色)
- 水平分隔線
- 統計方塊 (#EBEBEB 填滿):「總計: X 已有: Y 缺少: Z」(14pt 粗體)
- 覆蓋率百分比 (11pt, 灰色)
- 收藏家姓名 (14pt 粗體) + Numista 帳號 (11pt)
- 圖例章節(如適用)
- 系列摘要(含數量,靠右對齊)
請勿包含
- 獨立的空白筆記頁(浪費紙張)
- 依賴顏色的元素
- Unicode 勾選記號或特殊字元(字型覆蓋問題)
- 任何元素小於 7pt 的字型大小
- 文件中任何地方超過 1 頁的空白空間
輸出
將 PDF 儲存到使用者可以開啟的位置(在 claude.ai 上:/mnt/user-data/outputs/ 並呼叫 present_files;在 Claude Code 中:工作資料夾)。在交付前,使用 pdf2image 呈現頁面進行視覺化品質檢查。