pdf_paradise 0.1.43
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of pdf_paradise might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/README.md +376 -0
- data/bin/automatic_pdf_title +7 -0
- data/bin/convert_markdown_to_pdf +7 -0
- data/bin/convert_pdf_to_text +7 -0
- data/bin/merge_then_open +7 -0
- data/bin/n_pages +10 -0
- data/bin/open_main_pdf +7 -0
- data/bin/pdf_paradise +7 -0
- data/bin/set_main_book +7 -0
- data/bin/set_title_of_this_pdf_file +15 -0
- data/doc/README.gen +348 -0
- data/doc/todo/todo.md +2 -0
- data/lib/pdf_paradise.rb +5 -0
- data/lib/pdf_paradise/base/base.rb +173 -0
- data/lib/pdf_paradise/commandline/help.rb +69 -0
- data/lib/pdf_paradise/commandline/menu.rb +160 -0
- data/lib/pdf_paradise/compress_this_pdf_file.rb +82 -0
- data/lib/pdf_paradise/constants/constants.rb +59 -0
- data/lib/pdf_paradise/convert_text_to_pdf.rb +94 -0
- data/lib/pdf_paradise/css/project.css +17 -0
- data/lib/pdf_paradise/djvu_to_pdf.rb +85 -0
- data/lib/pdf_paradise/gui/README.md +6 -0
- data/lib/pdf_paradise/gui/fox/split_pdf_file.rb +77 -0
- data/lib/pdf_paradise/gui/gtk2/delete_the_first_or_the_last_page_of_this_pdf_file/delete_the_first_or_the_last_page_of_this_pdf_file.rb +39 -0
- data/lib/pdf_paradise/gui/gtk2/pdf_viewer/pdf_viewer.rb +34 -0
- data/lib/pdf_paradise/gui/gtk2/split_pdf_file/split_pdf_file.rb +34 -0
- data/lib/pdf_paradise/gui/gtk2/statistics_widget/statistics_widget.rb +34 -0
- data/lib/pdf_paradise/gui/gtk2/to_pdf/to_pdf.rb +32 -0
- data/lib/pdf_paradise/gui/gtk3/controller/controller.rb +197 -0
- data/lib/pdf_paradise/gui/gtk3/convert_pdf_to_text/convert_pdf_to_text.rb +34 -0
- data/lib/pdf_paradise/gui/gtk3/delete_the_first_or_the_last_page_of_this_pdf_file/delete_the_first_or_the_last_page_of_this_pdf_file.rb +39 -0
- data/lib/pdf_paradise/gui/gtk3/pdf_viewer/pdf_viewer.rb +34 -0
- data/lib/pdf_paradise/gui/gtk3/split_pdf_file/split_pdf_file.rb +34 -0
- data/lib/pdf_paradise/gui/gtk3/statistics_widget/statistics_widget.rb +34 -0
- data/lib/pdf_paradise/gui/gtk3/to_pdf/to_pdf.rb +32 -0
- data/lib/pdf_paradise/gui/shared_code/convert_pdf_to_text/convert_pdf_to_text_module.rb +277 -0
- data/lib/pdf_paradise/gui/shared_code/delete_the_first_or_the_last_page_of_this_pdf_file/delete_the_first_or_the_last_page_of_this_pdf_file_module.rb +428 -0
- data/lib/pdf_paradise/gui/shared_code/pdf_viewer/pdf_viewer.css +5 -0
- data/lib/pdf_paradise/gui/shared_code/pdf_viewer/pdf_viewer_module.rb +284 -0
- data/lib/pdf_paradise/gui/shared_code/split_pdf_file/split_pdf_file.css +0 -0
- data/lib/pdf_paradise/gui/shared_code/split_pdf_file/split_pdf_file_module.rb +294 -0
- data/lib/pdf_paradise/gui/shared_code/statistics_widget/statistics_widget_module.rb +333 -0
- data/lib/pdf_paradise/gui/shared_code/to_pdf/to_pdf_module.rb +273 -0
- data/lib/pdf_paradise/main_pdf/main_pdf.rb +437 -0
- data/lib/pdf_paradise/merge_pdf/menu.rb +63 -0
- data/lib/pdf_paradise/merge_pdf/merge_pdf.rb +292 -0
- data/lib/pdf_paradise/merge_pdf_namespace.rb +9 -0
- data/lib/pdf_paradise/merge_then_open/merge_then_open.rb +105 -0
- data/lib/pdf_paradise/pdf_file_n_total_pages.rb +227 -0
- data/lib/pdf_paradise/project/project_base_directory.rb +22 -0
- data/lib/pdf_paradise/remove_pdf_password.rb +392 -0
- data/lib/pdf_paradise/requires/batch_require_toplevel_files.rb +22 -0
- data/lib/pdf_paradise/requires/colours.rb +7 -0
- data/lib/pdf_paradise/requires/colours_and_esystem_and_save_file_and_fileutils_and_opn.rb +11 -0
- data/lib/pdf_paradise/requires/esystem_and_colours.rb +10 -0
- data/lib/pdf_paradise/requires/esystem_and_opn_and_colours.rb +8 -0
- data/lib/pdf_paradise/requires/require_the_whole_project.rb +25 -0
- data/lib/pdf_paradise/requires/require_utility_scripts.rb +7 -0
- data/lib/pdf_paradise/rotate_pdf_file.rb +144 -0
- data/lib/pdf_paradise/set_main_book.rb +156 -0
- data/lib/pdf_paradise/set_pdf_title.rb +218 -0
- data/lib/pdf_paradise/sinatra/embeddable_interface.rb +315 -0
- data/lib/pdf_paradise/toplevel_methods/automatic_pdf_title.rb +55 -0
- data/lib/pdf_paradise/toplevel_methods/convert_epub_to_pdf.rb +27 -0
- data/lib/pdf_paradise/toplevel_methods/convert_markdown_to_pdf.rb +43 -0
- data/lib/pdf_paradise/toplevel_methods/convert_ppt_to_pdf.rb +35 -0
- data/lib/pdf_paradise/toplevel_methods/e.rb +16 -0
- data/lib/pdf_paradise/toplevel_methods/esystem.rb +19 -0
- data/lib/pdf_paradise/toplevel_methods/misc.rb +52 -0
- data/lib/pdf_paradise/toplevel_methods/number_pages.rb +38 -0
- data/lib/pdf_paradise/toplevel_methods/opened_pdf_files.rb +191 -0
- data/lib/pdf_paradise/toplevel_methods/query_pdf_title.rb +182 -0
- data/lib/pdf_paradise/toplevel_methods/reduce_size_of_this_pdf_file.rb +43 -0
- data/lib/pdf_paradise/toplevel_methods/roebe.rb +17 -0
- data/lib/pdf_paradise/toplevel_methods/to_pdf.rb +38 -0
- data/lib/pdf_paradise/utility_scripts/README.md +3 -0
- data/lib/pdf_paradise/utility_scripts/convert_pdf_to_text.rb +166 -0
- data/lib/pdf_paradise/utility_scripts/delete_first_page_of_this_pdf_file.rb +185 -0
- data/lib/pdf_paradise/utility_scripts/delete_last_page_of_this_pdf_file.rb +180 -0
- data/lib/pdf_paradise/utility_scripts/delete_this_page_of_this_pdf_file.rb +310 -0
- data/lib/pdf_paradise/utility_scripts/extract_pdf_page.rb +280 -0
- data/lib/pdf_paradise/utility_scripts/pdf_optimizer.rb +113 -0
- data/lib/pdf_paradise/utility_scripts/pdf_statistics.rb +150 -0
- data/lib/pdf_paradise/utility_scripts/remove_images.rb +110 -0
- data/lib/pdf_paradise/utility_scripts/split_pdf.rb +294 -0
- data/lib/pdf_paradise/utility_scripts/to_qdf.rb +82 -0
- data/lib/pdf_paradise/version/version.rb +19 -0
- data/lib/pdf_paradise/www/README.md +2 -0
- data/lib/pdf_paradise/www/sinatra/app.rb +276 -0
- data/pdf_paradise.gemspec +64 -0
- data/test/testing_pdf_paradise.rb +9 -0
- metadata +216 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# require 'pdf_paradise/toplevel_methods/e.rb'
|
6
|
+
# =========================================================================== #
|
7
|
+
module PdfParadise
|
8
|
+
|
9
|
+
# ========================================================================= #
|
10
|
+
# === PdfParadise.e
|
11
|
+
# ========================================================================= #
|
12
|
+
def self.e(i = '')
|
13
|
+
puts i
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# require 'pdf_paradise/toplevel_methods/esystem.rb'
|
6
|
+
# =========================================================================== #
|
7
|
+
module PdfParadise
|
8
|
+
|
9
|
+
require 'pdf_paradise/toplevel_methods/e.rb'
|
10
|
+
|
11
|
+
# ========================================================================= #
|
12
|
+
# === PdfParadise.esystem
|
13
|
+
# ========================================================================= #
|
14
|
+
def self.esystem(i)
|
15
|
+
e i
|
16
|
+
system i
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# require 'pdf_paradise/toplevel_methods/misc.rb'
|
6
|
+
# =========================================================================== #
|
7
|
+
module PdfParadise
|
8
|
+
|
9
|
+
require 'pdf_paradise/toplevel_methods/esystem.rb'
|
10
|
+
require 'pdf_paradise/requires/colours.rb'
|
11
|
+
|
12
|
+
# ========================================================================= #
|
13
|
+
# === PdfParadise.report_which_pdf_viewer_is_in_use
|
14
|
+
#
|
15
|
+
# This method will simply report which pdf-viewer is in use.
|
16
|
+
# ========================================================================= #
|
17
|
+
def self.report_which_pdf_viewer_is_in_use
|
18
|
+
e "#{Colours.rev}The current pdf-viewer in use is "\
|
19
|
+
"#{Colours.sfancy(PdfParadise.pdf_viewer?)}."
|
20
|
+
end
|
21
|
+
|
22
|
+
# ========================================================================= #
|
23
|
+
# === PdfParadise.convert_this_pdf_file_into_a_png_file
|
24
|
+
# ========================================================================= #
|
25
|
+
def self.convert_this_pdf_file_into_a_png_file(
|
26
|
+
this_pdf_file
|
27
|
+
)
|
28
|
+
_ = 'gs -dNOPAUSE -q -r300 -sPAPERSIZE=a4 -dTextAlphaBits=4 -dDownScaleFactor=3 '.dup
|
29
|
+
_ << '-dGraphicsAlphaBits=4 -dUseTrimBox -sDEVICE=png16m -dBATCH '
|
30
|
+
_ << '-sOutputFile="C:\ingrid\pdf\outputfile%d.png" '
|
31
|
+
_ << '-c \"30000000 setvmthreshold\" '
|
32
|
+
_ << '-f "'+this_pdf_file+'" '
|
33
|
+
esystem _
|
34
|
+
end
|
35
|
+
|
36
|
+
# ========================================================================= #
|
37
|
+
# === PdfParadise.convert_postscript_to_pdf
|
38
|
+
#
|
39
|
+
# This method will convert a postscript-file into a .pdf file.
|
40
|
+
# ========================================================================= #
|
41
|
+
def self.convert_postscript_to_pdf(
|
42
|
+
i = 'filein.ps'
|
43
|
+
)
|
44
|
+
_ = 'gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=fileout.pdf '+i
|
45
|
+
esystem(_)
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
if __FILE__ == $PROGRAM_NAME
|
51
|
+
PdfParadise.convert_postscript_to_pdf(ARGV)
|
52
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# require 'pdf_paradise/toplevel_methods/number_pages.rb'
|
6
|
+
# =========================================================================== #
|
7
|
+
module PdfParadise
|
8
|
+
|
9
|
+
require 'pdf_paradise/toplevel_methods/e.rb'
|
10
|
+
|
11
|
+
# ========================================================================= #
|
12
|
+
# === PdfParadise.number_pages
|
13
|
+
# ========================================================================= #
|
14
|
+
def self.number_pages(*these_pdf_files)
|
15
|
+
begin
|
16
|
+
require 'combine_pdf'
|
17
|
+
rescue LoadError; end
|
18
|
+
use_this_font_size = 30
|
19
|
+
these_pdf_files.flatten.each {|this_pdf_file|
|
20
|
+
pdf = CombinePDF.load(this_pdf_file)
|
21
|
+
pdf.number_pages(
|
22
|
+
location: :bottom_right,
|
23
|
+
font_size: use_this_font_size,
|
24
|
+
number_format: ' %s ',
|
25
|
+
margin_from_height: 5, # The default here is 45 normally.
|
26
|
+
margin_from_side: 10 # The default here is 15 normally.
|
27
|
+
)
|
28
|
+
store_into = this_pdf_file.sub(/\.pdf$/,'')+'_numbered.pdf'
|
29
|
+
e "Storing into #{store_into}"
|
30
|
+
pdf.save store_into
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
if __FILE__ == $PROGRAM_NAME
|
37
|
+
PdfParadise.number_pages(ARGV)
|
38
|
+
end # numberpages
|
@@ -0,0 +1,191 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# Code in this file can:
|
6
|
+
#
|
7
|
+
# (a) return all opened .pdf files
|
8
|
+
# (b) store all opened .pdf files in a local file.
|
9
|
+
#
|
10
|
+
# =========================================================================== #
|
11
|
+
# require 'pdf_paradise/toplevel_methods/opened_pdf_files.rb'
|
12
|
+
# =========================================================================== #
|
13
|
+
module PdfParadise
|
14
|
+
|
15
|
+
require 'pdf_paradise/requires/colours.rb'
|
16
|
+
require 'pdf_paradise/constants/constants.rb'
|
17
|
+
require 'pdf_paradise/toplevel_methods/e.rb'
|
18
|
+
require 'pdf_paradise/toplevel_methods/esystem.rb'
|
19
|
+
require 'pdf_paradise/toplevel_methods/roebe.rb'
|
20
|
+
|
21
|
+
# ========================================================================= #
|
22
|
+
# === PdfParadise.return_array_of_all_currently_opened_pdf_files
|
23
|
+
#
|
24
|
+
# To view this array on the commandline, do:
|
25
|
+
#
|
26
|
+
# pdf_paradise --array-all-currently-opened-pdf-files
|
27
|
+
#
|
28
|
+
# The second argument is a bit buggy and slow, so I disabled it as
|
29
|
+
# of 27.12.2018. It may be re-enabled at a later time (or removed
|
30
|
+
# altogether).
|
31
|
+
# ========================================================================= #
|
32
|
+
def self.return_array_of_all_currently_opened_pdf_files(
|
33
|
+
also_run_locate = false
|
34
|
+
)
|
35
|
+
case also_run_locate
|
36
|
+
when :do_not_run_locate
|
37
|
+
also_run_locate = false
|
38
|
+
end
|
39
|
+
array = `ps ax`.split("\n").select {|line|
|
40
|
+
line.include? '.pdf'
|
41
|
+
}.map {|inner_liner|
|
42
|
+
# ===================================================================== #
|
43
|
+
# A line here may look like this:
|
44
|
+
# 10970 pts/25 Sl 0:38 evince DONE_MolBiol_?bungen_SS2017_Transfection_english_060220.pdf
|
45
|
+
# For now we split on ' ' and just use the last part.
|
46
|
+
# ===================================================================== #
|
47
|
+
inner_line = inner_liner.split(' ').last.strip
|
48
|
+
# ===================================================================== #
|
49
|
+
# We will also try to locate the file, via "locate". This functionality
|
50
|
+
# depends on findutils' "locate" binary and a prior run of "updatedb".
|
51
|
+
# ===================================================================== #
|
52
|
+
if also_run_locate
|
53
|
+
result = `locate #{inner_line} 2>&1`.strip
|
54
|
+
inner_line = result if result and result.include? inner_line
|
55
|
+
if inner_line.include?('?') and !File.exist?(inner_line)
|
56
|
+
inner_line.tr!('?','ä')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
inner_line
|
60
|
+
}
|
61
|
+
return array
|
62
|
+
end
|
63
|
+
|
64
|
+
# ========================================================================= #
|
65
|
+
# === PdfParadise.open_last_opened_pdf_files (open tag)
|
66
|
+
#
|
67
|
+
# This method will try to open all the last opened .pdf files. This
|
68
|
+
# functionality depends on having stored these .pdf files in a local
|
69
|
+
# file, which presently has to be done manually (e. g. via the
|
70
|
+
# commandline) rather than automatically.
|
71
|
+
#
|
72
|
+
# Invocation example:
|
73
|
+
#
|
74
|
+
# pdfparadise --open-last-pdf-files
|
75
|
+
#
|
76
|
+
# ========================================================================= #
|
77
|
+
def self.open_last_opened_pdf_files
|
78
|
+
pdf_viewer_to_use = PdfParadise.pdf_viewer?
|
79
|
+
_ = FILE_ALL_CURRENTLY_OPENED_PDF_FILES
|
80
|
+
if File.exist? _
|
81
|
+
dataset = YAML.load_file(_)
|
82
|
+
dataset.each {|this_pdf_file|
|
83
|
+
if File.exist? this_pdf_file
|
84
|
+
esystem pdf_viewer_to_use+' "'+this_pdf_file+'" &'
|
85
|
+
else
|
86
|
+
e "No file exists at `#{::Colours.sfile(this_pdf_file)}`."
|
87
|
+
end
|
88
|
+
}
|
89
|
+
else
|
90
|
+
e 'No file exists at `'+sfile(_)+'`.'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# ========================================================================= #
|
95
|
+
# === PdfParadise.show_last_opened_pdf_files
|
96
|
+
# ========================================================================= #
|
97
|
+
def self.show_last_opened_pdf_files
|
98
|
+
_ = FILE_ALL_CURRENTLY_OPENED_PDF_FILES
|
99
|
+
if File.exist? _
|
100
|
+
dataset = YAML.load_file(_)
|
101
|
+
if dataset.empty?
|
102
|
+
e 'No .pdf files have been registered as having been opened.'
|
103
|
+
else
|
104
|
+
e 'The following .pdf files have been opened:'
|
105
|
+
e
|
106
|
+
dataset.each {|this_pdf_file| e " #{Colours.sfile(this_pdf_file)}" }
|
107
|
+
e
|
108
|
+
end
|
109
|
+
else
|
110
|
+
e 'No file exists at `'+_+'`.'
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# ========================================================================= #
|
115
|
+
# === PdfParadise.file_all_currently_opened_pdf_files?
|
116
|
+
# ========================================================================= #
|
117
|
+
def self.file_all_currently_opened_pdf_files?
|
118
|
+
FILE_ALL_CURRENTLY_OPENED_PDF_FILES
|
119
|
+
end
|
120
|
+
|
121
|
+
# ========================================================================= #
|
122
|
+
# === PdfParadise.store_all_currently_opened_pdf_files
|
123
|
+
#
|
124
|
+
# To invoke this method from the commandline, do:
|
125
|
+
#
|
126
|
+
# pdfparadise --store-open-pdf-files
|
127
|
+
#
|
128
|
+
# ========================================================================= #
|
129
|
+
def self.store_all_currently_opened_pdf_files
|
130
|
+
begin
|
131
|
+
require 'save_file'
|
132
|
+
rescue LoadError; end
|
133
|
+
array = return_array_of_all_currently_opened_pdf_files
|
134
|
+
if array.empty?
|
135
|
+
e 'No .pdf file is currently empty.'
|
136
|
+
else
|
137
|
+
# ===================================================================== #
|
138
|
+
# Designate where to store the open .pdf files.
|
139
|
+
# ===================================================================== #
|
140
|
+
into = FILE_ALL_CURRENTLY_OPENED_PDF_FILES
|
141
|
+
e 'All currently opened .pdf files will be stored into the file'
|
142
|
+
e
|
143
|
+
e " `#{Colours.sfile(into)}`."
|
144
|
+
e
|
145
|
+
e 'These are the .pdf files that will be stored:'
|
146
|
+
e
|
147
|
+
array.each {|this_file|
|
148
|
+
e " #{Colours.sfile(this_file)}"
|
149
|
+
}
|
150
|
+
e
|
151
|
+
what = YAML.dump(array)
|
152
|
+
SaveFile.write_what_into(what, into)
|
153
|
+
if is_on_roebe?
|
154
|
+
update_main_pdf_entries(array)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end; self.instance_eval { alias store_all_currently_open_pdf_files store_all_currently_opened_pdf_files } # === PdfParadise.store_all_currently_open_pdf_files
|
158
|
+
self.instance_eval { alias save_open_pdf_files store_all_currently_opened_pdf_files } # === PdfParadise.save_open_pdf_files
|
159
|
+
|
160
|
+
# ========================================================================= #
|
161
|
+
# === PdfParadise.update_main_pdf_entries
|
162
|
+
#
|
163
|
+
# This method will update entries for e. g. openpdf1, openpdf2 and
|
164
|
+
# so forth.
|
165
|
+
# ========================================================================= #
|
166
|
+
def self.update_main_pdf_entries(
|
167
|
+
use_this_array = :try_to_use_the_main_file
|
168
|
+
)
|
169
|
+
begin
|
170
|
+
require 'roebe/classes/open_pdf.rb'
|
171
|
+
rescue LoadError; end
|
172
|
+
unless use_this_array.is_a? Array
|
173
|
+
case use_this_array
|
174
|
+
when :try_to_use_the_main_file
|
175
|
+
_ = file_all_currently_opened_pdf_files?
|
176
|
+
if File.exist? _
|
177
|
+
use_this_array = File.readlines(_).map(&:strip)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
use_this_array.each_with_index {|pdf_location, pdf_number_to_use| pdf_number_to_use += 1
|
182
|
+
Roebe.set_pdf_for_this_number(pdf_number_to_use, pdf_location)
|
183
|
+
}
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
if __FILE__ == $PROGRAM_NAME
|
189
|
+
pp PdfParadise.return_array_of_all_currently_opened_pdf_files
|
190
|
+
PdfParadise.store_all_currently_opened_pdf_files
|
191
|
+
end # opened_pdf_files
|
@@ -0,0 +1,182 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# === PdfParadise::QueryPdfTitle
|
6
|
+
#
|
7
|
+
# This class will simply report the title of a .pdf file (or more accurately,
|
8
|
+
# all .pdf files that were passed to this class).
|
9
|
+
#
|
10
|
+
# Presently this depends on exiftool, but there are other ways how to
|
11
|
+
# query the title of a .pdf file, such as via prawn.
|
12
|
+
#
|
13
|
+
# However had, for the time being, we will depend on exiftool.
|
14
|
+
#
|
15
|
+
# The shell-invocation command for this would be:
|
16
|
+
#
|
17
|
+
# exiftool *.pdf | grep Title
|
18
|
+
#
|
19
|
+
# Usage example:
|
20
|
+
#
|
21
|
+
# PdfParadise::QueryPdfTitle.new(ARGV)
|
22
|
+
#
|
23
|
+
# =========================================================================== #
|
24
|
+
# require 'pdf_paradise/toplevel_methods/query_pdf_title.rb'
|
25
|
+
# =========================================================================== #
|
26
|
+
require 'pdf_paradise/base/base.rb'
|
27
|
+
|
28
|
+
module PdfParadise
|
29
|
+
|
30
|
+
class QueryPdfTitle < Base # === PdfParadise::QueryPdfTitle
|
31
|
+
|
32
|
+
# ========================================================================= #
|
33
|
+
# === initialize
|
34
|
+
# ========================================================================= #
|
35
|
+
def initialize(
|
36
|
+
i = nil,
|
37
|
+
run_already = true
|
38
|
+
)
|
39
|
+
reset
|
40
|
+
set_input(i)
|
41
|
+
if block_given?
|
42
|
+
yielded = yield
|
43
|
+
case yielded
|
44
|
+
when :be_verbose
|
45
|
+
@be_verbose = true
|
46
|
+
when :be_quiet
|
47
|
+
@be_verbose = false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
run if run_already
|
51
|
+
end
|
52
|
+
|
53
|
+
# ========================================================================= #
|
54
|
+
# === reset (reset tag)
|
55
|
+
# ========================================================================= #
|
56
|
+
def reset
|
57
|
+
super()
|
58
|
+
# ======================================================================= #
|
59
|
+
# === @be_verbose
|
60
|
+
# ======================================================================= #
|
61
|
+
@be_verbose = true
|
62
|
+
end
|
63
|
+
|
64
|
+
# ========================================================================= #
|
65
|
+
# === set_input
|
66
|
+
# ========================================================================= #
|
67
|
+
def set_input(i = '')
|
68
|
+
i = [i] unless i.is_a? Array
|
69
|
+
@input = i
|
70
|
+
end
|
71
|
+
|
72
|
+
# ========================================================================= #
|
73
|
+
# === input?
|
74
|
+
# ========================================================================= #
|
75
|
+
def input?
|
76
|
+
@input
|
77
|
+
end; alias pdf_files? input? # === pdf_files?
|
78
|
+
|
79
|
+
# ========================================================================= #
|
80
|
+
# === iterate_over_the_input_files
|
81
|
+
# ========================================================================= #
|
82
|
+
def iterate_over_the_input_files
|
83
|
+
use_this_regex = /^Title\s*: (.+)$/
|
84
|
+
pdf_files?.each {|this_pdf_file|
|
85
|
+
if File.exist? this_pdf_file
|
86
|
+
sys_cmd = `exiftool #{this_pdf_file}`
|
87
|
+
begin
|
88
|
+
@title = sys_cmd.scan(use_this_regex).flatten.first
|
89
|
+
rescue ArgumentError => error
|
90
|
+
e 'An error happened for '+sfile(this_pdf_file)+'.'
|
91
|
+
pp error
|
92
|
+
pp error.class
|
93
|
+
exit
|
94
|
+
end
|
95
|
+
if @be_verbose
|
96
|
+
e "The title for `#{sfile(this_pdf_file)}` is:"
|
97
|
+
e
|
98
|
+
e " #{sfancy(@title)}"
|
99
|
+
e
|
100
|
+
end
|
101
|
+
else
|
102
|
+
e "No file exists at `#{sfile(this_pdf_file)}`."
|
103
|
+
end
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
# ========================================================================= #
|
108
|
+
# === title?
|
109
|
+
# ========================================================================= #
|
110
|
+
def title?
|
111
|
+
@title
|
112
|
+
end
|
113
|
+
|
114
|
+
# ========================================================================= #
|
115
|
+
# === string?
|
116
|
+
#
|
117
|
+
# This variant will always return a String - an empty String if the .pdf
|
118
|
+
# file has no title set.
|
119
|
+
# ========================================================================= #
|
120
|
+
def string?
|
121
|
+
title?.to_s
|
122
|
+
end
|
123
|
+
|
124
|
+
# ========================================================================= #
|
125
|
+
# === run (run tag)
|
126
|
+
# ========================================================================= #
|
127
|
+
def run
|
128
|
+
iterate_over_the_input_files
|
129
|
+
end
|
130
|
+
|
131
|
+
# ========================================================================= #
|
132
|
+
# === PdfParadise::QueryPdfTitle[]
|
133
|
+
# ========================================================================= #
|
134
|
+
def self.[](i = '')
|
135
|
+
self.new(i)
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
# =========================================================================== #
|
141
|
+
# === PdfParadise.does_this_pdf_file_have_a_title?
|
142
|
+
#
|
143
|
+
# This method can be used to query whether a given .pdf file has a title
|
144
|
+
# or whether it does not.
|
145
|
+
#
|
146
|
+
# Usage example:
|
147
|
+
#
|
148
|
+
# PdfParadise.does_this_pdf_file_have_a_title? "foobar.pdf" # => true
|
149
|
+
#
|
150
|
+
# =========================================================================== #
|
151
|
+
def self.does_this_pdf_file_have_a_title?(i)
|
152
|
+
!query_pdf_title(i).empty?
|
153
|
+
end
|
154
|
+
|
155
|
+
# =========================================================================== #
|
156
|
+
# === PdfParadise.pdf_has_no_title?
|
157
|
+
# =========================================================================== #
|
158
|
+
def self.pdf_has_no_title?(i)
|
159
|
+
!does_this_pdf_file_have_a_title?(i)
|
160
|
+
end
|
161
|
+
|
162
|
+
# =========================================================================== #
|
163
|
+
# === PdfParadise.query_pdf_title
|
164
|
+
#
|
165
|
+
# The input to this method should be an existing .pdf file.
|
166
|
+
#
|
167
|
+
# Usage example:
|
168
|
+
#
|
169
|
+
# title = PdfParadise.query_pdf_title('/foobar.pdf') # => "Lecture 2 - Scaling"
|
170
|
+
#
|
171
|
+
# =========================================================================== #
|
172
|
+
def self.query_pdf_title(i)
|
173
|
+
PdfParadise::QueryPdfTitle.new(i) { :be_quiet }.string?
|
174
|
+
end; self.instance_eval { alias return_pdf_title_of query_pdf_title } # === PdfParadise.return_pdf_title
|
175
|
+
self.instance_eval { alias return_title_of_this_pdf_file query_pdf_title } # === PdfParadise.return_title_of_this_pdf_file
|
176
|
+
self.instance_eval { alias title? query_pdf_title } # === PdfParadise.title?
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
if __FILE__ == $PROGRAM_NAME
|
181
|
+
PdfParadise::QueryPdfTitle.new(ARGV)
|
182
|
+
end # querypdftitle
|