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
-
.bleed_mm_from_config ⇒ Float
塗り足し幅を book.yml から取得する(mm 単位の数値を返す) “3mm” → 3.0, “5mm” → 5.0, nil → 3.0.
-
.draw_rotated_text(canvas, text, x:, y:, angle:) ⇒ Object
テキストを回転して描画する translate → rotate → text の順に変換を適用.
-
.parse_bleed_mm(raw) ⇒ Float
塗り足し文字列を mm 数値に変換する.
-
.stamp!(pdf_path, bleed_mm: 3) ⇒ Boolean
入稿用 PDF に隠しノンブルを書き込む 結合済み PDF のすべてのページに通し番号(1〜N)を付与する。.
-
.stamp_page!(page, page_number, bleed_pt:) ⇒ Object
個別ページにノンブルを描画する 奇数ページ(右ページ)はノド側 = 左端、偶数ページ(左ページ)はノド側 = 右端.
Class Method Details
.bleed_mm_from_config ⇒ Float
塗り足し幅を book.yml から取得する(mm 単位の数値を返す)“3mm” → 3.0, “5mm” → 5.0, nil → 3.0
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 の順に変換を適用
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 数値に変換する
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)を付与する。
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
個別ページにノンブルを描画する奇数ページ(右ページ)はノド側 = 左端、偶数ページ(左ページ)はノド側 = 右端
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 |