Class: VivlioStarter::CLI::Build::PrintGeometry

Inherits:
Object
  • Object
show all
Defined in:
lib/vivlio_starter/cli/build/print_geometry.rb

Constant Summary collapse

PRECISION =

座標の丸め桁。PDF の実用精度(1/10000 pt)で十分。

4
DEST_SHIFT_AXES =

座標シフトの対象になる destination 種別 → シフトする要素の添字と軸。 添字は destination 配列([page, /Kind, …])先頭からの位置。 /Fit・/FitB は座標を持たないため対象外。

{
  '/XYZ' => { 2 => :x, 3 => :y },
  '/FitH' => { 2 => :y },
  '/FitBH' => { 2 => :y },
  '/FitV' => { 2 => :x },
  '/FitBV' => { 2 => :x },
  '/FitR' => { 2 => :x, 3 => :y, 4 => :x, 5 => :y }
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(pdf_path, bleed_mm:, crop_offset_mm:) ⇒ PrintGeometry

Returns a new instance of PrintGeometry.



76
77
78
79
80
# File 'lib/vivlio_starter/cli/build/print_geometry.rb', line 76

def initialize(pdf_path, bleed_mm:, crop_offset_mm:)
  @pdf_path = pdf_path
  @bleed_pt  = bleed_mm.to_f * Units::PT_PER_MM
  @margin_pt = (bleed_mm.to_f + crop_offset_mm.to_f) * Units::PT_PER_MM
end

Class Method Details

.expand!(pdf_path, bleed_mm:, crop_offset_mm:) ⇒ Boolean

Returns 変換に成功したか.

Parameters:

  • pdf_path (String)

    変換対象(成功時に上書きされる)

  • bleed_mm (Numeric)

    塗り足し幅(mm)

  • crop_offset_mm (Numeric)

    トンボ代(mm・塗り足しの外側)

Returns:

  • (Boolean)

    変換に成功したか



67
68
69
# File 'lib/vivlio_starter/cli/build/print_geometry.rb', line 67

def self.expand!(pdf_path, bleed_mm:, crop_offset_mm:)
  new(pdf_path, bleed_mm:, crop_offset_mm:).expand!
end

.finalize_boxes!(pdf_path, bleed_mm:, crop_offset_mm:) ⇒ Boolean

Returns ボックスの書き込みに成功したか.

Returns:

  • (Boolean)

    ボックスの書き込みに成功したか



72
73
74
# File 'lib/vivlio_starter/cli/build/print_geometry.rb', line 72

def self.finalize_boxes!(pdf_path, bleed_mm:, crop_offset_mm:)
  new(pdf_path, bleed_mm:, crop_offset_mm:).finalize_boxes!
end

Instance Method Details

#expand!Object

手順 3a: 内容シフトと MediaBox 拡張(TrimBox / BleedBox はまだ書かない)。 変換できない PDF(回転ページ・変換済み)を検出した場合は何も書き換えずに false を返す。呼び出し側は従来のレンダリング経路へ退避する。



85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/vivlio_starter/cli/build/print_geometry.rb', line 85

def expand!
  # --- Phase: 構造の取得 ---
  header, objects, pages = QpdfJson.read(pdf_path)
  return false unless pages

  # --- Phase: 変換可否の判定 ---
  return false unless convertible?(pages, objects)

  # --- Phase: 更新差分の構築 ---
  updates = build_updates(pages, objects, header['maxobjectid'].to_i)

  # --- Phase: qpdf による差分適用 ---
  QpdfJson.apply!(pdf_path, header, updates)
end

#finalize_boxes!Object

手順 3b: TrimBox / BleedBox の確定。トンボ・ノンブルの overlay がすべて 済んだ後に呼ぶこと(先に書くと qpdf --overlay が重ねる側を TrimBox に 合わせて縮小配置してしまう。§3.8)。 expand! 後の MediaBox は原点 0 に正規化済みなので、仕上がり線は ページ寸法から Trim = [m, m, W−m, H−m] の定型で決まる。



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/vivlio_starter/cli/build/print_geometry.rb', line 105

def finalize_boxes!
  header, objects, pages = QpdfJson.read(pdf_path)
  return false unless pages

  m = margin_pt
  b = bleed_pt
  updates = pages.to_h do |page|
    key = "obj:#{page['object']}"
    value = objects[key]['value'].dup
    _, _, width, height = value['/MediaBox'].map(&:to_f)
    value['/TrimBox']  = round_all([m, m, width - m, height - m])
    value['/BleedBox'] = round_all([m - b, m - b, width - m + b, height - m + b])
    [key, { 'value' => value }]
  end

  QpdfJson.apply!(pdf_path, header, updates)
end