pdf_oxide 0.3.76-x86_64-linux → 0.3.78-x86_64-linux
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 +4 -4
- data/Gemfile +5 -5
- data/ext/pdf_oxide/libpdf_oxide.so +0 -0
- data/lib/pdf_oxide/ffi/bindings.rb +29 -0
- data/lib/pdf_oxide/pdf_document.rb +57 -20
- data/lib/pdf_oxide/version.rb +1 -1
- metadata +14 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6a8d69eaf72fd938ece65cfc89ebf4e5f0a92d9a0a240079927387fb6b163482
|
|
4
|
+
data.tar.gz: 8034a9984eb0845d66814b4bb0c6bc66e132f0ac51b663d919c254f3962ab809
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 358ca5c5289dfc2087e823d0563a622dd2bc53f5369f534828b0dec4635538c6f6cd83c9aaee478aef3a32fb7c4a1d78c29fa31ca35a7b3e84a83a261f21f721
|
|
7
|
+
data.tar.gz: 51ec294585007a004cf0dcdb05ec236b489e382e55605fd758456b5cdb0c8cb6121541024148c0ec8a9b9092783dda6201a8ecf7529abcf27906acccd9621d57
|
data/Gemfile
CHANGED
|
@@ -6,11 +6,11 @@ gemspec
|
|
|
6
6
|
|
|
7
7
|
group :development do
|
|
8
8
|
gem 'bundler', '>= 2.0'
|
|
9
|
-
gem 'rake', '~> 13.
|
|
10
|
-
gem 'rspec', '~> 3.
|
|
11
|
-
gem 'rubocop', '~> 1.
|
|
12
|
-
gem 'rubocop-rspec', '~> 3.
|
|
9
|
+
gem 'rake', '~> 13.4'
|
|
10
|
+
gem 'rspec', '~> 3.13'
|
|
11
|
+
gem 'rubocop', '~> 1.90'
|
|
12
|
+
gem 'rubocop-rspec', '~> 3.10'
|
|
13
13
|
gem 'yard', '~> 0.9'
|
|
14
14
|
gem 'simplecov', '~> 0.22'
|
|
15
|
-
gem 'simplecov-lcov', '~> 0.
|
|
15
|
+
gem 'simplecov-lcov', '~> 0.9'
|
|
16
16
|
end
|
|
Binary file
|
|
@@ -92,6 +92,8 @@ module PdfOxide
|
|
|
92
92
|
|
|
93
93
|
attach_function :pdf_document_search_page, %i[pointer string int32 bool pointer], :pointer
|
|
94
94
|
attach_function :pdf_document_search_all, %i[pointer string bool pointer], :pointer
|
|
95
|
+
attach_function :pdf_document_prepare_search, %i[pointer pointer], :int32
|
|
96
|
+
attach_function :pdf_document_clear_search_index, %i[pointer pointer], :int32
|
|
95
97
|
attach_function :pdf_oxide_search_result_count, [:pointer], :int32
|
|
96
98
|
# Each accessor takes the results handle + index + an int32* error
|
|
97
99
|
# buffer. The trailing pointer is REQUIRED — omitting it caused
|
|
@@ -1427,6 +1429,15 @@ module PdfOxide
|
|
|
1427
1429
|
attach_function :pdf_oxide_crypto_set_policy, %i[pointer pointer pointer pointer pointer pointer pointer pointer], :pointer, blocking: false
|
|
1428
1430
|
attach_function :pdf_oxide_crypto_use_fips, %i[pointer pointer pointer pointer pointer pointer pointer pointer], :pointer, blocking: false
|
|
1429
1431
|
attach_function :pdf_oxide_element_count, %i[pointer pointer pointer pointer pointer pointer pointer pointer], :pointer, blocking: false
|
|
1432
|
+
# void pdf_oxide_element_get_page_rect(const FfiElementList *elements, int32_t index,
|
|
1433
|
+
# float *x, float *y, float *width, float *height,
|
|
1434
|
+
# int32_t *error_code)
|
|
1435
|
+
# Page-space extents of the span: the rect from pdf_oxide_element_get_rect with any
|
|
1436
|
+
# text-matrix rotation resolved into an axis-aligned page-space hull;
|
|
1437
|
+
# identical to pdf_oxide_element_get_rect for upright runs.
|
|
1438
|
+
attach_function :pdf_oxide_element_get_page_rect,
|
|
1439
|
+
%i[pointer int32 pointer pointer pointer pointer pointer], :void,
|
|
1440
|
+
blocking: false
|
|
1430
1441
|
attach_function :pdf_oxide_element_get_rect, %i[pointer pointer pointer pointer pointer pointer pointer pointer], :pointer, blocking: false
|
|
1431
1442
|
attach_function :pdf_oxide_element_get_text, %i[pointer pointer pointer pointer pointer pointer pointer pointer], :pointer, blocking: false
|
|
1432
1443
|
attach_function :pdf_oxide_element_get_type, %i[pointer pointer pointer pointer pointer pointer pointer pointer], :pointer, blocking: false
|
|
@@ -1643,6 +1654,13 @@ module PdfOxide
|
|
|
1643
1654
|
attach_function :pdf_document_extract_text_auto, %i[pointer int32 pointer], :pointer
|
|
1644
1655
|
attach_function :pdf_document_extract_page_auto, %i[pointer int32 string pointer], :pointer
|
|
1645
1656
|
|
|
1657
|
+
# Structured diagnostics — malloc'd JSON array of warning objects
|
|
1658
|
+
# ("[]" when there are none); free with free_string. `category` is
|
|
1659
|
+
# an open-ended snake_case token: keep it a string and tolerate
|
|
1660
|
+
# tokens this binding has never seen. The `take_` variant drains.
|
|
1661
|
+
attach_function :pdf_document_structured_warnings, %i[pointer pointer], :pointer
|
|
1662
|
+
attach_function :pdf_document_take_structured_warnings, %i[pointer pointer], :pointer
|
|
1663
|
+
|
|
1646
1664
|
# Models subsystem (#519 provisioning trio).
|
|
1647
1665
|
attach_function :pdf_oxide_prefetch_models, %i[string pointer], :pointer
|
|
1648
1666
|
attach_function :pdf_oxide_model_manifest, [], :pointer
|
|
@@ -1740,6 +1758,17 @@ module PdfOxide
|
|
|
1740
1758
|
pointer size_t
|
|
1741
1759
|
pointer],
|
|
1742
1760
|
:pointer
|
|
1761
|
+
|
|
1762
|
+
# uint8_t *pdf_get_rendered_image_data(
|
|
1763
|
+
# const FfiRenderedImage *img, int32_t *data_len, int32_t *error_code)
|
|
1764
|
+
# Returns the encoded image bytes (PNG or JPEG per the format the
|
|
1765
|
+
# image was rendered with). Caller-owned; free with free_bytes.
|
|
1766
|
+
# Overrides the auto-generated 8-pointer placeholder declared
|
|
1767
|
+
# earlier in this file — that placeholder signature does not match
|
|
1768
|
+
# the real 3-argument ABI and cannot be called as-is.
|
|
1769
|
+
attach_function :pdf_get_rendered_image_data,
|
|
1770
|
+
%i[pointer pointer pointer],
|
|
1771
|
+
:pointer
|
|
1743
1772
|
end
|
|
1744
1773
|
end
|
|
1745
1774
|
end
|
|
@@ -170,6 +170,32 @@ module PdfOxide
|
|
|
170
170
|
StringMarshaller.from_c_string(ptr) || ''
|
|
171
171
|
end
|
|
172
172
|
|
|
173
|
+
# This document's structured diagnostics, as a raw JSON array string
|
|
174
|
+
# (`"[]"` when there are none). Non-destructive: a later call returns
|
|
175
|
+
# the same entries plus any raised since.
|
|
176
|
+
#
|
|
177
|
+
# Left unparsed on purpose: each entry's `category` is an open-ended
|
|
178
|
+
# snake_case token and new ones ship in minor releases, so callers
|
|
179
|
+
# must tolerate tokens they do not know.
|
|
180
|
+
# @return [String] JSON array.
|
|
181
|
+
def structured_warnings
|
|
182
|
+
err = ::FFI::MemoryPointer.new(:int32)
|
|
183
|
+
ptr = Bindings.pdf_document_structured_warnings(handle, err)
|
|
184
|
+
raise_for_code(err.read_int32, 'structured_warnings')
|
|
185
|
+
StringMarshaller.from_c_string(ptr) || ''
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# As {#structured_warnings}, but drains: the returned entries are
|
|
189
|
+
# removed, so a batch pipeline can read per document without the sink
|
|
190
|
+
# growing across the run.
|
|
191
|
+
# @return [String] JSON array.
|
|
192
|
+
def take_structured_warnings
|
|
193
|
+
err = ::FFI::MemoryPointer.new(:int32)
|
|
194
|
+
ptr = Bindings.pdf_document_take_structured_warnings(handle, err)
|
|
195
|
+
raise_for_code(err.read_int32, 'take_structured_warnings')
|
|
196
|
+
StringMarshaller.from_c_string(ptr) || ''
|
|
197
|
+
end
|
|
198
|
+
|
|
173
199
|
# Convert one page to Markdown.
|
|
174
200
|
# @param page_index [Integer]
|
|
175
201
|
# @return [String] Markdown.
|
|
@@ -206,6 +232,24 @@ module PdfOxide
|
|
|
206
232
|
parse_search_results(results)
|
|
207
233
|
end
|
|
208
234
|
|
|
235
|
+
# Build the search index for every page up front, instead of the
|
|
236
|
+
# lazy per-page build {#search} otherwise does on first use.
|
|
237
|
+
def prepare_search
|
|
238
|
+
err = ::FFI::MemoryPointer.new(:int32)
|
|
239
|
+
Bindings.pdf_document_prepare_search(handle, err)
|
|
240
|
+
raise_for_code(err.read_int32, 'prepare_search')
|
|
241
|
+
nil
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# Drop the cached search index, if any, freeing its memory.
|
|
245
|
+
# {#search} rebuilds it lazily on next use.
|
|
246
|
+
def clear_search_index
|
|
247
|
+
err = ::FFI::MemoryPointer.new(:int32)
|
|
248
|
+
Bindings.pdf_document_clear_search_index(handle, err)
|
|
249
|
+
raise_for_code(err.read_int32, 'clear_search_index')
|
|
250
|
+
nil
|
|
251
|
+
end
|
|
252
|
+
|
|
209
253
|
# @return [Array<Hash>] AcroForm fields as an array of `{name:, value:, type:, page:}`
|
|
210
254
|
# hashes. v0.3.55 limitation: per-field `page` is -1 because
|
|
211
255
|
# pdf_oxide's form extractor doesn't yet surface per-field page
|
|
@@ -420,26 +464,19 @@ module PdfOxide
|
|
|
420
464
|
end
|
|
421
465
|
|
|
422
466
|
def read_rendered_image_bytes(img_ptr)
|
|
423
|
-
# The cdylib
|
|
424
|
-
#
|
|
425
|
-
#
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
bytes
|
|
437
|
-
else
|
|
438
|
-
# Fall back to an empty BINARY string; render() callers see a
|
|
439
|
-
# clean error path rather than a segfault when the build is
|
|
440
|
-
# missing the rendered-image accessor.
|
|
441
|
-
''
|
|
442
|
-
end
|
|
467
|
+
# The cdylib exposes the rendered-image byte buffer through
|
|
468
|
+
# pdf_get_rendered_image_data (data_len is *mut i32, not size_t);
|
|
469
|
+
# the caller owns the returned buffer and must free it via
|
|
470
|
+
# free_bytes.
|
|
471
|
+
len_ptr = ::FFI::MemoryPointer.new(:int32)
|
|
472
|
+
err = ::FFI::MemoryPointer.new(:int32)
|
|
473
|
+
buf = Bindings.pdf_get_rendered_image_data(img_ptr, len_ptr, err)
|
|
474
|
+
raise_for_code(err.read_int32, 'render_bytes')
|
|
475
|
+
return '' if buf.nil? || buf.null?
|
|
476
|
+
|
|
477
|
+
bytes = buf.read_string(len_ptr.read_int32)
|
|
478
|
+
Bindings.free_bytes(buf)
|
|
479
|
+
bytes
|
|
443
480
|
end
|
|
444
481
|
|
|
445
482
|
# Map a cdylib error code (`int32_t *err`) to the matching Ruby
|
data/lib/pdf_oxide/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pdf_oxide
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.78
|
|
5
5
|
platform: x86_64-linux
|
|
6
6
|
authors:
|
|
7
7
|
- PDF Oxide Contributors
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-09-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: ffi
|
|
@@ -16,14 +16,14 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '1.
|
|
19
|
+
version: '1.17'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '1.
|
|
26
|
+
version: '1.17'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: bundler
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -44,70 +44,70 @@ dependencies:
|
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '13.
|
|
47
|
+
version: '13.4'
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '13.
|
|
54
|
+
version: '13.4'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: rspec
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
59
|
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '3.
|
|
61
|
+
version: '3.13'
|
|
62
62
|
type: :development
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '3.
|
|
68
|
+
version: '3.13'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: rubocop
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
73
|
- - "~>"
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '1.
|
|
75
|
+
version: '1.90'
|
|
76
76
|
type: :development
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
80
|
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '1.
|
|
82
|
+
version: '1.90'
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
84
|
name: rubocop-rspec
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
|
87
87
|
- - "~>"
|
|
88
88
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '3.
|
|
89
|
+
version: '3.10'
|
|
90
90
|
type: :development
|
|
91
91
|
prerelease: false
|
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
|
94
94
|
- - "~>"
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: '3.
|
|
96
|
+
version: '3.10'
|
|
97
97
|
- !ruby/object:Gem::Dependency
|
|
98
98
|
name: simplecov-lcov
|
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
|
100
100
|
requirements:
|
|
101
101
|
- - "~>"
|
|
102
102
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: '0.
|
|
103
|
+
version: '0.9'
|
|
104
104
|
type: :development
|
|
105
105
|
prerelease: false
|
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
107
|
requirements:
|
|
108
108
|
- - "~>"
|
|
109
109
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: '0.
|
|
110
|
+
version: '0.9'
|
|
111
111
|
- !ruby/object:Gem::Dependency
|
|
112
112
|
name: yard
|
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|