/**
- ========================================
- PDF 座標マッピング - 座標基準点のリファレンス
-
========================================
- このドキュメントは、pdf-field-mappings.js 内の座標定義における
- 基準点(どの位置が x, y として指定されるか)をまとめています。
*/
/**
-
===== PDF座標系の基本 =====
- 単位: ポイント (pt)
-
-
A4用紙サイズ: 595.28pt(横) × 841.89pt(縦)
- 原点: (0, 0) は「左下」
-
- X軸: 左から右へ増加(0 = 左端、595.28 = 右端)
-
-
Y軸: 下から上へ増加(0 = 下端、841.89 = 上端)
- ビジュアル:
- ┌─────────────────────────────────┐ y: 841.89 (上)
- │ │
- │ (x增加 →) │
- │ │
- │ ↑ y増加 │
- │ │ │
- │ │ │
- └─────────────────────────────────┘ y: 0 (下)
- x: 0 (左) x: 595.28 (右)
*/
/**
-
===== 要素ごとの座標基準点 =====
- 【1】 テキスト (drawText)
- ────────────────────────────────────
-
基準点: テキストの「左下コーナー」
- 例:
-
x: 100, y: 700, text: “学生名”
- の場合、”学生名” の文字列の左端(x=100)と下端(y=700)が指定位置。
-
テキストは(100, 700)から右上方向に伸びます。
- ┌──────────────────┐
- │ 学生名 │ ← テキスト(fontsize: 12)
- └──────────────────┘
- ↑
-
(100, 700) ← 左下コーナー
- 実装例:
-
- page.drawText(‘学生名’, {
- x: 100,
- y: 700,
- size: 12,
- font: jpFont
- });
-
/**
- 【2】 円 (drawCircle)
- ────────────────────────────────────
-
基準点: 円の「中心」
- 例:
-
x: 85, y: 640, radius: 5
- の場合、x=85, y=640 が円の中心。
-
半径 5pt なので、(80, 635) から (90, 645) の範囲に円が描かれます。
- (85, 645) ← 上端
- ▲
- ╱─────╲
- ╱ ╲
- (80,640)—(85,640)—(90,640)
- ╲ ╱ ↑
- ╲─────╱ 中心(85,640)
- ▼
-
(85, 635) ← 下端
- 実装例:
-
- page.drawCircle({
- x: 85,
- y: 640,
- size: 5,
- borderColor: rgb(0, 0, 0),
- borderWidth: 1.5
- });
-
/**
- 【3】 矩形 (drawRectangle)
- ────────────────────────────────────
-
基準点: 矩形の「左下コーナー」
- 例:
-
x: 50, y: 500, width: 200, height: 30
- の場合、(50, 500) が矩形の左下。
-
(50, 500) から (250, 530) の範囲に矩形が描かれます。
- (50,530)──────(250,530) ← 上辺
- │ │
- │ [box] │
- │ │
- (50,500)──────(250,500) ← 下辺
- ↑
- 左下コーナー
*/
/**
- ===== PDF_FIELD_MAPPINGS 内の要素別基準点 =====
*/
// 【学生証番号】
// type: ‘digit_boxes’
// positions[].x, positions[].y
// → 基準点: 数字テキストの「左下」
// 例: { digit: 1, x: 125, y: 700 }
// “1” の左下が (125, 700)
// 【携帯電話】
// type: ‘phone_parts’
// parts[].x, parts[].y
// → 基準点: テキストの「左下」
// 例: { part: ‘area’, x: 70, y: 680 }
// “090” の左下が (70, 680)
// 【固定電話】
// type: ‘phone_parts’
// parts[].x, parts[].y
// → 基準点: テキストの「左下」
// 例: { part: ‘area’, x: 70, y: 665 }
// “06” の左下が (70, 665)
// 【住所区分 (ラジオボタン)】
// type: ‘radio_circle’
// options[].x, options[].y, radius
// → 基準点: 円の「中心」
// 例: { value: ‘1’, x: 85, y: 640, radius: 5 }
// 円の中心が (85, 640)、半径 5pt
// 【傷病名】
// type: ‘text’
// x, y
// → 基準点: テキストの「左下」
// 例: x: 100, y: 620
// “傷病名” の左下が (100, 620)
// 【負傷状況 (チェックボックス)】
// type: ‘checkbox_mark’
// options[].x, options[].y
// → 基準点: チェックマーク(✓)の「左下」
// 例: { value: ‘正課中’, x: 90, y: 595 }
// “✓” の左下が (90, 595)
// 【負傷日】
// type: ‘date_parts’
// parts[].x, parts[].y
// → 基準点: テキストの「左下」
// 例: { part: ‘year’, x: 100, y: 525 }
// “2026” の左下が (100, 525)
// 【金融機関振込先 (ラジオボタン)】
// type: ‘radio_circle’
// options[].x, options[].y, radius
// → 基準点: 円の「中心」
// 例: { value: ‘new’, x: 200, y: 480, radius: 5 }
// 円の中心が (200, 480)、半径 5pt
// 【銀行名/支店名/その他テキスト】
// type: ‘text’
// x, y
// → 基準点: テキストの「左下」
// 例: x: 100, y: 455
// “三菱UFJ銀行” の左下が (100, 455)
// 【口座番号】
// type: ‘digit_boxes’
// positions[].x, positions[].y
// → 基準点: 数字テキストの「左下」
// 例: { digit: 7, x: 442, y: 395 }
// “7” の左下が (442, 395)
// 【受付番号】
// type: ‘receipt_list’
// baseX, baseY, spacing
// → 基準点: 最初の受付番号テキストの「左下」
// baseX: 100 → 第1番目の左下 x座標
// baseY: 370 → すべての左下 y座標(共通)
// spacing: 80 → 各番号間の水平距離
// 実際の位置:
// 第1番目: (100, 370)
// 第2番目: (180, 370) ← 100 + 80
// 第3番目: (260, 370) ← 100 + 160
// 第4番目: (340, 370) ← 100 + 240
/**
-
===== 実装時の注意ポイント =====
- 【テキスト書き込み】
-
- page.drawText(text, {
- x: mapping.x, // ← テキスト左下のx座標
- y: mapping.y, // ← テキスト左下のy座標
- size: mapping.fontSize,
- font: jpFont
- });
-
-
- 【円描画(ラジオボタン、チェックボックス)】
-
- page.drawCircle({
- x: option.x, // ← 円の「中心」x座標
- y: option.y, // ← 円の「中心」y座標
- size: option.radius, // または size: option.radius * 2 (直径)
- borderColor: rgb(…),
- borderWidth: 1.5
- });
-
-
- 【チェックマーク(✓)描画】
-
- page.drawText(‘✓’, {
- x: option.x, // ← ✓の左下のx座標
- y: option.y, // ← ✓の左下のy座標
- size: 14, // チェックマークは大きめ
- font: jpFont
- });
-
-
- 【複数桁の数値(学生証、口座番号)】
-
- digitArray.forEach((digit, index) => {
- page.drawText(digit, {
- x: positions[index].x, // ← 各桁の左下x座標
- y: positions[index].y, // ← 各桁の左下y座標
- size: fontSize,
- font: jpFont
- });
- });
-
/**
-
===== テンプレート画像の座標測定方法 =====
- 医療費領収証明書テンプレート (medical-receipt-bg.png) の座標を
-
正確に測定する場合:
-
- テンプレート画像をPDF上に配置(例: drawImage())
-
- Acrobat Reader や Photoshop で画像を開き、各フィールドの位置を測定
-
- PDF座標系(左下が原点)に変換
-
-
必要に応じて調整 (±1-2pt の誤差は許容)
- テンプレート画像が A4 サイズ (595.28×841.89pt) と同じ場合:
-
-
- テンプレート画像が異なるサイズの場合:
-
-
- 例: 画像が 2100×2970px (A4 相当)
-
- スケール: 595.28 / 2100 ≈ 0.283
-