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.

Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +376 -0
  3. data/bin/automatic_pdf_title +7 -0
  4. data/bin/convert_markdown_to_pdf +7 -0
  5. data/bin/convert_pdf_to_text +7 -0
  6. data/bin/merge_then_open +7 -0
  7. data/bin/n_pages +10 -0
  8. data/bin/open_main_pdf +7 -0
  9. data/bin/pdf_paradise +7 -0
  10. data/bin/set_main_book +7 -0
  11. data/bin/set_title_of_this_pdf_file +15 -0
  12. data/doc/README.gen +348 -0
  13. data/doc/todo/todo.md +2 -0
  14. data/lib/pdf_paradise.rb +5 -0
  15. data/lib/pdf_paradise/base/base.rb +173 -0
  16. data/lib/pdf_paradise/commandline/help.rb +69 -0
  17. data/lib/pdf_paradise/commandline/menu.rb +160 -0
  18. data/lib/pdf_paradise/compress_this_pdf_file.rb +82 -0
  19. data/lib/pdf_paradise/constants/constants.rb +59 -0
  20. data/lib/pdf_paradise/convert_text_to_pdf.rb +94 -0
  21. data/lib/pdf_paradise/css/project.css +17 -0
  22. data/lib/pdf_paradise/djvu_to_pdf.rb +85 -0
  23. data/lib/pdf_paradise/gui/README.md +6 -0
  24. data/lib/pdf_paradise/gui/fox/split_pdf_file.rb +77 -0
  25. 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
  26. data/lib/pdf_paradise/gui/gtk2/pdf_viewer/pdf_viewer.rb +34 -0
  27. data/lib/pdf_paradise/gui/gtk2/split_pdf_file/split_pdf_file.rb +34 -0
  28. data/lib/pdf_paradise/gui/gtk2/statistics_widget/statistics_widget.rb +34 -0
  29. data/lib/pdf_paradise/gui/gtk2/to_pdf/to_pdf.rb +32 -0
  30. data/lib/pdf_paradise/gui/gtk3/controller/controller.rb +197 -0
  31. data/lib/pdf_paradise/gui/gtk3/convert_pdf_to_text/convert_pdf_to_text.rb +34 -0
  32. 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
  33. data/lib/pdf_paradise/gui/gtk3/pdf_viewer/pdf_viewer.rb +34 -0
  34. data/lib/pdf_paradise/gui/gtk3/split_pdf_file/split_pdf_file.rb +34 -0
  35. data/lib/pdf_paradise/gui/gtk3/statistics_widget/statistics_widget.rb +34 -0
  36. data/lib/pdf_paradise/gui/gtk3/to_pdf/to_pdf.rb +32 -0
  37. data/lib/pdf_paradise/gui/shared_code/convert_pdf_to_text/convert_pdf_to_text_module.rb +277 -0
  38. 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
  39. data/lib/pdf_paradise/gui/shared_code/pdf_viewer/pdf_viewer.css +5 -0
  40. data/lib/pdf_paradise/gui/shared_code/pdf_viewer/pdf_viewer_module.rb +284 -0
  41. data/lib/pdf_paradise/gui/shared_code/split_pdf_file/split_pdf_file.css +0 -0
  42. data/lib/pdf_paradise/gui/shared_code/split_pdf_file/split_pdf_file_module.rb +294 -0
  43. data/lib/pdf_paradise/gui/shared_code/statistics_widget/statistics_widget_module.rb +333 -0
  44. data/lib/pdf_paradise/gui/shared_code/to_pdf/to_pdf_module.rb +273 -0
  45. data/lib/pdf_paradise/main_pdf/main_pdf.rb +437 -0
  46. data/lib/pdf_paradise/merge_pdf/menu.rb +63 -0
  47. data/lib/pdf_paradise/merge_pdf/merge_pdf.rb +292 -0
  48. data/lib/pdf_paradise/merge_pdf_namespace.rb +9 -0
  49. data/lib/pdf_paradise/merge_then_open/merge_then_open.rb +105 -0
  50. data/lib/pdf_paradise/pdf_file_n_total_pages.rb +227 -0
  51. data/lib/pdf_paradise/project/project_base_directory.rb +22 -0
  52. data/lib/pdf_paradise/remove_pdf_password.rb +392 -0
  53. data/lib/pdf_paradise/requires/batch_require_toplevel_files.rb +22 -0
  54. data/lib/pdf_paradise/requires/colours.rb +7 -0
  55. data/lib/pdf_paradise/requires/colours_and_esystem_and_save_file_and_fileutils_and_opn.rb +11 -0
  56. data/lib/pdf_paradise/requires/esystem_and_colours.rb +10 -0
  57. data/lib/pdf_paradise/requires/esystem_and_opn_and_colours.rb +8 -0
  58. data/lib/pdf_paradise/requires/require_the_whole_project.rb +25 -0
  59. data/lib/pdf_paradise/requires/require_utility_scripts.rb +7 -0
  60. data/lib/pdf_paradise/rotate_pdf_file.rb +144 -0
  61. data/lib/pdf_paradise/set_main_book.rb +156 -0
  62. data/lib/pdf_paradise/set_pdf_title.rb +218 -0
  63. data/lib/pdf_paradise/sinatra/embeddable_interface.rb +315 -0
  64. data/lib/pdf_paradise/toplevel_methods/automatic_pdf_title.rb +55 -0
  65. data/lib/pdf_paradise/toplevel_methods/convert_epub_to_pdf.rb +27 -0
  66. data/lib/pdf_paradise/toplevel_methods/convert_markdown_to_pdf.rb +43 -0
  67. data/lib/pdf_paradise/toplevel_methods/convert_ppt_to_pdf.rb +35 -0
  68. data/lib/pdf_paradise/toplevel_methods/e.rb +16 -0
  69. data/lib/pdf_paradise/toplevel_methods/esystem.rb +19 -0
  70. data/lib/pdf_paradise/toplevel_methods/misc.rb +52 -0
  71. data/lib/pdf_paradise/toplevel_methods/number_pages.rb +38 -0
  72. data/lib/pdf_paradise/toplevel_methods/opened_pdf_files.rb +191 -0
  73. data/lib/pdf_paradise/toplevel_methods/query_pdf_title.rb +182 -0
  74. data/lib/pdf_paradise/toplevel_methods/reduce_size_of_this_pdf_file.rb +43 -0
  75. data/lib/pdf_paradise/toplevel_methods/roebe.rb +17 -0
  76. data/lib/pdf_paradise/toplevel_methods/to_pdf.rb +38 -0
  77. data/lib/pdf_paradise/utility_scripts/README.md +3 -0
  78. data/lib/pdf_paradise/utility_scripts/convert_pdf_to_text.rb +166 -0
  79. data/lib/pdf_paradise/utility_scripts/delete_first_page_of_this_pdf_file.rb +185 -0
  80. data/lib/pdf_paradise/utility_scripts/delete_last_page_of_this_pdf_file.rb +180 -0
  81. data/lib/pdf_paradise/utility_scripts/delete_this_page_of_this_pdf_file.rb +310 -0
  82. data/lib/pdf_paradise/utility_scripts/extract_pdf_page.rb +280 -0
  83. data/lib/pdf_paradise/utility_scripts/pdf_optimizer.rb +113 -0
  84. data/lib/pdf_paradise/utility_scripts/pdf_statistics.rb +150 -0
  85. data/lib/pdf_paradise/utility_scripts/remove_images.rb +110 -0
  86. data/lib/pdf_paradise/utility_scripts/split_pdf.rb +294 -0
  87. data/lib/pdf_paradise/utility_scripts/to_qdf.rb +82 -0
  88. data/lib/pdf_paradise/version/version.rb +19 -0
  89. data/lib/pdf_paradise/www/README.md +2 -0
  90. data/lib/pdf_paradise/www/sinatra/app.rb +276 -0
  91. data/pdf_paradise.gemspec +64 -0
  92. data/test/testing_pdf_paradise.rb +9 -0
  93. 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