pdfmult 1.3.1 → 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 +7 -0
- data/Gemfile +6 -0
- data/README.md +5 -5
- data/Rakefile +22 -26
- data/bin/pdfmult +3 -2
- data/lib/pdfmult.rb +153 -142
- data/man/pdfmult.1 +4 -4
- data/pdfmult.gemspec +25 -21
- 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 +36 -79
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c2332ed5eb863e47259f51eaedc2e6f26d9bc58190c2c0da9c13a2d1d128f7fd
|
4
|
+
data.tar.gz: 164a73cc0876f21ebacee131c000c74609f591784f46297fcfdb084ff4016b7f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 42279e717e4991a3a5e4931e3a312b9603e436f45d706f6308989776eb96ca8af1c84a47780de8014793e63594d76d3fd90f6a5db99dab5bef2d2e3dcd0c6dea
|
7
|
+
data.tar.gz: f7de063d36bc0366059b9b65634e38b127f7bee228b033e7d3854a5c2cdf188779a07253c672cae2cefd532c84acc6c6190649b2c1aec2118ac83f32798c7405
|
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -23,13 +23,13 @@ Use the program as shown in the examples below.
|
|
23
23
|
|
24
24
|
writes 2 copies of `sample.pdf` to `sample_2.pdf`
|
25
25
|
|
26
|
-
<img src="
|
26
|
+
<img src="example1.png" alt="" width="152" height="59">
|
27
27
|
|
28
28
|
* `pdfmult -n 4 sample.pdf`
|
29
29
|
|
30
30
|
writes 4 copies of `sample.pdf` to `sample_4.pdf`
|
31
31
|
|
32
|
-
<img src="
|
32
|
+
<img src="example2.png" alt="" width="234" height="59">
|
33
33
|
|
34
34
|
* `pdfmult sample.pdf -o outfile.pdf`
|
35
35
|
|
@@ -46,7 +46,7 @@ Use the program as shown in the examples below.
|
|
46
46
|
Installation
|
47
47
|
------------
|
48
48
|
|
49
|
-
Use `gem install pdfmult
|
49
|
+
Use `gem install pdfmult` to install from RubyGems.org.
|
50
50
|
|
51
51
|
Or copy `lib/pdfmult.rb` under the name `pdfmult` into your search path.
|
52
52
|
|
@@ -60,7 +60,7 @@ As of now, `pdfmult` has only been tested on a Linux system.
|
|
60
60
|
|
61
61
|
- `pdfmult` is written in [Ruby][Ruby], so Ruby must be installed on your system.
|
62
62
|
- `pdfmult` uses `pdflatex` with the `pdfpages` package, so both have to be installed on the system.
|
63
|
-
(If `pdfmult`
|
63
|
+
(If `pdfmult` cannot find the `pdflatex` command on your system
|
64
64
|
you might want to use the `--latex` option.)
|
65
65
|
- `pdfmult` tries to obtain the page count of PDF files with `pdfinfo`.
|
66
66
|
If it fails, by default only the first page of a PDF file will be processed.
|
@@ -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,31 +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
|
-
|
39
|
-
|
40
|
-
|
39
|
+
COPYRIGHT = <<~TEXT
|
40
|
+
Copyright (C) 2011-2024 Marcus Stollsteimer.
|
41
|
+
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
|
42
|
+
This is free software: you are free to change and redistribute it.
|
43
|
+
There is NO WARRANTY, to the extent permitted by law.
|
44
|
+
TEXT
|
41
45
|
|
42
|
-
PDFLATEX =
|
43
|
-
KPSEWHICH =
|
46
|
+
PDFLATEX = "/usr/bin/pdflatex"
|
47
|
+
KPSEWHICH = "/usr/bin/kpsewhich"
|
44
48
|
|
45
49
|
# Parser for the command line options.
|
46
50
|
# The class method parse! does the job.
|
@@ -54,95 +58,96 @@ module Pdfmult
|
|
54
58
|
#
|
55
59
|
# Returns a hash containing the option parameters.
|
56
60
|
def self.parse!(argv)
|
57
|
-
|
58
61
|
options = {
|
59
|
-
:
|
60
|
-
:
|
61
|
-
:
|
62
|
-
:
|
63
|
-
:
|
64
|
-
:
|
65
|
-
:
|
62
|
+
force: false,
|
63
|
+
infile: nil,
|
64
|
+
latex: false,
|
65
|
+
number: 2,
|
66
|
+
outfile: nil,
|
67
|
+
silent: false,
|
68
|
+
pages: nil
|
66
69
|
}
|
67
70
|
|
68
71
|
opt_parser = OptionParser.new do |opt|
|
69
72
|
opt.banner = "Usage: #{PROGNAME} [options] file"
|
70
|
-
opt.separator
|
71
|
-
opt.separator
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
73
|
+
opt.separator ""
|
74
|
+
opt.separator <<~DESCRIPTION
|
75
|
+
pdfmult is a command line tool that
|
76
|
+
rearranges multiple copies of a PDF page (shrunken) on one page.
|
77
|
+
|
78
|
+
The paper size of the produced PDF file is A4,
|
79
|
+
the input file is also assumed to be in A4 format.
|
80
|
+
The input PDF file may consist of several pages.
|
81
|
+
If pdfmult succeeds in obtaining the page count it will rearrange all pages,
|
82
|
+
if not, only the first page is processed
|
83
|
+
(unless the page count was specified via command line option).
|
84
|
+
|
85
|
+
pdfmult uses pdflatex with the pdfpages package,
|
86
|
+
so both have to be installed on the system.
|
87
|
+
If the --latex option is used, though, pdflatex is not run
|
88
|
+
and a LaTeX file is created instead of a PDF.
|
89
|
+
|
90
|
+
Options:
|
91
|
+
DESCRIPTION
|
88
92
|
|
89
93
|
# process --version and --help first,
|
90
94
|
# exit successfully (GNU Coding Standards)
|
91
|
-
opt.on_tail(
|
95
|
+
opt.on_tail("-h", "--help", "Print a brief help message and exit.") do
|
92
96
|
puts opt_parser
|
93
97
|
puts "\nReport bugs on the #{PROGNAME} home page: <#{HOMEPAGE}>"
|
94
98
|
exit
|
95
99
|
end
|
96
100
|
|
97
|
-
opt.on_tail(
|
98
|
-
|
101
|
+
opt.on_tail("-v", "--version",
|
102
|
+
"Print a brief version information and exit.") do
|
99
103
|
puts "#{PROGNAME} #{VERSION}"
|
100
104
|
puts COPYRIGHT
|
101
105
|
exit
|
102
106
|
end
|
103
107
|
|
104
|
-
opt.on(
|
105
|
-
|
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|
|
106
110
|
options[:number] = n
|
107
111
|
end
|
108
112
|
|
109
|
-
opt.on(
|
113
|
+
opt.on("-f", "--[no-]force", "Do not prompt before overwriting.") do |f|
|
110
114
|
options[:force] = f
|
111
115
|
end
|
112
116
|
|
113
|
-
opt.on(
|
117
|
+
opt.on("-l", "--latex", "Create a LaTeX file instead of a PDF file (default: file_2.tex).") do
|
114
118
|
options[:latex] = true
|
115
119
|
end
|
116
120
|
|
117
|
-
opt.on(
|
118
|
-
|
121
|
+
opt.on("-o", "--output FILE", String,
|
122
|
+
"Output file (default: file_2.pdf). Use - to output to stdout.") do |f|
|
119
123
|
options[:outfile] = f
|
120
124
|
end
|
121
125
|
|
122
|
-
opt.on(
|
123
|
-
|
126
|
+
opt.on("-p", "--pages NUMBER", Integer,
|
127
|
+
"Number of pages to convert.",
|
124
128
|
"If given, #{PROGNAME} does not try to obtain the page count from the source PDF.") do |p|
|
125
|
-
raise(OptionParser::InvalidArgument, p) unless p
|
129
|
+
raise(OptionParser::InvalidArgument, p) unless p.positive?
|
130
|
+
|
126
131
|
options[:pages] = p
|
127
132
|
end
|
128
133
|
|
129
|
-
opt.on(
|
134
|
+
opt.on("-s", "--[no-]silent", "Do not output progress information.") do |s|
|
130
135
|
options[:silent] = s
|
131
136
|
end
|
132
137
|
|
133
|
-
opt.separator
|
138
|
+
opt.separator ""
|
134
139
|
end
|
135
140
|
opt_parser.parse!(argv)
|
136
141
|
|
137
142
|
# only input file should be left in argv
|
138
|
-
raise(ArgumentError,
|
143
|
+
raise(ArgumentError, "wrong number of arguments") if argv.size != 1 || argv[0].empty?
|
139
144
|
|
140
145
|
options[:infile] = argv.pop
|
141
146
|
|
142
147
|
# set output file unless set by option
|
143
|
-
ext = options[:latex] ?
|
144
|
-
infile_without_ext = options[:infile].
|
145
|
-
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}"
|
146
151
|
|
147
152
|
options
|
148
153
|
end
|
@@ -158,12 +163,12 @@ module Pdfmult
|
|
158
163
|
attr_reader :pages, :geometry
|
159
164
|
|
160
165
|
GEOMETRY = {
|
161
|
-
2
|
162
|
-
4
|
163
|
-
8
|
164
|
-
9
|
165
|
-
16 =>
|
166
|
-
}
|
166
|
+
2 => "2x1",
|
167
|
+
4 => "2x2",
|
168
|
+
8 => "4x2",
|
169
|
+
9 => "3x3",
|
170
|
+
16 => "4x4"
|
171
|
+
}.freeze
|
167
172
|
|
168
173
|
def initialize(pages)
|
169
174
|
@pages = pages
|
@@ -171,30 +176,31 @@ module Pdfmult
|
|
171
176
|
end
|
172
177
|
|
173
178
|
def landscape?
|
174
|
-
[
|
179
|
+
%w[2x1 4x2].include?(geometry)
|
175
180
|
end
|
176
181
|
end
|
177
182
|
|
178
183
|
# Class for the LaTeX document.
|
179
184
|
#
|
180
|
-
# Create an instance with LaTeXDocument.new, specifying
|
181
|
-
#
|
182
|
-
# and the page count of the input file.
|
185
|
+
# Create an instance with LaTeXDocument.new, specifying the
|
186
|
+
# input file, the layout, and the page count of the input file.
|
183
187
|
#
|
184
188
|
# The method +to_s+ returns the document as multiline string.
|
185
189
|
class LaTeXDocument
|
186
190
|
|
187
|
-
|
191
|
+
attr_reader :pdffile, :layout, :page_count
|
192
|
+
|
193
|
+
TEMPLATE = <<~'LATEX'
|
188
194
|
\documentclass[<%= class_options %>]{article}
|
189
195
|
\usepackage{pdfpages}
|
190
196
|
\pagestyle{empty}
|
191
197
|
\setlength{\parindent}{0pt}
|
192
198
|
\begin{document}
|
193
199
|
% pages_strings.each do |pages|
|
194
|
-
|
200
|
+
\includepdf[pages={<%= pages %>},nup=<%= geometry %>]{<%= pdffile %>}%
|
195
201
|
% end
|
196
202
|
\end{document}
|
197
|
-
|
203
|
+
LATEX
|
198
204
|
|
199
205
|
# Initializes a LaTeXDocument instance.
|
200
206
|
# Expects an argument hash with:
|
@@ -209,9 +215,7 @@ module Pdfmult
|
|
209
215
|
end
|
210
216
|
|
211
217
|
def to_s
|
212
|
-
|
213
|
-
class_options << ',landscape' if @layout.landscape?
|
214
|
-
latex = ERB.new(TEMPLATE, 0, '%<>')
|
218
|
+
latex = ERB.new(TEMPLATE, trim_mode: "%<>")
|
215
219
|
|
216
220
|
latex.result(binding)
|
217
221
|
end
|
@@ -219,15 +223,23 @@ module Pdfmult
|
|
219
223
|
private
|
220
224
|
|
221
225
|
def geometry
|
222
|
-
|
226
|
+
layout.geometry
|
227
|
+
end
|
228
|
+
|
229
|
+
def class_options
|
230
|
+
layout.landscape? ? "a4paper,landscape" : "a4paper"
|
231
|
+
end
|
232
|
+
|
233
|
+
def pages_per_sheet
|
234
|
+
layout.pages
|
223
235
|
end
|
224
236
|
|
225
237
|
# Returns an array of pages strings.
|
226
238
|
# For 4 copies and 2 pages: ["1,1,1,1", "2,2,2,2"].
|
227
239
|
def pages_strings
|
228
|
-
|
240
|
+
pages = (1..page_count).to_a
|
229
241
|
|
230
|
-
|
242
|
+
pages.map {|page| ([page] * pages_per_sheet).join(",") }
|
231
243
|
end
|
232
244
|
end
|
233
245
|
|
@@ -239,7 +251,7 @@ module Pdfmult
|
|
239
251
|
# else the attribute is set to +nil+.
|
240
252
|
class PDFInfo
|
241
253
|
|
242
|
-
PDFINFOCMD =
|
254
|
+
PDFINFOCMD = "/usr/bin/pdfinfo"
|
243
255
|
|
244
256
|
# Returns the page count of the input file, or nil.
|
245
257
|
attr_reader :page_count
|
@@ -247,11 +259,16 @@ module Pdfmult
|
|
247
259
|
# This is the initialization method for the class.
|
248
260
|
#
|
249
261
|
# +file+ - file name of the PDF file
|
250
|
-
def initialize(file, options={})
|
262
|
+
def initialize(file, options = {})
|
251
263
|
@file = file
|
252
264
|
@binary = options[:pdfinfocmd] || PDFINFOCMD # for unit tests
|
253
|
-
|
254
|
-
@page_count =
|
265
|
+
infos = retrieve_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")
|
255
272
|
end
|
256
273
|
|
257
274
|
private
|
@@ -261,14 +278,9 @@ module Pdfmult
|
|
261
278
|
command = "#{@binary} #{@file}"
|
262
279
|
return {} unless Application.command_available?(command)
|
263
280
|
|
264
|
-
info_array = `#{command}`.split(
|
281
|
+
info_array = `#{command}`.split("\n")
|
265
282
|
|
266
|
-
|
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")
|
283
|
+
info_array.to_h {|line| line.split(/\s*:\s*/, 2) }
|
272
284
|
end
|
273
285
|
end
|
274
286
|
|
@@ -277,62 +289,62 @@ module Pdfmult
|
|
277
289
|
# It parses the command line arguments and does the job.
|
278
290
|
class Application
|
279
291
|
|
280
|
-
ERRORCODE = {:
|
281
|
-
|
282
|
-
# The main program.
|
283
|
-
def self.run!
|
292
|
+
ERRORCODE = { general: 1, usage: 2 }.freeze
|
284
293
|
|
285
|
-
|
294
|
+
def initialize
|
286
295
|
begin
|
287
296
|
options = Optionparser.parse!(ARGV)
|
288
|
-
rescue => e
|
297
|
+
rescue StandardError => e
|
289
298
|
usage_fail(e.message)
|
290
299
|
end
|
300
|
+
@infile = options[:infile]
|
301
|
+
@outfile = options[:outfile]
|
302
|
+
@use_stdout = (@outfile == "-")
|
303
|
+
@silent = options[:silent]
|
304
|
+
@force = options[:force]
|
305
|
+
@latex = options[:latex]
|
306
|
+
@number = options[:number]
|
307
|
+
@pages = options[:pages] || PDFInfo.new(@infile).page_count || 1
|
308
|
+
end
|
291
309
|
|
292
|
-
|
293
|
-
|
294
|
-
use_stdout = (outfile == '-')
|
295
|
-
silent = options[:silent]
|
296
|
-
|
310
|
+
# The main program.
|
311
|
+
def run!
|
297
312
|
# test for pdflatex installation
|
298
|
-
unless
|
299
|
-
message =
|
300
|
-
general_fail("`#{PDFLATEX}' #{message}") unless command_available?("#{PDFLATEX} --version")
|
301
|
-
general_fail("`pdfpages.sty' #{message}") unless command_available?("#{KPSEWHICH} pdfpages.sty")
|
313
|
+
unless @latex
|
314
|
+
message = "seems not to be installed (you might try using the -l option)"
|
315
|
+
general_fail("`#{PDFLATEX}' #{message}") unless self.class.command_available?("#{PDFLATEX} --version")
|
316
|
+
general_fail("`pdfpages.sty' #{message}") unless self.class.command_available?("#{KPSEWHICH} pdfpages.sty")
|
302
317
|
end
|
303
318
|
|
304
319
|
# test input file
|
305
|
-
usage_fail("no such file: `#{infile}'") unless File.exist?(infile)
|
306
|
-
usage_fail("specified input not of the type `file'") unless File.ftype(infile) ==
|
320
|
+
usage_fail("no such file: `#{@infile}'") unless File.exist?(@infile)
|
321
|
+
usage_fail("specified input not of the type `file'") unless File.ftype(@infile) == "file"
|
307
322
|
|
308
323
|
# test for existing output file
|
309
|
-
if
|
310
|
-
overwrite_ok =
|
324
|
+
if !@use_stdout && !@force && File.exist?(@outfile)
|
325
|
+
overwrite_ok = confirm("File `#{@outfile}' already exists. Overwrite?")
|
311
326
|
exit unless overwrite_ok
|
312
327
|
end
|
313
328
|
|
314
|
-
# set page number (get PDF info if necessary)
|
315
|
-
pages = options[:pages] || PDFInfo.new(infile).page_count || 1
|
316
|
-
|
317
329
|
# create LaTeX document
|
318
330
|
args = {
|
319
|
-
:
|
320
|
-
:
|
321
|
-
:
|
331
|
+
pdffile: @infile,
|
332
|
+
layout: Layout.new(@number),
|
333
|
+
page_count: @pages
|
322
334
|
}
|
323
335
|
document = LaTeXDocument.new(args)
|
324
336
|
|
325
337
|
output = nil
|
326
|
-
if
|
338
|
+
if @latex
|
327
339
|
output = document.to_s
|
328
340
|
else
|
329
|
-
Dir.mktmpdir(
|
330
|
-
texfile =
|
331
|
-
pdffile =
|
332
|
-
|
341
|
+
Dir.mktmpdir("pdfmult") do |dir|
|
342
|
+
texfile = "pdfmult.tex"
|
343
|
+
pdffile = "pdfmult.pdf"
|
344
|
+
File.write("#{dir}/#{texfile}", document.to_s)
|
333
345
|
command = "#{PDFLATEX} -output-directory #{dir} #{texfile}"
|
334
|
-
Open3.popen3(command) do |
|
335
|
-
stdout.each_line {|line| warn line.chomp } unless silent # redirect progress messages to stderr
|
346
|
+
Open3.popen3(command) do |_stdin, stdout, stderr|
|
347
|
+
stdout.each_line {|line| warn line.chomp } unless @silent # redirect progress messages to stderr
|
336
348
|
stderr.read # make sure all streams are read (and command has finished)
|
337
349
|
end
|
338
350
|
output = File.read("#{dir}/#{pdffile}")
|
@@ -340,52 +352,51 @@ module Pdfmult
|
|
340
352
|
end
|
341
353
|
|
342
354
|
# redirect stdout to output file
|
343
|
-
$stdout.reopen(outfile,
|
355
|
+
$stdout.reopen(@outfile, "w") unless @use_stdout
|
344
356
|
|
345
|
-
warn "Writing on #{outfile}." unless
|
357
|
+
warn "Writing on #{@outfile}." unless @use_stdout || @silent
|
346
358
|
puts output
|
347
359
|
end
|
348
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
|
+
|
368
|
+
private
|
369
|
+
|
349
370
|
# Asks for yes or no (y/n).
|
350
371
|
#
|
351
372
|
# +question+ - string to be printed
|
352
373
|
#
|
353
374
|
# Returns +true+ if the answer is yes.
|
354
|
-
def
|
375
|
+
def confirm(question)
|
355
376
|
loop do
|
356
377
|
$stderr.print "#{question} [y/n] "
|
357
|
-
reply = $stdin.gets.chomp.downcase # $stdin
|
358
|
-
return
|
359
|
-
|
378
|
+
reply = $stdin.gets.chomp.downcase # $stdin avoids gets/ARGV problem
|
379
|
+
return reply == "y" if reply.match?(/\A[yn]\z/)
|
380
|
+
|
360
381
|
warn "Please answer `y' or `n'."
|
361
382
|
end
|
362
383
|
end
|
363
384
|
|
364
385
|
# Prints an error message and exits.
|
365
|
-
def
|
386
|
+
def general_fail(message)
|
366
387
|
warn "#{PROGNAME}: #{message}"
|
367
388
|
exit ERRORCODE[:general]
|
368
389
|
end
|
369
390
|
|
370
391
|
# Prints an error message and a short help information, then exits.
|
371
|
-
def
|
392
|
+
def usage_fail(message)
|
372
393
|
warn "#{PROGNAME}: #{message}"
|
373
394
|
warn "Use `#{PROGNAME} --help' for valid options."
|
374
395
|
exit ERRORCODE[:usage]
|
375
396
|
end
|
376
|
-
|
377
|
-
# Tests silently whether the given system command is available.
|
378
|
-
#
|
379
|
-
# +command+ - command to test
|
380
|
-
def self.command_available?(command) # :nodoc:
|
381
|
-
!!system("#{command} >/dev/null 2>&1")
|
382
|
-
end
|
383
397
|
end
|
398
|
+
end
|
384
399
|
|
385
400
|
### call main method only if called on command line
|
386
401
|
|
387
|
-
if __FILE__ == $
|
388
|
-
Application.run!
|
389
|
-
end
|
390
|
-
|
391
|
-
end # module
|
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" "January
|
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,40 +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
|
-
s.rubyforge_project = 'pdfmult'
|
13
14
|
|
14
|
-
s.description =
|
15
|
-
|
16
|
-
|
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."
|
17
18
|
s.summary = "pdfmult - #{tagline}"
|
18
19
|
|
19
|
-
s.authors = [
|
20
|
-
s.email =
|
20
|
+
s.authors = ["Marcus Stollsteimer"]
|
21
|
+
s.email = "sto.mar@web.de"
|
21
22
|
s.homepage = homepage
|
22
23
|
|
23
|
-
s.license =
|
24
|
+
s.license = "GPL-3.0"
|
25
|
+
|
26
|
+
s.required_ruby_version = ">= 3.1.0"
|
27
|
+
|
28
|
+
s.requirements << "pdflatex and the pdfpages package"
|
24
29
|
|
25
|
-
s.
|
30
|
+
s.executables = ["pdfmult"]
|
31
|
+
s.bindir = "bin"
|
26
32
|
|
27
|
-
s.
|
28
|
-
s.bindir = 'bin'
|
29
|
-
s.require_path = 'lib'
|
30
|
-
s.test_files = Dir.glob('test/**/test_*.rb')
|
33
|
+
s.require_paths = ["lib"]
|
31
34
|
|
32
|
-
s.
|
35
|
+
s.test_files = Dir.glob("test/**/test_*.rb")
|
33
36
|
|
34
|
-
s.files =
|
37
|
+
s.files =
|
38
|
+
%w[
|
35
39
|
README.md
|
36
40
|
Rakefile
|
41
|
+
Gemfile
|
37
42
|
pdfmult.gemspec
|
38
43
|
pdfmult.h2m
|
39
|
-
|
40
|
-
Dir.glob(
|
41
|
-
Dir.glob(
|
44
|
+
] +
|
45
|
+
Dir.glob("example*.*") +
|
46
|
+
Dir.glob("{bin,lib,man,test}/**/*")
|
42
47
|
|
43
|
-
s.
|
44
|
-
s.add_development_dependency('minitest')
|
48
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
45
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,111 +1,68 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: pdfmult
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 3
|
9
|
-
- 1
|
10
|
-
version: 1.3.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.4.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Marcus Stollsteimer
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
name: rake
|
22
|
-
prerelease: false
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
-
none: false
|
25
|
-
requirements:
|
26
|
-
- - ">="
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 3
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
32
|
-
type: :development
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: minitest
|
36
|
-
prerelease: false
|
37
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
-
none: false
|
39
|
-
requirements:
|
40
|
-
- - ">="
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
hash: 3
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
46
|
-
type: :development
|
47
|
-
version_requirements: *id002
|
48
|
-
description: pdfmult is a command line tool that rearranges multiple copies of a PDF page (shrunken) on one page. It is a wrapper for pdflatex with the pdfpages package.
|
11
|
+
date: 2024-01-05 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: pdfmult is a command line tool that rearranges multiple copies of a PDF
|
14
|
+
page (shrunken) on one page. It is a wrapper for pdflatex with the pdfpages package.
|
49
15
|
email: sto.mar@web.de
|
50
|
-
executables:
|
16
|
+
executables:
|
51
17
|
- pdfmult
|
52
18
|
extensions: []
|
53
|
-
|
54
19
|
extra_rdoc_files: []
|
55
|
-
|
56
|
-
|
20
|
+
files:
|
21
|
+
- Gemfile
|
57
22
|
- README.md
|
58
23
|
- Rakefile
|
59
|
-
- pdfmult
|
60
|
-
- pdfmult.h2m
|
24
|
+
- bin/pdfmult
|
61
25
|
- example1.fig
|
62
26
|
- example1.png
|
63
27
|
- example2.fig
|
64
28
|
- example2.png
|
65
|
-
- bin/pdfmult
|
66
29
|
- lib/pdfmult.rb
|
67
30
|
- man/pdfmult.1
|
68
|
-
-
|
69
|
-
-
|
31
|
+
- pdfmult.gemspec
|
32
|
+
- pdfmult.h2m
|
33
|
+
- test/sample.pdf
|
70
34
|
- test/sample.tex
|
35
|
+
- test/test_latex_document.rb
|
71
36
|
- test/test_layout.rb
|
72
37
|
- test/test_optionparser.rb
|
73
|
-
- test/
|
38
|
+
- test/test_pdfinfo.rb
|
74
39
|
homepage: https://github.com/stomar/pdfmult/
|
75
|
-
licenses:
|
76
|
-
- GPL-3
|
40
|
+
licenses:
|
41
|
+
- GPL-3.0
|
42
|
+
metadata: {}
|
77
43
|
post_install_message:
|
78
|
-
rdoc_options:
|
79
|
-
- --charset=UTF-8
|
80
|
-
require_paths:
|
44
|
+
rdoc_options:
|
45
|
+
- "--charset=UTF-8"
|
46
|
+
require_paths:
|
81
47
|
- lib
|
82
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
-
|
84
|
-
requirements:
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
85
50
|
- - ">="
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
version: "0"
|
91
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
-
none: false
|
93
|
-
requirements:
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 3.1.0
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
94
55
|
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
|
97
|
-
|
98
|
-
- 0
|
99
|
-
version: "0"
|
100
|
-
requirements:
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements:
|
101
59
|
- pdflatex and the pdfpages package
|
102
|
-
|
103
|
-
rubygems_version: 1.8.24
|
60
|
+
rubygems_version: 3.5.3
|
104
61
|
signing_key:
|
105
|
-
specification_version:
|
62
|
+
specification_version: 4
|
106
63
|
summary: pdfmult - puts multiple copies of a PDF page on one page
|
107
|
-
test_files:
|
108
|
-
- test/test_pdfinfo.rb
|
64
|
+
test_files:
|
109
65
|
- test/test_latex_document.rb
|
110
66
|
- test/test_layout.rb
|
111
67
|
- test/test_optionparser.rb
|
68
|
+
- test/test_pdfinfo.rb
|