pdfmult 1.3.2 → 1.4.0
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 +5 -5
- data/Gemfile +6 -0
- data/README.md +1 -1
- data/Rakefile +22 -26
- data/bin/pdfmult +2 -1
- data/lib/pdfmult.rb +99 -96
- data/man/pdfmult.1 +4 -4
- data/pdfmult.gemspec +23 -20
- data/test/test_latex_document.rb +19 -22
- data/test/test_layout.rb +24 -27
- data/test/test_optionparser.rb +51 -54
- data/test/test_pdfinfo.rb +10 -13
- metadata +17 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c2332ed5eb863e47259f51eaedc2e6f26d9bc58190c2c0da9c13a2d1d128f7fd
|
4
|
+
data.tar.gz: 164a73cc0876f21ebacee131c000c74609f591784f46297fcfdb084ff4016b7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42279e717e4991a3a5e4931e3a312b9603e436f45d706f6308989776eb96ca8af1c84a47780de8014793e63594d76d3fd90f6a5db99dab5bef2d2e3dcd0c6dea
|
7
|
+
data.tar.gz: f7de063d36bc0366059b9b65634e38b127f7bee228b033e7d3854a5c2cdf188779a07253c672cae2cefd532c84acc6c6190649b2c1aec2118ac83f32798c7405
|
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -81,7 +81,7 @@ Report bugs on the `pdfmult` home page: <https://github.com/stomar/pdfmult/>
|
|
81
81
|
License
|
82
82
|
-------
|
83
83
|
|
84
|
-
Copyright © 2011-
|
84
|
+
Copyright © 2011-2024 Marcus Stollsteimer
|
85
85
|
|
86
86
|
`pdfmult` is free software: you can redistribute it and/or modify
|
87
87
|
it under the terms of the GNU General Public License version 3 or later (GPLv3+),
|
data/Rakefile
CHANGED
@@ -1,52 +1,49 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# Copyright (C) 2011-2013 Marcus Stollsteimer
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
require
|
3
|
+
require "rake/testtask"
|
6
4
|
|
7
|
-
require
|
5
|
+
require "./lib/pdfmult"
|
8
6
|
|
9
7
|
PROGNAME = Pdfmult::PROGNAME
|
10
8
|
HOMEPAGE = Pdfmult::HOMEPAGE
|
11
9
|
TAGLINE = Pdfmult::TAGLINE
|
12
10
|
|
13
|
-
BINDIR =
|
14
|
-
MANDIR =
|
11
|
+
BINDIR = "/usr/local/bin"
|
12
|
+
MANDIR = "/usr/local/man/man1"
|
15
13
|
|
16
|
-
HELP2MAN =
|
17
|
-
SED =
|
14
|
+
HELP2MAN = "help2man"
|
15
|
+
SED = "sed"
|
18
16
|
|
19
|
-
BINARY =
|
20
|
-
BINARYNAME =
|
21
|
-
MANPAGE =
|
22
|
-
H2MFILE =
|
17
|
+
BINARY = "lib/pdfmult.rb"
|
18
|
+
BINARYNAME = "pdfmult" # install using this name
|
19
|
+
MANPAGE = "man/pdfmult.1"
|
20
|
+
H2MFILE = "pdfmult.h2m"
|
23
21
|
|
24
22
|
|
25
23
|
def gemspec_file
|
26
|
-
|
24
|
+
"pdfmult.gemspec"
|
27
25
|
end
|
28
26
|
|
29
27
|
|
30
|
-
task :
|
28
|
+
task default: [:test]
|
31
29
|
|
32
30
|
Rake::TestTask.new do |t|
|
33
|
-
t.pattern =
|
34
|
-
t.ruby_opts << '-rubygems'
|
31
|
+
t.pattern = "test/**/test_*.rb"
|
35
32
|
t.verbose = true
|
36
33
|
t.warning = true
|
37
34
|
end
|
38
35
|
|
39
36
|
|
40
|
-
desc
|
41
|
-
task :
|
37
|
+
desc "Install binary and man page"
|
38
|
+
task install: [BINARY, MANPAGE] do
|
42
39
|
mkdir_p BINDIR
|
43
40
|
install(BINARY, "#{BINDIR}/#{BINARYNAME}")
|
44
41
|
mkdir_p MANDIR
|
45
|
-
install(MANPAGE, MANDIR, :
|
42
|
+
install(MANPAGE, MANDIR, mode: 0o644)
|
46
43
|
end
|
47
44
|
|
48
45
|
|
49
|
-
desc
|
46
|
+
desc "Uninstall binary and man page"
|
50
47
|
task :uninstall do
|
51
48
|
rm "#{BINDIR}/#{BINARYNAME}"
|
52
49
|
manfile = File.basename(MANPAGE)
|
@@ -54,19 +51,18 @@ task :uninstall do
|
|
54
51
|
end
|
55
52
|
|
56
53
|
|
57
|
-
desc
|
58
|
-
task :
|
54
|
+
desc "Create man page"
|
55
|
+
task man: [MANPAGE]
|
59
56
|
|
60
57
|
file MANPAGE => [BINARY, H2MFILE] do
|
61
58
|
sh "#{HELP2MAN} --no-info --name='#{TAGLINE}' --include=#{H2MFILE} -o #{MANPAGE} ./#{BINARY}"
|
62
|
-
sh "#{SED} -i '/\.PP/{N;s/\.PP\\nOptions/.SH OPTIONS/}' #{MANPAGE}"
|
63
59
|
sh "#{SED} -i 's/^License GPL/.br\\nLicense GPL/;s/There is NO WARRANTY/.br\\nThere is NO WARRANTY/' #{MANPAGE}"
|
64
60
|
sh "#{SED} -i 's!%HOMEPAGE%!#{HOMEPAGE}!g' #{MANPAGE}"
|
65
61
|
sh "#{SED} -i 's!%PROGNAME%!#{PROGNAME}!g' #{MANPAGE}"
|
66
62
|
end
|
67
63
|
|
68
64
|
|
69
|
-
desc
|
70
|
-
task :
|
65
|
+
desc "Build gem"
|
66
|
+
task build: [MANPAGE] do
|
71
67
|
sh "gem build #{gemspec_file}"
|
72
68
|
end
|
data/bin/pdfmult
CHANGED
data/lib/pdfmult.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
# == Name
|
3
5
|
#
|
4
6
|
# pdfmult - put multiple copies of a PDF page on one page
|
@@ -16,33 +18,33 @@
|
|
16
18
|
#
|
17
19
|
# == Author
|
18
20
|
#
|
19
|
-
# Copyright (C) 2011-
|
21
|
+
# Copyright (C) 2011-2024 Marcus Stollsteimer
|
20
22
|
#
|
21
23
|
# License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
22
24
|
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
25
|
+
require "optparse"
|
26
|
+
require "tempfile"
|
27
|
+
require "open3"
|
28
|
+
require "erb"
|
27
29
|
|
28
30
|
# This module contains the classes for the +pdfmult+ tool.
|
29
31
|
module Pdfmult
|
30
32
|
|
31
|
-
PROGNAME =
|
32
|
-
VERSION =
|
33
|
-
DATE =
|
34
|
-
HOMEPAGE =
|
35
|
-
TAGLINE =
|
33
|
+
PROGNAME = "pdfmult"
|
34
|
+
VERSION = "1.4.0"
|
35
|
+
DATE = "2024-01-05"
|
36
|
+
HOMEPAGE = "https://github.com/stomar/pdfmult/"
|
37
|
+
TAGLINE = "puts multiple copies of a PDF page on one page"
|
36
38
|
|
37
|
-
COPYRIGHT =
|
38
|
-
Copyright (C) 2011-
|
39
|
+
COPYRIGHT = <<~TEXT
|
40
|
+
Copyright (C) 2011-2024 Marcus Stollsteimer.
|
39
41
|
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
|
40
42
|
This is free software: you are free to change and redistribute it.
|
41
43
|
There is NO WARRANTY, to the extent permitted by law.
|
42
|
-
|
44
|
+
TEXT
|
43
45
|
|
44
|
-
PDFLATEX =
|
45
|
-
KPSEWHICH =
|
46
|
+
PDFLATEX = "/usr/bin/pdflatex"
|
47
|
+
KPSEWHICH = "/usr/bin/kpsewhich"
|
46
48
|
|
47
49
|
# Parser for the command line options.
|
48
50
|
# The class method parse! does the job.
|
@@ -56,20 +58,20 @@ module Pdfmult
|
|
56
58
|
#
|
57
59
|
# Returns a hash containing the option parameters.
|
58
60
|
def self.parse!(argv)
|
59
|
-
|
60
61
|
options = {
|
61
|
-
:
|
62
|
-
:
|
63
|
-
:
|
64
|
-
:
|
65
|
-
:
|
66
|
-
:
|
67
|
-
:
|
62
|
+
force: false,
|
63
|
+
infile: nil,
|
64
|
+
latex: false,
|
65
|
+
number: 2,
|
66
|
+
outfile: nil,
|
67
|
+
silent: false,
|
68
|
+
pages: nil
|
68
69
|
}
|
69
70
|
|
70
71
|
opt_parser = OptionParser.new do |opt|
|
71
72
|
opt.banner = "Usage: #{PROGNAME} [options] file"
|
72
|
-
opt.separator
|
73
|
+
opt.separator ""
|
74
|
+
opt.separator <<~DESCRIPTION
|
73
75
|
pdfmult is a command line tool that
|
74
76
|
rearranges multiple copies of a PDF page (shrunken) on one page.
|
75
77
|
|
@@ -85,66 +87,67 @@ module Pdfmult
|
|
85
87
|
If the --latex option is used, though, pdflatex is not run
|
86
88
|
and a LaTeX file is created instead of a PDF.
|
87
89
|
|
88
|
-
Options
|
89
|
-
|
90
|
+
Options:
|
91
|
+
DESCRIPTION
|
90
92
|
|
91
93
|
# process --version and --help first,
|
92
94
|
# exit successfully (GNU Coding Standards)
|
93
|
-
opt.on_tail(
|
95
|
+
opt.on_tail("-h", "--help", "Print a brief help message and exit.") do
|
94
96
|
puts opt_parser
|
95
97
|
puts "\nReport bugs on the #{PROGNAME} home page: <#{HOMEPAGE}>"
|
96
98
|
exit
|
97
99
|
end
|
98
100
|
|
99
|
-
opt.on_tail(
|
100
|
-
|
101
|
+
opt.on_tail("-v", "--version",
|
102
|
+
"Print a brief version information and exit.") do
|
101
103
|
puts "#{PROGNAME} #{VERSION}"
|
102
104
|
puts COPYRIGHT
|
103
105
|
exit
|
104
106
|
end
|
105
107
|
|
106
|
-
opt.on(
|
107
|
-
|
108
|
+
opt.on("-n", "--number NUMBER", %w[2 4 8 9 16], Integer,
|
109
|
+
"Number of copies to put on one page: 2 (default), 4, 8, 9, 16.") do |n|
|
108
110
|
options[:number] = n
|
109
111
|
end
|
110
112
|
|
111
|
-
opt.on(
|
113
|
+
opt.on("-f", "--[no-]force", "Do not prompt before overwriting.") do |f|
|
112
114
|
options[:force] = f
|
113
115
|
end
|
114
116
|
|
115
|
-
opt.on(
|
117
|
+
opt.on("-l", "--latex", "Create a LaTeX file instead of a PDF file (default: file_2.tex).") do
|
116
118
|
options[:latex] = true
|
117
119
|
end
|
118
120
|
|
119
|
-
opt.on(
|
120
|
-
|
121
|
+
opt.on("-o", "--output FILE", String,
|
122
|
+
"Output file (default: file_2.pdf). Use - to output to stdout.") do |f|
|
121
123
|
options[:outfile] = f
|
122
124
|
end
|
123
125
|
|
124
|
-
opt.on(
|
125
|
-
|
126
|
+
opt.on("-p", "--pages NUMBER", Integer,
|
127
|
+
"Number of pages to convert.",
|
126
128
|
"If given, #{PROGNAME} does not try to obtain the page count from the source PDF.") do |p|
|
127
|
-
raise(OptionParser::InvalidArgument, p) unless p
|
129
|
+
raise(OptionParser::InvalidArgument, p) unless p.positive?
|
130
|
+
|
128
131
|
options[:pages] = p
|
129
132
|
end
|
130
133
|
|
131
|
-
opt.on(
|
134
|
+
opt.on("-s", "--[no-]silent", "Do not output progress information.") do |s|
|
132
135
|
options[:silent] = s
|
133
136
|
end
|
134
137
|
|
135
|
-
opt.separator
|
138
|
+
opt.separator ""
|
136
139
|
end
|
137
140
|
opt_parser.parse!(argv)
|
138
141
|
|
139
142
|
# only input file should be left in argv
|
140
|
-
raise(ArgumentError,
|
143
|
+
raise(ArgumentError, "wrong number of arguments") if argv.size != 1 || argv[0].empty?
|
141
144
|
|
142
145
|
options[:infile] = argv.pop
|
143
146
|
|
144
147
|
# set output file unless set by option
|
145
|
-
ext = options[:latex] ?
|
146
|
-
infile_without_ext = options[:infile].
|
147
|
-
options[:outfile] ||= "#{infile_without_ext}_#{options[:number]
|
148
|
+
ext = options[:latex] ? "tex" : "pdf"
|
149
|
+
infile_without_ext = options[:infile].delete_suffix(".pdf")
|
150
|
+
options[:outfile] ||= "#{infile_without_ext}_#{options[:number]}.#{ext}"
|
148
151
|
|
149
152
|
options
|
150
153
|
end
|
@@ -160,12 +163,12 @@ module Pdfmult
|
|
160
163
|
attr_reader :pages, :geometry
|
161
164
|
|
162
165
|
GEOMETRY = {
|
163
|
-
2
|
164
|
-
4
|
165
|
-
8
|
166
|
-
9
|
167
|
-
16 =>
|
168
|
-
}
|
166
|
+
2 => "2x1",
|
167
|
+
4 => "2x2",
|
168
|
+
8 => "4x2",
|
169
|
+
9 => "3x3",
|
170
|
+
16 => "4x4"
|
171
|
+
}.freeze
|
169
172
|
|
170
173
|
def initialize(pages)
|
171
174
|
@pages = pages
|
@@ -173,7 +176,7 @@ module Pdfmult
|
|
173
176
|
end
|
174
177
|
|
175
178
|
def landscape?
|
176
|
-
[
|
179
|
+
%w[2x1 4x2].include?(geometry)
|
177
180
|
end
|
178
181
|
end
|
179
182
|
|
@@ -187,17 +190,17 @@ module Pdfmult
|
|
187
190
|
|
188
191
|
attr_reader :pdffile, :layout, :page_count
|
189
192
|
|
190
|
-
TEMPLATE =
|
193
|
+
TEMPLATE = <<~'LATEX'
|
191
194
|
\documentclass[<%= class_options %>]{article}
|
192
195
|
\usepackage{pdfpages}
|
193
196
|
\pagestyle{empty}
|
194
197
|
\setlength{\parindent}{0pt}
|
195
198
|
\begin{document}
|
196
199
|
% pages_strings.each do |pages|
|
197
|
-
|
200
|
+
\includepdf[pages={<%= pages %>},nup=<%= geometry %>]{<%= pdffile %>}%
|
198
201
|
% end
|
199
202
|
\end{document}
|
200
|
-
|
203
|
+
LATEX
|
201
204
|
|
202
205
|
# Initializes a LaTeXDocument instance.
|
203
206
|
# Expects an argument hash with:
|
@@ -212,9 +215,7 @@ module Pdfmult
|
|
212
215
|
end
|
213
216
|
|
214
217
|
def to_s
|
215
|
-
|
216
|
-
class_options << ',landscape' if layout.landscape?
|
217
|
-
latex = ERB.new(TEMPLATE, 0, '%<>')
|
218
|
+
latex = ERB.new(TEMPLATE, trim_mode: "%<>")
|
218
219
|
|
219
220
|
latex.result(binding)
|
220
221
|
end
|
@@ -225,6 +226,10 @@ module Pdfmult
|
|
225
226
|
layout.geometry
|
226
227
|
end
|
227
228
|
|
229
|
+
def class_options
|
230
|
+
layout.landscape? ? "a4paper,landscape" : "a4paper"
|
231
|
+
end
|
232
|
+
|
228
233
|
def pages_per_sheet
|
229
234
|
layout.pages
|
230
235
|
end
|
@@ -234,7 +239,7 @@ module Pdfmult
|
|
234
239
|
def pages_strings
|
235
240
|
pages = (1..page_count).to_a
|
236
241
|
|
237
|
-
pages.map {|page| ([page] * pages_per_sheet).join(
|
242
|
+
pages.map {|page| ([page] * pages_per_sheet).join(",") }
|
238
243
|
end
|
239
244
|
end
|
240
245
|
|
@@ -246,7 +251,7 @@ module Pdfmult
|
|
246
251
|
# else the attribute is set to +nil+.
|
247
252
|
class PDFInfo
|
248
253
|
|
249
|
-
PDFINFOCMD =
|
254
|
+
PDFINFOCMD = "/usr/bin/pdfinfo"
|
250
255
|
|
251
256
|
# Returns the page count of the input file, or nil.
|
252
257
|
attr_reader :page_count
|
@@ -254,11 +259,16 @@ module Pdfmult
|
|
254
259
|
# This is the initialization method for the class.
|
255
260
|
#
|
256
261
|
# +file+ - file name of the PDF file
|
257
|
-
def initialize(file, options={})
|
262
|
+
def initialize(file, options = {})
|
258
263
|
@file = file
|
259
264
|
@binary = options[:pdfinfocmd] || PDFINFOCMD # for unit tests
|
260
265
|
infos = retrieve_infos
|
261
|
-
@page_count = infos[
|
266
|
+
@page_count = infos["Pages"]&.to_i
|
267
|
+
end
|
268
|
+
|
269
|
+
# Returns true if default +pdfinfo+ system tool is available (for unit tests).
|
270
|
+
def self.infocmd_available?
|
271
|
+
Application.command_available?("#{PDFINFOCMD} -v")
|
262
272
|
end
|
263
273
|
|
264
274
|
private
|
@@ -268,14 +278,9 @@ module Pdfmult
|
|
268
278
|
command = "#{@binary} #{@file}"
|
269
279
|
return {} unless Application.command_available?(command)
|
270
280
|
|
271
|
-
info_array = `#{command}`.split(
|
272
|
-
|
273
|
-
Hash[info_array.map {|line| line.split(/\s*:\s*/, 2) }]
|
274
|
-
end
|
281
|
+
info_array = `#{command}`.split("\n")
|
275
282
|
|
276
|
-
|
277
|
-
def self.infocmd_available?
|
278
|
-
Application.command_available?("#{PDFINFOCMD} -v")
|
283
|
+
info_array.to_h {|line| line.split(/\s*:\s*/, 2) }
|
279
284
|
end
|
280
285
|
end
|
281
286
|
|
@@ -284,17 +289,17 @@ module Pdfmult
|
|
284
289
|
# It parses the command line arguments and does the job.
|
285
290
|
class Application
|
286
291
|
|
287
|
-
ERRORCODE = {:
|
292
|
+
ERRORCODE = { general: 1, usage: 2 }.freeze
|
288
293
|
|
289
294
|
def initialize
|
290
295
|
begin
|
291
296
|
options = Optionparser.parse!(ARGV)
|
292
|
-
rescue => e
|
297
|
+
rescue StandardError => e
|
293
298
|
usage_fail(e.message)
|
294
299
|
end
|
295
300
|
@infile = options[:infile]
|
296
301
|
@outfile = options[:outfile]
|
297
|
-
@use_stdout = (@outfile ==
|
302
|
+
@use_stdout = (@outfile == "-")
|
298
303
|
@silent = options[:silent]
|
299
304
|
@force = options[:force]
|
300
305
|
@latex = options[:latex]
|
@@ -304,17 +309,16 @@ module Pdfmult
|
|
304
309
|
|
305
310
|
# The main program.
|
306
311
|
def run!
|
307
|
-
|
308
312
|
# test for pdflatex installation
|
309
313
|
unless @latex
|
310
|
-
message =
|
314
|
+
message = "seems not to be installed (you might try using the -l option)"
|
311
315
|
general_fail("`#{PDFLATEX}' #{message}") unless self.class.command_available?("#{PDFLATEX} --version")
|
312
316
|
general_fail("`pdfpages.sty' #{message}") unless self.class.command_available?("#{KPSEWHICH} pdfpages.sty")
|
313
317
|
end
|
314
318
|
|
315
319
|
# test input file
|
316
320
|
usage_fail("no such file: `#{@infile}'") unless File.exist?(@infile)
|
317
|
-
usage_fail("specified input not of the type `file'") unless File.ftype(@infile) ==
|
321
|
+
usage_fail("specified input not of the type `file'") unless File.ftype(@infile) == "file"
|
318
322
|
|
319
323
|
# test for existing output file
|
320
324
|
if !@use_stdout && !@force && File.exist?(@outfile)
|
@@ -324,9 +328,9 @@ module Pdfmult
|
|
324
328
|
|
325
329
|
# create LaTeX document
|
326
330
|
args = {
|
327
|
-
:
|
328
|
-
:
|
329
|
-
:
|
331
|
+
pdffile: @infile,
|
332
|
+
layout: Layout.new(@number),
|
333
|
+
page_count: @pages
|
330
334
|
}
|
331
335
|
document = LaTeXDocument.new(args)
|
332
336
|
|
@@ -334,12 +338,12 @@ module Pdfmult
|
|
334
338
|
if @latex
|
335
339
|
output = document.to_s
|
336
340
|
else
|
337
|
-
Dir.mktmpdir(
|
338
|
-
texfile =
|
339
|
-
pdffile =
|
340
|
-
|
341
|
+
Dir.mktmpdir("pdfmult") do |dir|
|
342
|
+
texfile = "pdfmult.tex"
|
343
|
+
pdffile = "pdfmult.pdf"
|
344
|
+
File.write("#{dir}/#{texfile}", document.to_s)
|
341
345
|
command = "#{PDFLATEX} -output-directory #{dir} #{texfile}"
|
342
|
-
Open3.popen3(command) do |
|
346
|
+
Open3.popen3(command) do |_stdin, stdout, stderr|
|
343
347
|
stdout.each_line {|line| warn line.chomp } unless @silent # redirect progress messages to stderr
|
344
348
|
stderr.read # make sure all streams are read (and command has finished)
|
345
349
|
end
|
@@ -348,12 +352,19 @@ module Pdfmult
|
|
348
352
|
end
|
349
353
|
|
350
354
|
# redirect stdout to output file
|
351
|
-
$stdout.reopen(@outfile,
|
355
|
+
$stdout.reopen(@outfile, "w") unless @use_stdout
|
352
356
|
|
353
|
-
warn "Writing on #{@outfile}." unless
|
357
|
+
warn "Writing on #{@outfile}." unless @use_stdout || @silent
|
354
358
|
puts output
|
355
359
|
end
|
356
360
|
|
361
|
+
# Tests silently whether the given system command is available.
|
362
|
+
#
|
363
|
+
# +command+ - command to test
|
364
|
+
def self.command_available?(command) # :nodoc:
|
365
|
+
!!system("#{command} >/dev/null 2>&1")
|
366
|
+
end
|
367
|
+
|
357
368
|
private
|
358
369
|
|
359
370
|
# Asks for yes or no (y/n).
|
@@ -365,7 +376,8 @@ module Pdfmult
|
|
365
376
|
loop do
|
366
377
|
$stderr.print "#{question} [y/n] "
|
367
378
|
reply = $stdin.gets.chomp.downcase # $stdin avoids gets/ARGV problem
|
368
|
-
return reply ==
|
379
|
+
return reply == "y" if reply.match?(/\A[yn]\z/)
|
380
|
+
|
369
381
|
warn "Please answer `y' or `n'."
|
370
382
|
end
|
371
383
|
end
|
@@ -382,18 +394,9 @@ module Pdfmult
|
|
382
394
|
warn "Use `#{PROGNAME} --help' for valid options."
|
383
395
|
exit ERRORCODE[:usage]
|
384
396
|
end
|
385
|
-
|
386
|
-
# Tests silently whether the given system command is available.
|
387
|
-
#
|
388
|
-
# +command+ - command to test
|
389
|
-
def self.command_available?(command) # :nodoc:
|
390
|
-
!!system("#{command} >/dev/null 2>&1")
|
391
|
-
end
|
392
397
|
end
|
393
|
-
end
|
398
|
+
end
|
394
399
|
|
395
400
|
### call main method only if called on command line
|
396
401
|
|
397
|
-
if __FILE__ == $
|
398
|
-
Pdfmult::Application.new.run!
|
399
|
-
end
|
402
|
+
Pdfmult::Application.new.run! if __FILE__ == $PROGRAM_NAME
|
data/man/pdfmult.1
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.
|
2
|
-
.TH PDFMULT "1" "
|
1
|
+
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.1.
|
2
|
+
.TH PDFMULT "1" "January 2024" "pdfmult 1.4.0" "User Commands"
|
3
3
|
.SH NAME
|
4
4
|
pdfmult \- puts multiple copies of a PDF page on one page
|
5
5
|
.SH SYNOPSIS
|
6
6
|
.B pdfmult
|
7
|
-
[\
|
7
|
+
[\fI\,options\/\fR] \fI\,file\/\fR
|
8
8
|
.SH DESCRIPTION
|
9
9
|
pdfmult is a command line tool that
|
10
10
|
rearranges multiple copies of a PDF page (shrunken) on one page.
|
@@ -55,7 +55,7 @@ Print a brief version information and exit.
|
|
55
55
|
.SH "REPORTING BUGS"
|
56
56
|
Report bugs on the pdfmult home page: <https://github.com/stomar/pdfmult/>
|
57
57
|
.SH COPYRIGHT
|
58
|
-
Copyright \(co 2011\-
|
58
|
+
Copyright \(co 2011\-2024 Marcus Stollsteimer.
|
59
59
|
.br
|
60
60
|
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
|
61
61
|
.br
|
data/pdfmult.gemspec
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "./lib/pdfmult"
|
2
4
|
|
3
5
|
version = Pdfmult::VERSION
|
4
6
|
date = Pdfmult::DATE
|
@@ -6,41 +8,42 @@ homepage = Pdfmult::HOMEPAGE
|
|
6
8
|
tagline = Pdfmult::TAGLINE
|
7
9
|
|
8
10
|
Gem::Specification.new do |s|
|
9
|
-
s.name =
|
11
|
+
s.name = "pdfmult"
|
10
12
|
s.version = version
|
11
13
|
s.date = date
|
12
14
|
|
13
|
-
s.description =
|
14
|
-
|
15
|
-
|
15
|
+
s.description = "pdfmult is a command line tool that rearranges " \
|
16
|
+
"multiple copies of a PDF page (shrunken) on one page. " \
|
17
|
+
"It is a wrapper for pdflatex with the pdfpages package."
|
16
18
|
s.summary = "pdfmult - #{tagline}"
|
17
19
|
|
18
|
-
s.authors = [
|
19
|
-
s.email =
|
20
|
+
s.authors = ["Marcus Stollsteimer"]
|
21
|
+
s.email = "sto.mar@web.de"
|
20
22
|
s.homepage = homepage
|
21
23
|
|
22
|
-
s.license =
|
24
|
+
s.license = "GPL-3.0"
|
23
25
|
|
24
|
-
s.
|
26
|
+
s.required_ruby_version = ">= 3.1.0"
|
25
27
|
|
26
|
-
s.
|
27
|
-
s.add_development_dependency('minitest')
|
28
|
+
s.requirements << "pdflatex and the pdfpages package"
|
28
29
|
|
29
|
-
s.executables = [
|
30
|
-
s.bindir =
|
30
|
+
s.executables = ["pdfmult"]
|
31
|
+
s.bindir = "bin"
|
31
32
|
|
32
|
-
s.
|
33
|
+
s.require_paths = ["lib"]
|
33
34
|
|
34
|
-
s.test_files = Dir.glob(
|
35
|
+
s.test_files = Dir.glob("test/**/test_*.rb")
|
35
36
|
|
36
|
-
s.files =
|
37
|
+
s.files =
|
38
|
+
%w[
|
37
39
|
README.md
|
38
40
|
Rakefile
|
41
|
+
Gemfile
|
39
42
|
pdfmult.gemspec
|
40
43
|
pdfmult.h2m
|
41
|
-
|
42
|
-
Dir.glob(
|
43
|
-
Dir.glob(
|
44
|
+
] +
|
45
|
+
Dir.glob("example*.*") +
|
46
|
+
Dir.glob("{bin,lib,man,test}/**/*")
|
44
47
|
|
45
|
-
s.rdoc_options = [
|
48
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
46
49
|
end
|
data/test/test_latex_document.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# Copyright (C) 2011-2013 Marcus Stollsteimer
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require 'pdfmult'
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "pdfmult"
|
8
5
|
|
9
6
|
|
10
7
|
describe Pdfmult::LaTeXDocument do
|
@@ -13,27 +10,27 @@ describe Pdfmult::LaTeXDocument do
|
|
13
10
|
@layout_class = Pdfmult::Layout
|
14
11
|
end
|
15
12
|
|
16
|
-
it
|
13
|
+
it "should return the expected LaTeX code for 4 pages" do
|
17
14
|
args = {
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
15
|
+
pdffile: "sample.pdf",
|
16
|
+
layout: @layout_class.new(4),
|
17
|
+
page_count: 3
|
21
18
|
}
|
22
|
-
document_lines = Pdfmult::LaTeXDocument.new(args).to_s.split(
|
23
|
-
document_lines[0].must_equal '\documentclass[a4paper]{article}'
|
24
|
-
document_lines[-2].must_equal '\includepdf[pages={3,3,3,3},nup=2x2]{sample.pdf}%'
|
25
|
-
document_lines.grep(/includepdf/).size.must_equal args[:page_count]
|
19
|
+
document_lines = Pdfmult::LaTeXDocument.new(args).to_s.split("\n")
|
20
|
+
_(document_lines[0]).must_equal '\documentclass[a4paper]{article}'
|
21
|
+
_(document_lines[-2]).must_equal '\includepdf[pages={3,3,3,3},nup=2x2]{sample.pdf}%'
|
22
|
+
_(document_lines.grep(/includepdf/).size).must_equal args[:page_count]
|
26
23
|
end
|
27
24
|
|
28
|
-
it
|
25
|
+
it "should return the expected LaTeX code for 8 pages" do
|
29
26
|
args = {
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
27
|
+
pdffile: "sample.pdf",
|
28
|
+
layout: @layout_class.new(8),
|
29
|
+
page_count: 5
|
33
30
|
}
|
34
|
-
document_lines = Pdfmult::LaTeXDocument.new(args).to_s.split(
|
35
|
-
document_lines[0].must_equal '\documentclass[a4paper,landscape]{article}'
|
36
|
-
document_lines[-2].must_equal '\includepdf[pages={5,5,5,5,5,5,5,5},nup=4x2]{sample.pdf}%'
|
37
|
-
document_lines.grep(/includepdf/).size.must_equal args[:page_count]
|
31
|
+
document_lines = Pdfmult::LaTeXDocument.new(args).to_s.split("\n")
|
32
|
+
_(document_lines[0]).must_equal '\documentclass[a4paper,landscape]{article}'
|
33
|
+
_(document_lines[-2]).must_equal '\includepdf[pages={5,5,5,5,5,5,5,5},nup=4x2]{sample.pdf}%'
|
34
|
+
_(document_lines.grep(/includepdf/).size).must_equal args[:page_count]
|
38
35
|
end
|
39
36
|
end
|
data/test/test_layout.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# Copyright (C) 2011-2013 Marcus Stollsteimer
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require 'pdfmult'
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "pdfmult"
|
8
5
|
|
9
6
|
|
10
7
|
describe Pdfmult::Layout do
|
@@ -13,45 +10,45 @@ describe Pdfmult::Layout do
|
|
13
10
|
@layout = Pdfmult::Layout.new(2)
|
14
11
|
end
|
15
12
|
|
16
|
-
it
|
17
|
-
@layout.pages.must_equal 2
|
13
|
+
it "can return the number of pages" do
|
14
|
+
_(@layout.pages).must_equal 2
|
18
15
|
end
|
19
16
|
|
20
|
-
it
|
21
|
-
@layout.geometry.must_equal
|
17
|
+
it "can return the geometry" do
|
18
|
+
_(@layout.geometry).must_equal "2x1"
|
22
19
|
end
|
23
20
|
|
24
|
-
it
|
25
|
-
@layout.landscape
|
21
|
+
it "knows whether it is landscape" do
|
22
|
+
_(@layout.landscape?).must_equal true
|
26
23
|
end
|
27
24
|
|
28
|
-
it
|
25
|
+
it "returns the correct layout for 2 pages" do
|
29
26
|
layout = Pdfmult::Layout.new(2)
|
30
|
-
layout.geometry.must_equal
|
31
|
-
layout.landscape
|
27
|
+
_(layout.geometry).must_equal "2x1"
|
28
|
+
_(layout.landscape?).must_equal true
|
32
29
|
end
|
33
30
|
|
34
|
-
it
|
31
|
+
it "returns the correct layout for 4 pages" do
|
35
32
|
layout = Pdfmult::Layout.new(4)
|
36
|
-
layout.geometry.must_equal
|
37
|
-
layout.landscape
|
33
|
+
_(layout.geometry).must_equal "2x2"
|
34
|
+
_(layout.landscape?).must_equal false
|
38
35
|
end
|
39
36
|
|
40
|
-
it
|
37
|
+
it "returns the correct layout for 8 pages" do
|
41
38
|
layout = Pdfmult::Layout.new(8)
|
42
|
-
layout.geometry.must_equal
|
43
|
-
layout.landscape
|
39
|
+
_(layout.geometry).must_equal "4x2"
|
40
|
+
_(layout.landscape?).must_equal true
|
44
41
|
end
|
45
42
|
|
46
|
-
it
|
43
|
+
it "returns the correct layout for 9 pages" do
|
47
44
|
layout = Pdfmult::Layout.new(9)
|
48
|
-
layout.geometry.must_equal
|
49
|
-
layout.landscape
|
45
|
+
_(layout.geometry).must_equal "3x3"
|
46
|
+
_(layout.landscape?).must_equal false
|
50
47
|
end
|
51
48
|
|
52
|
-
it
|
49
|
+
it "returns the correct layout for 16 pages" do
|
53
50
|
layout = Pdfmult::Layout.new(16)
|
54
|
-
layout.geometry.must_equal
|
55
|
-
layout.landscape
|
51
|
+
_(layout.geometry).must_equal "4x4"
|
52
|
+
_(layout.landscape?).must_equal false
|
56
53
|
end
|
57
54
|
end
|
data/test/test_optionparser.rb
CHANGED
@@ -1,87 +1,84 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# Copyright (C) 2011-2013 Marcus Stollsteimer
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require 'pdfmult'
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "pdfmult"
|
8
5
|
|
9
6
|
|
10
7
|
describe Pdfmult::Optionparser do
|
11
8
|
|
12
|
-
it
|
13
|
-
options = Pdfmult::Optionparser.parse!([
|
9
|
+
it "should return the correct default values" do
|
10
|
+
options = Pdfmult::Optionparser.parse!(["sample.pdf"])
|
14
11
|
expected = {
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
12
|
+
force: false,
|
13
|
+
infile: "sample.pdf",
|
14
|
+
latex: false,
|
15
|
+
number: 2,
|
16
|
+
outfile: "sample_2.pdf",
|
17
|
+
pages: nil,
|
18
|
+
silent: false
|
22
19
|
}
|
23
|
-
options.must_equal expected
|
20
|
+
_(options).must_equal expected
|
24
21
|
end
|
25
22
|
|
26
|
-
it
|
27
|
-
options = Pdfmult::Optionparser.parse!([
|
28
|
-
options[:outfile].must_equal
|
29
|
-
options[:number].must_equal 4
|
23
|
+
it "should recognize the -n option and set the corresponding output filename" do
|
24
|
+
options = Pdfmult::Optionparser.parse!(["sample.pdf", "-n", "4"])
|
25
|
+
_(options[:outfile]).must_equal "sample_4.pdf"
|
26
|
+
_(options[:number]).must_equal 4
|
30
27
|
end
|
31
28
|
|
32
|
-
it
|
33
|
-
|
29
|
+
it "should not accept invalid -n option values" do
|
30
|
+
_ { Pdfmult::Optionparser.parse!(["sample.pdf", "-n", "3"]) }.must_raise OptionParser::InvalidArgument
|
34
31
|
end
|
35
32
|
|
36
|
-
it
|
37
|
-
options = Pdfmult::Optionparser.parse!([
|
38
|
-
options[:outfile].must_equal
|
33
|
+
it "should recognize the -o option" do
|
34
|
+
options = Pdfmult::Optionparser.parse!(["sample.pdf", "-o", "outfile.pdf"])
|
35
|
+
_(options[:outfile]).must_equal "outfile.pdf"
|
39
36
|
end
|
40
37
|
|
41
|
-
it
|
42
|
-
options = Pdfmult::Optionparser.parse!([
|
43
|
-
options[:pages].must_equal 4
|
38
|
+
it "should recognize the -p option" do
|
39
|
+
options = Pdfmult::Optionparser.parse!(["sample.pdf", "-p", "4"])
|
40
|
+
_(options[:pages]).must_equal 4
|
44
41
|
end
|
45
42
|
|
46
|
-
it
|
47
|
-
options = Pdfmult::Optionparser.parse!([
|
48
|
-
options[:force].must_equal true
|
43
|
+
it "should recognize the -f option" do
|
44
|
+
options = Pdfmult::Optionparser.parse!(["sample.pdf", "-f"])
|
45
|
+
_(options[:force]).must_equal true
|
49
46
|
end
|
50
47
|
|
51
|
-
it
|
52
|
-
options = Pdfmult::Optionparser.parse!([
|
53
|
-
options[:force].must_equal false
|
48
|
+
it "should recognize the --no-force option" do
|
49
|
+
options = Pdfmult::Optionparser.parse!(["sample.pdf", "--no-force"])
|
50
|
+
_(options[:force]).must_equal false
|
54
51
|
end
|
55
52
|
|
56
|
-
it
|
57
|
-
options = Pdfmult::Optionparser.parse!([
|
58
|
-
options[:outfile].must_equal
|
59
|
-
options[:latex].must_equal true
|
53
|
+
it "should recognize the -l option and set the corresponding output filename" do
|
54
|
+
options = Pdfmult::Optionparser.parse!(["sample.pdf", "-l"])
|
55
|
+
_(options[:outfile]).must_equal "sample_2.tex"
|
56
|
+
_(options[:latex]).must_equal true
|
60
57
|
end
|
61
58
|
|
62
|
-
it
|
63
|
-
|
64
|
-
|
65
|
-
|
59
|
+
it "should only accept positive -p option values" do
|
60
|
+
_ { Pdfmult::Optionparser.parse!(["sample.pdf", "-p", "0.5"]) }.must_raise OptionParser::InvalidArgument
|
61
|
+
_ { Pdfmult::Optionparser.parse!(["sample.pdf", "-p", "0"]) }.must_raise OptionParser::InvalidArgument
|
62
|
+
_ { Pdfmult::Optionparser.parse!(["sample.pdf", "-p", "-1"]) }.must_raise OptionParser::InvalidArgument
|
66
63
|
end
|
67
64
|
|
68
|
-
it
|
69
|
-
options = Pdfmult::Optionparser.parse!([
|
70
|
-
options[:silent].must_equal true
|
65
|
+
it "should recognize the -s option" do
|
66
|
+
options = Pdfmult::Optionparser.parse!(["sample.pdf", "-s"])
|
67
|
+
_(options[:silent]).must_equal true
|
71
68
|
end
|
72
69
|
|
73
|
-
it
|
74
|
-
options = Pdfmult::Optionparser.parse!([
|
75
|
-
options[:silent].must_equal false
|
70
|
+
it "should recognize the --no-silent option" do
|
71
|
+
options = Pdfmult::Optionparser.parse!(["sample.pdf", "--no-silent"])
|
72
|
+
_(options[:silent]).must_equal false
|
76
73
|
end
|
77
74
|
|
78
|
-
it
|
79
|
-
|
80
|
-
|
81
|
-
|
75
|
+
it "should not accept wrong number of arguments" do
|
76
|
+
_ { Pdfmult::Optionparser.parse!(["sample.pdf", "sample2.pdf"]) }.must_raise ArgumentError
|
77
|
+
_ { Pdfmult::Optionparser.parse!([""]) }.must_raise ArgumentError
|
78
|
+
_ { Pdfmult::Optionparser.parse!([]) }.must_raise ArgumentError
|
82
79
|
end
|
83
80
|
|
84
|
-
it
|
85
|
-
|
81
|
+
it "should not accept invalid options" do
|
82
|
+
_ { Pdfmult::Optionparser.parse!(["-x"]) }.must_raise OptionParser::InvalidOption
|
86
83
|
end
|
87
84
|
end
|
data/test/test_pdfinfo.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# Copyright (C) 2011-2013 Marcus Stollsteimer
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require 'pdfmult'
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "pdfmult"
|
8
5
|
|
9
6
|
SRCPATH = File.dirname(__FILE__)
|
10
7
|
|
@@ -15,20 +12,20 @@ describe Pdfmult::PDFInfo do
|
|
15
12
|
@sample_pdf = File.expand_path("#{SRCPATH}/sample.pdf")
|
16
13
|
end
|
17
14
|
|
18
|
-
describe
|
19
|
-
it
|
15
|
+
describe "when asked about the page count" do
|
16
|
+
it "should return the page count for existing file and system tool" do
|
20
17
|
infocmd = Pdfmult::PDFInfo::PDFINFOCMD
|
21
18
|
skip("Skipped: `#{infocmd}' not available on the system") unless Pdfmult::PDFInfo.infocmd_available?
|
22
|
-
Pdfmult::PDFInfo.new(@sample_pdf).page_count.must_equal 3
|
23
|
-
Pdfmult::PDFInfo.new(@sample_pdf, :
|
19
|
+
_(Pdfmult::PDFInfo.new(@sample_pdf).page_count).must_equal 3
|
20
|
+
_(Pdfmult::PDFInfo.new(@sample_pdf, pdfinfocmd: infocmd).page_count).must_equal 3
|
24
21
|
end
|
25
22
|
|
26
|
-
it
|
27
|
-
Pdfmult::PDFInfo.new(
|
23
|
+
it "should return nil for non-existent files" do
|
24
|
+
_(Pdfmult::PDFInfo.new("not_a_file.pdf").page_count).must_be_nil
|
28
25
|
end
|
29
26
|
|
30
27
|
it "should return nil for non-existent `pdfinfo' system tool" do
|
31
|
-
Pdfmult::PDFInfo.new(@sample_pdf, :
|
28
|
+
_(Pdfmult::PDFInfo.new(@sample_pdf, pdfinfocmd: "not_a_command").page_count).must_be_nil
|
32
29
|
end
|
33
30
|
end
|
34
31
|
end
|
metadata
CHANGED
@@ -1,43 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pdfmult
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcus Stollsteimer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '>='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: minitest
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - '>='
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - '>='
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
11
|
+
date: 2024-01-05 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
41
13
|
description: pdfmult is a command line tool that rearranges multiple copies of a PDF
|
42
14
|
page (shrunken) on one page. It is a wrapper for pdflatex with the pdfpages package.
|
43
15
|
email: sto.mar@web.de
|
@@ -46,51 +18,51 @@ executables:
|
|
46
18
|
extensions: []
|
47
19
|
extra_rdoc_files: []
|
48
20
|
files:
|
21
|
+
- Gemfile
|
49
22
|
- README.md
|
50
23
|
- Rakefile
|
51
|
-
- pdfmult
|
52
|
-
- pdfmult.h2m
|
24
|
+
- bin/pdfmult
|
53
25
|
- example1.fig
|
54
26
|
- example1.png
|
55
27
|
- example2.fig
|
56
28
|
- example2.png
|
57
|
-
- bin/pdfmult
|
58
29
|
- lib/pdfmult.rb
|
59
30
|
- man/pdfmult.1
|
60
|
-
-
|
61
|
-
-
|
31
|
+
- pdfmult.gemspec
|
32
|
+
- pdfmult.h2m
|
33
|
+
- test/sample.pdf
|
62
34
|
- test/sample.tex
|
35
|
+
- test/test_latex_document.rb
|
63
36
|
- test/test_layout.rb
|
64
37
|
- test/test_optionparser.rb
|
65
|
-
- test/
|
38
|
+
- test/test_pdfinfo.rb
|
66
39
|
homepage: https://github.com/stomar/pdfmult/
|
67
40
|
licenses:
|
68
|
-
- GPL-3
|
41
|
+
- GPL-3.0
|
69
42
|
metadata: {}
|
70
43
|
post_install_message:
|
71
44
|
rdoc_options:
|
72
|
-
- --charset=UTF-8
|
45
|
+
- "--charset=UTF-8"
|
73
46
|
require_paths:
|
74
47
|
- lib
|
75
48
|
required_ruby_version: !ruby/object:Gem::Requirement
|
76
49
|
requirements:
|
77
|
-
- -
|
50
|
+
- - ">="
|
78
51
|
- !ruby/object:Gem::Version
|
79
|
-
version:
|
52
|
+
version: 3.1.0
|
80
53
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
54
|
requirements:
|
82
|
-
- -
|
55
|
+
- - ">="
|
83
56
|
- !ruby/object:Gem::Version
|
84
57
|
version: '0'
|
85
58
|
requirements:
|
86
59
|
- pdflatex and the pdfpages package
|
87
|
-
|
88
|
-
rubygems_version: 2.1.9
|
60
|
+
rubygems_version: 3.5.3
|
89
61
|
signing_key:
|
90
62
|
specification_version: 4
|
91
63
|
summary: pdfmult - puts multiple copies of a PDF page on one page
|
92
64
|
test_files:
|
93
|
-
- test/test_pdfinfo.rb
|
94
65
|
- test/test_latex_document.rb
|
95
66
|
- test/test_layout.rb
|
96
67
|
- test/test_optionparser.rb
|
68
|
+
- test/test_pdfinfo.rb
|