Class: VivlioStarter::CLI::Build::PrintGeometry
- Inherits:
-
Object
- Object
- VivlioStarter::CLI::Build::PrintGeometry
- 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
-
.expand!(pdf_path, bleed_mm:, crop_offset_mm:) ⇒ Boolean
変換に成功したか.
-
.finalize_boxes!(pdf_path, bleed_mm:, crop_offset_mm:) ⇒ Boolean
ボックスの書き込みに成功したか.
Instance Method Summary collapse
-
#expand! ⇒ Object
手順 3a: 内容シフトと MediaBox 拡張(TrimBox / BleedBox はまだ書かない)。 変換できない PDF(回転ページ・変換済み)を検出した場合は何も書き換えずに false を返す。呼び出し側は従来のレンダリング経路へ退避する。.
-
#finalize_boxes! ⇒ Object
手順 3b: TrimBox / BleedBox の確定。トンボ・ノンブルの overlay がすべて 済んだ後に呼ぶこと(先に書くと qpdf --overlay が重ねる側を TrimBox に 合わせて縮小配置してしまう。§3.8)。 expand! 後の MediaBox は原点 0 に正規化済みなので、仕上がり線は ページ寸法から Trim = [m, m, W−m, H−m] の定型で決まる。.
-
#initialize(pdf_path, bleed_mm:, crop_offset_mm:) ⇒ PrintGeometry
constructor
A new instance of PrintGeometry.
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 変換に成功したか.
67 68 69 |
# File 'lib/vivlio_starter/cli/build/print_geometry.rb', line 67 def self.(pdf_path, bleed_mm:, crop_offset_mm:) new(pdf_path, bleed_mm:, crop_offset_mm:). end |
.finalize_boxes!(pdf_path, bleed_mm:, crop_offset_mm:) ⇒ Boolean
Returns ボックスの書き込みに成功したか.
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 # --- 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 |