Module: Vivlio::Starter::CLI::Build::NombreStamper

Defined in:
lib/vivlio/starter/cli/build/nombre_stamper.rb

Constant Summary collapse

MM_TO_PT =
72.0 / 25.4
FONT_NAME =
'Helvetica'
FONT_SIZE =
6

Class Method Summary collapse

Class Method Details

.bleed_mm_from_configFloat

塗り足し幅を book.yml から取得する(mm 単位の数値を返す)“3mm” → 3.0, “5mm” → 5.0, nil → 3.0

Returns:

  • (Float)

    塗り足し幅(mm)



118
119
120
121
# File 'lib/vivlio/starter/cli/build/nombre_stamper.rb', line 118

def bleed_mm_from_config
  raw = Common::CONFIG.dig(:output, :print_pdf, :bleed)
  parse_bleed_mm(raw)
end

.draw_rotated_text(canvas, text, x:, y:, angle:) ⇒ Object

テキストを回転して描画するtranslate → rotate → text の順に変換を適用

Parameters:

  • canvas (HexaPDF::Content::Canvas)

    描画対象キャンバス

  • text (String)

    描画テキスト

  • x (Float)

    X 座標(pt)

  • y (Float)

    Y 座標(pt)

  • angle (Numeric)

    回転角度(度)



105
106
107
108
109
110
111
112
# File 'lib/vivlio/starter/cli/build/nombre_stamper.rb', line 105

def draw_rotated_text(canvas, text, x:, y:, angle:)
  canvas
    .save_graphics_state
    .translate(x, y)
    .rotate(angle)
    .text(text, at: [0, 0])
    .restore_graphics_state
end

.parse_bleed_mm(raw) ⇒ Float

塗り足し文字列を mm 数値に変換する

Parameters:

  • raw (String, Numeric, nil)

    塗り足し幅の生値

Returns:

  • (Float)

    mm 単位の数値(既定: 3.0)



126
127
128
129
130
131
132
133
134
# File 'lib/vivlio/starter/cli/build/nombre_stamper.rb', line 126

def parse_bleed_mm(raw)
  case raw
  in NilClass then 3.0
  in Numeric => n then n.to_f
  in String => s
    s.strip.downcase.sub(/mm\z/, '').to_f.then { it.positive? ? it : 3.0 }
  else 3.0
  end
end

.stamp!(pdf_path, bleed_mm: 3) ⇒ Boolean

入稿用 PDF に隠しノンブルを書き込む結合済み PDF のすべてのページに通し番号(1〜N)を付与する。

Parameters:

  • pdf_path (String)

    対象 PDF のパス

  • bleed_mm (Numeric) (defaults to: 3)

    塗り足し幅(mm)。ノンブルの X 座標に使う

Returns:

  • (Boolean)

    書き込み成功なら true



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/vivlio/starter/cli/build/nombre_stamper.rb', line 41

def stamp!(pdf_path, bleed_mm: 3)
  bleed_pt = bleed_mm.to_f * MM_TO_PT

  # 新実装 (MIT版 Provider への委譲)
  require 'vivlio/starter/cli/pdf/provider'
  Vivlio::Starter::Pdf.provider.stamp_nombre!(pdf_path, bleed_pt:)

  # --- 旧実装(MIT化動作確認後に削除予定) ---
  # unless File.exist?(pdf_path)
  #   Common.log_warn("[NombreStamper] PDF が見つかりません: #{pdf_path}")
  #   return false
  # end
  #
  # doc = HexaPDF::Document.open(pdf_path)
  # total = doc.pages.count
  #
  # Common.log_action("[NombreStamper] 隠しノンブルを書き込みます(#{total} ページ)…")
  #
  # doc.pages.each_with_index do |page, idx|
  #   stamp_page!(page, idx + 1, bleed_pt:)
  # end
  #
  # doc.write(pdf_path, optimize: true)
  # Common.log_success("[NombreStamper] 隠しノンブル書き込み完了(#{total} ページ)")
  # true
  # rescue StandardError => e
  #   Common.log_error("[NombreStamper] 隠しノンブル書き込みに失敗: #{e.message}")
  #   false
end

.stamp_page!(page, page_number, bleed_pt:) ⇒ Object

個別ページにノンブルを描画する奇数ページ(右ページ)はノド側 = 左端、偶数ページ(左ページ)はノド側 = 右端

Parameters:

  • page (HexaPDF::Type::Page)

    対象ページ

  • page_number (Integer)

    通しページ番号(1〜)

  • bleed_pt (Float)

    塗り足し幅(pt)



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/vivlio/starter/cli/build/nombre_stamper.rb', line 77

def stamp_page!(page, page_number, bleed_pt:)
  canvas = page.canvas(type: :overlay)
  box = page.box(:media)

  canvas.font(FONT_NAME, size: FONT_SIZE)
  canvas.fill_color(0) # 黒

  # ノド側の X 座標: 塗り足し領域の中央
  x_offset = bleed_pt / 2.0
  y_center = box.height / 2.0

  if page_number.odd?
    # 右ページ → ノド = 左端、時計回り 90°
    draw_rotated_text(canvas, page_number.to_s, x: x_offset, y: y_center, angle: 90)
  else
    # 左ページ → ノド = 右端、反時計回り -90°
    draw_rotated_text(canvas, page_number.to_s, x: box.width - x_offset, y: y_center, angle: -90)
  end
end