mupdf 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fcb2e83601972892c61f01d0a91ad66f53c1d1a1df766c45c469c19eb00de40f
4
- data.tar.gz: aad84a0df2ba34f3b30d6a9d8972ac8d82ecdc676178921e14cd08056c16b462
3
+ metadata.gz: b7668e9689741bc823e304c97df7c135f9ed31453fedbed2d5f06e19a8be3f43
4
+ data.tar.gz: ee5b8c0c417dee4b2e80a063b06fb2699753e1857e9c6c11e0d50d7448815e81
5
5
  SHA512:
6
- metadata.gz: acab8e6d850da0af08debf29efce668cec344eea8f107d5a907c39852503d18a5605724af28aed3bdb4bfa7966866f9ca7cdb02101eafcb82c5945f74308121b
7
- data.tar.gz: '08bbc69726f80f47888c5dc5dcfc76282f6b70f23199bacc2f3600103264cb011e46344e0f8ffa53877cd528f11f0e5a9d36947381c5c76a3fe6a22f6f338131'
6
+ metadata.gz: 2b85d9364a453fabcce166ef780a6340a885d88022765488de11a09c080ff6e4770d9c92609b1a531bea062b6ceb08d1ea46035a4d8db119065d6302f49b5326
7
+ data.tar.gz: a315ed8e2f213ed39a5cfe45cd742d80d73d65c8fa37bdbf3e16d96a433a34a9490ac3ec454e2efcf9e86a6dfac0abc30c9dae2406f9a18e82fa8e92cbfc94df
data/Gemfile CHANGED
@@ -10,4 +10,5 @@ gem 'rspec_junit_formatter'
10
10
  gem 'rubocop'
11
11
  gem 'rubocop-rake'
12
12
  gem 'rubocop-rspec'
13
+ gem 'simplecov'
13
14
  gem 'yard'
data/README.md CHANGED
@@ -14,6 +14,33 @@ gem install mupdf
14
14
 
15
15
  ## Usage
16
16
 
17
+ ### Document
18
+
19
+ A `MuPDF::Document` wraps a PDF file:
20
+
21
+ ```ruby
22
+ document = MuPDF::Document.new('./file.pdf')
23
+ ```
24
+
25
+ #### Info
26
+
27
+ The `info` command displays information about the document such as the number of pages:
28
+
29
+ ```ruby
30
+ info = document.info
31
+ info.pages # e.g. 2
32
+ ```
33
+
34
+ #### Pages
35
+
36
+ The `pages` command finds sizing information about the pages within a document:
37
+
17
38
  ```ruby
18
- MuPDF.mutool('info', 'file.pdf')
39
+ pages = document.pages
40
+ pages.count # e.g. 2
41
+ page = pages[0]
42
+ page.pagenum # 1
43
+ box = page.media_box # page.crop_box / page.bleed_box / page.trim_box / page.art_box
44
+ box.width # 612
45
+ box.height # 792
19
46
  ```
data/lib/mupdf/box.rb ADDED
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MuPDF
4
+ # A bounding box for a PDF (e.g. media / crop / bleed / trim).
5
+ class Box
6
+ REGEX = /l="(?<l>\d+)" b="(?<b>\d+)" r="(?<r>\d+)" t="(?<t>\d+)"/
7
+
8
+ # @!attribute l
9
+ # @return [String] The left coordinate.
10
+ attr_reader :l
11
+
12
+ # @!attribute b
13
+ # @return [String] The bottom coordinate.
14
+ attr_reader :b
15
+
16
+ # @!attribute r
17
+ # @return [String] The right coordinate.
18
+ attr_reader :r
19
+
20
+ # @!attribute t
21
+ # @return [String] The top coordinate.
22
+ attr_reader :t
23
+
24
+ # @!attribute kind
25
+ # @return [Symbol] The kind of box.
26
+ attr_reader :kind
27
+
28
+ # @param text [String]
29
+ # @param kind [Symbol]
30
+ #
31
+ # @return [MuPDF::Box]
32
+ def self.parse(text, kind:)
33
+ match = text.match(REGEX)
34
+
35
+ new(
36
+ l: Integer(match[:l]),
37
+ b: Integer(match[:b]),
38
+ r: Integer(match[:r]),
39
+ t: Integer(match[:t]),
40
+ kind:
41
+ )
42
+ end
43
+
44
+ # @param l [Integer]
45
+ # @param b [Integer]
46
+ # @param r [Integer]
47
+ # @param t [Integer]
48
+ # @param kind [Symbol] optional
49
+ def initialize(l:, b:, r:, t:, kind: nil)
50
+ @l = l
51
+ @b = b
52
+ @r = r
53
+ @t = t
54
+ @kind = kind
55
+ end
56
+
57
+ # @return [String]
58
+ def inspect
59
+ "#<#{self.class.name} l=#{l} b=#{b} r=#{r} t=#{t} kind=#{kind}>"
60
+ end
61
+
62
+ # @return [Integer]
63
+ def width
64
+ @r - @l
65
+ end
66
+
67
+ # @return [Integer]
68
+ def height
69
+ @t - @b
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MuPDF
4
+ # A wrapper for a PDF document allowing for MuPDF APIs.
5
+ class Document
6
+ # @param pathname [Pathname]
7
+ def initialize(pathname)
8
+ @pathname = pathname
9
+ end
10
+
11
+ # @return [String]
12
+ def inspect
13
+ "#<#{self.class.name} pathname=#{@pathname}>"
14
+ end
15
+
16
+ # @raise [MuPDF::CommandError]
17
+ #
18
+ # @return [MuPDF::Info]
19
+ def info
20
+ @info ||= begin
21
+ result = MuPDF.mutool('info', String(@pathname))
22
+ MuPDF::Info.parse(result)
23
+ end
24
+ end
25
+
26
+ # @raise [MuPDF::CommandError]
27
+ #
28
+ # @return [Array<MuPDF::Page>]
29
+ def pages
30
+ @pages ||= begin
31
+ result = MuPDF.mutool('pages', String(@pathname))
32
+ MuPDF::Page.parse(result)
33
+ end
34
+ end
35
+ end
36
+ end
data/lib/mupdf/info.rb ADDED
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MuPDF
4
+ # A wrapper for the result of a `mutool info ...` command.
5
+ class Info
6
+ PARSE_REGEX = /^Pages: (?<pages>\d+)$/
7
+
8
+ # @!attribute description
9
+ # @return [String] The description of the task.
10
+ attr_reader :pages
11
+
12
+ # @param text [String]
13
+ #
14
+ # @return [MuPDF::Info]
15
+ def self.parse(text)
16
+ match = text.match(PARSE_REGEX)
17
+ new(pages: Integer(match[:pages]))
18
+ end
19
+
20
+ # @param pages [Integer]
21
+ def initialize(pages:)
22
+ @pages = pages
23
+ end
24
+ end
25
+ end
data/lib/mupdf/page.rb ADDED
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MuPDF
4
+ # A wrapper for a PDF page within a PDF document.
5
+ class Page
6
+ REGEX = %r{<page pagenum="(?<pagenum>\d+)">(?<content>.*?)</page>}m
7
+ MEDIA_BOX_REGEX = %r{<MediaBox (?<content>.*?) />}
8
+ CROP_BOX_REGEX = %r{<CropBox (?<content>.*?) />}
9
+ ART_BOX_REGEX = %r{<ArtBox (?<content>.*?) />}
10
+ BLEED_BOX_REGEX = %r{<BleedBox (?<content>.*?) />}
11
+ TRIM_BOX_REGEX = %r{<TrimBox (?<content>.*?) />}
12
+
13
+ # @param text [String]
14
+ #
15
+ # @return [Array<MuPDF::Page>]
16
+ def self.parse(text)
17
+ text.scan(REGEX).map do |pagenum, content|
18
+ new(
19
+ media_box: parse_media_box(content),
20
+ crop_box: parse_crop_box(content),
21
+ art_box: parse_art_box(content),
22
+ bleed_box: parse_bleed_box(content),
23
+ trim_box: parse_trim_box(content),
24
+ pagenum: Integer(pagenum)
25
+ )
26
+ end
27
+ end
28
+
29
+ # @param text [String]
30
+ #
31
+ # @return [MuPDF::Box]
32
+ def self.parse_media_box(text)
33
+ match = MEDIA_BOX_REGEX.match(text)
34
+ MuPDF::Box.parse(match[:content], kind: :media)
35
+ end
36
+
37
+ # @param text [String]
38
+ #
39
+ # @return [MuPDF::Box]
40
+ def self.parse_crop_box(text)
41
+ match = CROP_BOX_REGEX.match(text)
42
+ MuPDF::Box.parse(match[:content], kind: :crop)
43
+ end
44
+
45
+ # @param text [String]
46
+ #
47
+ # @return [MuPDF::Box]
48
+ def self.parse_art_box(text)
49
+ match = ART_BOX_REGEX.match(text)
50
+ MuPDF::Box.parse(match[:content], kind: :art)
51
+ end
52
+
53
+ # @param text [String]
54
+ #
55
+ # @return [MuPDF::Box]
56
+ def self.parse_bleed_box(text)
57
+ match = BLEED_BOX_REGEX.match(text)
58
+ MuPDF::Box.parse(match[:content], kind: :bleed)
59
+ end
60
+
61
+ # @param text [String]
62
+ #
63
+ # @return [MuPDF::Box]
64
+ def self.parse_trim_box(text)
65
+ match = TRIM_BOX_REGEX.match(text)
66
+ MuPDF::Box.parse(match[:content], kind: :trim)
67
+ end
68
+
69
+ # @!attribute media_box
70
+ # @return [MuPDFBox]
71
+ attr_accessor :media_box
72
+
73
+ # @!attribute crop_box
74
+ # @return [MuPDFBox]
75
+ attr_accessor :crop_box
76
+
77
+ # @!attribute art_box
78
+ # @return [MuPDFBox]
79
+ attr_accessor :art_box
80
+
81
+ # @!attribute bleed_box
82
+ # @return [MuPDFBox]
83
+ attr_accessor :bleed_box
84
+
85
+ # @!attribute trim_box
86
+ # @return [MuPDFBox]
87
+ attr_accessor :trim_box
88
+
89
+ # @!attribute pagenum
90
+ # @return [Integer]
91
+ attr_accessor :pagenum
92
+
93
+ # @param media_box [MuPDF::Box]
94
+ # @param crop_box [MuPDF::Box]
95
+ # @param art_box [MuPDF::Box]
96
+ # @param bleed_box [MuPDF::Box]
97
+ # @param trim_box [MuPDF::Box]
98
+ # @param pagenum [Integer]
99
+ def initialize(media_box:, crop_box:, art_box:, bleed_box:, trim_box:, pagenum:)
100
+ @media_box = media_box
101
+ @crop_box = crop_box
102
+ @art_box = art_box
103
+ @bleed_box = bleed_box
104
+ @trim_box = trim_box
105
+ @pagenum = pagenum
106
+ end
107
+
108
+ # @return [String]
109
+ def inspect
110
+ "#<#{self.class.name} pagenum=#{pagenum}>"
111
+ end
112
+ end
113
+ end
data/lib/mupdf/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MuPDF
4
- VERSION = '0.2.0'
4
+ VERSION = '0.4.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mupdf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Sylvestre
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-02 00:00:00.000000000 Z
11
+ date: 2025-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: open3
@@ -50,7 +50,11 @@ files:
50
50
  - bin/console
51
51
  - bin/setup
52
52
  - lib/mupdf.rb
53
+ - lib/mupdf/box.rb
53
54
  - lib/mupdf/command_error.rb
55
+ - lib/mupdf/document.rb
56
+ - lib/mupdf/info.rb
57
+ - lib/mupdf/page.rb
54
58
  - lib/mupdf/version.rb
55
59
  homepage: https://github.com/ksylvest/mupdf
56
60
  licenses:
@@ -58,8 +62,8 @@ licenses:
58
62
  metadata:
59
63
  rubygems_mfa_required: 'true'
60
64
  homepage_uri: https://github.com/ksylvest/mupdf
61
- source_code_uri: https://github.com/ksylvest/mupdf/tree/v0.2.0
62
- changelog_uri: https://github.com/ksylvest/mupdf/releases/tag/v0.2.0
65
+ source_code_uri: https://github.com/ksylvest/mupdf/tree/v0.4.0
66
+ changelog_uri: https://github.com/ksylvest/mupdf/releases/tag/v0.4.0
63
67
  documentation_uri: https://mupdf.ksylvest.com/
64
68
  post_install_message:
65
69
  rdoc_options: []