idml 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b87a74424cdcbf39668b9d617232a939d3d93b5bdc925d9b5ff48a327a2b1f2
4
- data.tar.gz: 3059b9c662c5b979b82989899e0a2048e45b510d96ba4006a1c384ee7688bec1
3
+ metadata.gz: 52c92d7618628647f3ad6a9a791f4e5236514463b25c860390a046b5538df11d
4
+ data.tar.gz: 16786debbbceae219fc8933d96ad06b02c73f2efae0f4f03162deefd4d98c112
5
5
  SHA512:
6
- metadata.gz: 9eabdd81a468d04168b9c5602e3f3c547753430b5e7467c71805f7d74d3e976073ffce7cd85209cbdd2b7f06b83b485c9cc00c070ddbf783e471364accb604e7
7
- data.tar.gz: 88894e18b9f58717958cfbba80021b73a6e3f6b2accdab35993ff82d29312450730d6e255ff906e0c07f61272a63205169cbb75192845080c6226427250aef18
6
+ metadata.gz: 10756f2694a6e5b7d6543552d03f33770bb43ceaf085f3365348f919ae7ba54b9f45f2073cfaadad96d3679d93a966a0e67e758e667f5999a810780756a0a15a
7
+ data.tar.gz: 8efeee5edb697daee0839492011ae90a28c0db9edf155ea417c75b58fe353105733d93c30a73a32e3d63e5442957198e3dccee2d6b3276f76d303bf5eac383da
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- idml (0.2.1)
4
+ idml (0.2.3)
5
5
  bigdecimal
6
6
  fontisan
7
7
  lutaml-model (~> 0.8.18)
@@ -12,7 +12,7 @@ PATH
12
12
  PATH
13
13
  remote: /Users/mulgogi/src/claricle/pdfrb
14
14
  specs:
15
- pdfrb (0.18.0)
15
+ pdfrb (0.19.0)
16
16
  lutaml-model (>= 0.7.0)
17
17
  thor
18
18
 
@@ -204,7 +204,7 @@ CHECKSUMS
204
204
  ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d
205
205
  ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e
206
206
  fontisan (0.4.45) sha256=2337ca0205f806647b24b8cac57aa34f3769473026ae6f52dc36bde0feed6c62
207
- idml (0.2.1)
207
+ idml (0.2.3)
208
208
  json (2.21.2) sha256=1f1d3b7cf2b3ba1a69beca0bb6db13d5438b80bff3cd54cdaaa620b9b07c1c6a
209
209
  language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
210
210
  lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
@@ -226,7 +226,7 @@ CHECKSUMS
226
226
  paint (2.3.0) sha256=327d623e4038619d5bd99ae5db07973859cd78400c7f0329eea283cef8e83be5
227
227
  parallel (2.1.0) sha256=b35258865c2e31134c5ecb708beaaf6772adf9d5efae28e93e99260877b09356
228
228
  parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
229
- pdfrb (0.18.0)
229
+ pdfrb (0.19.0)
230
230
  prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
231
231
  racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
232
232
  rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
@@ -0,0 +1,23 @@
1
+ # TODO PDF 64: Pipeline optimizations and CLI enhancements
2
+
3
+ ## Status: DONE
4
+
5
+ ## What was implemented
6
+
7
+ 1. **Pipeline SpreadRenderer caching**: `render_spread_pages` creates
8
+ one SpreadRenderer per spread (was one per page). The renderer is
9
+ stateless and can be reused across pages within a spread.
10
+
11
+ 2. **CLI --verbose / -v flag**: Prints progress during rendering:
12
+ - Input and output paths
13
+ - Spread count
14
+ - Goes to stderr (doesn't interfere with stdout piping)
15
+
16
+ 3. **render_options extraction**: CLI's render_options hash extracted
17
+ as a method (DRY).
18
+
19
+ ## Acceptance criteria
20
+
21
+ - [x] SpreadRenderer created once per spread (not per page)
22
+ - [x] CLI --verbose flag prints progress to stderr
23
+ - [x] All tests pass
@@ -0,0 +1,29 @@
1
+ # TODO PDF 65: pdfrb 0.19.0 feature integration
2
+
3
+ ## Status: PARTIALLY DONE
4
+
5
+ ## What was implemented
6
+
7
+ 1. **Canvas#text_lines**: TextFrameRenderer uses `canvas.text_lines`
8
+ instead of N separate `canvas.text` calls per line. Single batch
9
+ call for all lines within a run.
10
+
11
+ ## What remains (pdfrb bugs)
12
+
13
+ 2. **glyph_width for TTF**: pdfrb 0.19.0 has `Fonts#glyph_width` but
14
+ returns 0 for TrueType fonts (bug: "undefined method glyph_id_for
15
+ for String"). Standard 14 Type1 fonts work correctly. Cannot
16
+ replace FontMetrics/Fontisan until this is fixed.
17
+
18
+ 3. **Pdfrb::FontResolver**: Returns nil for common fonts (Helvetica.ttc
19
+ on macOS). Cannot replace Fontisan-based resolver yet.
20
+
21
+ 4. **Font subsetting**: `Fonts#add` accepts `**opts` but `subset: true`
22
+ behavior unverified. Standard 14 fonts don't need FontFile embedding.
23
+
24
+ ## Acceptance criteria
25
+
26
+ - [x] TextFrameRenderer uses canvas.text_lines
27
+ - [ ] FontMetrics replaced with pdfrb glyph_width (blocked by TTF bug)
28
+ - [ ] FontResolver replaced with Pdfrb::FontResolver (blocked by .ttc)
29
+ - [ ] Font subsetting verified
data/lib/idml/cli.rb CHANGED
@@ -58,7 +58,7 @@ module Idml
58
58
  end
59
59
  end
60
60
 
61
- desc "render PATH [-o OUTPUT] [--pdf-a] [--tagged] [--font-path DIR]",
61
+ desc "render PATH [-o OUTPUT] [--pdf-a] [--tagged] [-v]",
62
62
  "Convert IDML to PDF"
63
63
  method_option :output, aliases: "-o", type: :string, required: true
64
64
  method_option :font_path, type: :array, default: [],
@@ -66,9 +66,12 @@ module Idml
66
66
  method_option :pdf_a, type: :boolean, default: false,
67
67
  desc: "Produce PDF/A-2a compliant output"
68
68
  method_option :tagged, type: :boolean, default: false,
69
- desc: "Produce tagged PDF for accessibility (PDF/UA)"
69
+ desc: "Produce tagged PDF (PDF/UA)"
70
+ method_option :verbose, aliases: "-v", type: :boolean, default: false,
71
+ desc: "Print progress"
70
72
  def render(path)
71
73
  pkg = package(path)
74
+ print_verbose(pkg) if options[:verbose]
72
75
  Idml::Render.render(package: pkg, to: options[:output],
73
76
  **render_options)
74
77
  puts "Wrote #{options[:output]}"
@@ -97,6 +100,11 @@ module Idml
97
100
  }
98
101
  end
99
102
 
103
+ def print_verbose(pkg)
104
+ warn "Rendering to #{options[:output]}"
105
+ warn " #{pkg.spreads.length} spread(s)"
106
+ end
107
+
100
108
  def print_validation_results(results)
101
109
  results.partition(&:ok?).then do |ok, failed|
102
110
  ok.each { |r| puts " OK #{r.part_name}" }
@@ -43,23 +43,27 @@ module Idml
43
43
  font_ref_resolver, font_name)
44
44
  pages = spread.spread.flat_map(&:page)
45
45
  image_refs = collect_images(writer, spread, base_dir, layer_filter)
46
+ renderer = build_renderer(layer_filter, font_ref_resolver, font_name)
46
47
 
47
48
  pages.each do |page|
48
49
  dims = page_dimensions_for(page)
49
50
  canvas = writer.add_page(width: dims[:width], height: dims[:height])
50
- renderer = SpreadRenderer.new(
51
- font_resolver: @font_resolver,
52
- font_ps_name: font_name,
53
- package: @package,
54
- layer_filter: layer_filter,
55
- font_ref_resolver: font_ref_resolver,
56
- )
57
51
  renderer.render(canvas, spread, page_width: dims[:width],
58
52
  page_height: dims[:height],
59
53
  image_refs: image_refs)
60
54
  end
61
55
  end
62
56
 
57
+ def build_renderer(layer_filter, font_ref_resolver, font_name)
58
+ SpreadRenderer.new(
59
+ font_resolver: @font_resolver,
60
+ font_ps_name: font_name,
61
+ package: @package,
62
+ layer_filter: layer_filter,
63
+ font_ref_resolver: font_ref_resolver,
64
+ )
65
+ end
66
+
63
67
  def collect_images(writer, spread, base_dir, layer_filter)
64
68
  refs = []
65
69
  spread.each_page_item do |item|
@@ -95,15 +95,21 @@ module Idml
95
95
  glyphs: glyphs, frame_width: box[:width],
96
96
  )
97
97
 
98
+ line_texts = []
98
99
  lines.each do |line|
99
100
  break if baseline_y < box[:y]
100
101
 
101
- line_text = line.glyphs.map { |g| [g.codepoint].pack("U") }.join
102
- canvas.text(line_text, at: [box[:x], baseline_y],
103
- font: context.font_ps_name,
104
- size: size)
102
+ line_texts << line.glyphs.map { |g| [g.codepoint].pack("U") }.join
105
103
  baseline_y -= size * LEADING_FACTOR
106
104
  end
105
+
106
+ if line_texts.any?
107
+ canvas.text_lines(line_texts,
108
+ font: context.font_ps_name,
109
+ size: size,
110
+ at: [box[:x], box[:y] + box[:height] - size],
111
+ leading: size * LEADING_FACTOR)
112
+ end
107
113
  baseline_y
108
114
  end
109
115
  private_class_method :render_run_lines
data/lib/idml/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Idml
4
- VERSION = "0.2.1"
4
+ VERSION = "0.2.3"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: idml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose
@@ -204,6 +204,8 @@ files:
204
204
  - TODO.pdf/61-known-limitations.md
205
205
  - TODO.pdf/62-pdfrb-015-migration.md
206
206
  - TODO.pdf/63-replace-fontmetrics-with-pdfrb.md
207
+ - TODO.pdf/64-pipeline-cli-optimizations.md
208
+ - TODO.pdf/65-pdfrb-019-integration.md
207
209
  - TODO.pdf/README.md
208
210
  - exe/idml
209
211
  - idml.gemspec