pdf_paradise 0.1.66

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 (110) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +705 -0
  3. data/bin/automatic_pdf_title +7 -0
  4. data/bin/combine_these_pdf_pages +7 -0
  5. data/bin/compress_via_hexapdf +7 -0
  6. data/bin/convert_markdown_to_pdf +7 -0
  7. data/bin/convert_pdf_to_text +7 -0
  8. data/bin/delete_first_page_of_this_pdf_file +7 -0
  9. data/bin/merge_then_open +7 -0
  10. data/bin/n_pages +10 -0
  11. data/bin/open_main_pdf +7 -0
  12. data/bin/pdf_paradise +9 -0
  13. data/bin/set_main_book +7 -0
  14. data/bin/set_title_of_this_pdf_file +15 -0
  15. data/doc/README.gen +662 -0
  16. data/doc/todo/todo.md +7 -0
  17. data/lib/pdf_paradise/base/base.rb +239 -0
  18. data/lib/pdf_paradise/base/colours.rb +36 -0
  19. data/lib/pdf_paradise/commandline/commandline.rb +101 -0
  20. data/lib/pdf_paradise/commandline/help.rb +73 -0
  21. data/lib/pdf_paradise/commandline/menu.rb +142 -0
  22. data/lib/pdf_paradise/compress/compress_via_hexapdf.rb +27 -0
  23. data/lib/pdf_paradise/compress_this_pdf_file.rb +87 -0
  24. data/lib/pdf_paradise/constants/constants.rb +76 -0
  25. data/lib/pdf_paradise/convert_text_to_pdf.rb +94 -0
  26. data/lib/pdf_paradise/css/project.css +17 -0
  27. data/lib/pdf_paradise/djvu_to_pdf.rb +85 -0
  28. data/lib/pdf_paradise/gui/README.md +6 -0
  29. data/lib/pdf_paradise/gui/fox/split_pdf_file.rb +77 -0
  30. 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
  31. data/lib/pdf_paradise/gui/gtk2/pdf_viewer/pdf_viewer.rb +34 -0
  32. data/lib/pdf_paradise/gui/gtk2/split_pdf_file/split_pdf_file.rb +34 -0
  33. data/lib/pdf_paradise/gui/gtk2/statistics_widget/statistics_widget.rb +34 -0
  34. data/lib/pdf_paradise/gui/gtk2/to_pdf/to_pdf.rb +32 -0
  35. data/lib/pdf_paradise/gui/gtk3/controller/controller.rb +212 -0
  36. data/lib/pdf_paradise/gui/gtk3/convert_pdf_to_text/convert_pdf_to_text.rb +34 -0
  37. 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
  38. data/lib/pdf_paradise/gui/gtk3/pdf_viewer/pdf_viewer.rb +34 -0
  39. data/lib/pdf_paradise/gui/gtk3/split_pdf_file/split_pdf_file.rb +34 -0
  40. data/lib/pdf_paradise/gui/gtk3/statistics_widget/statistics_widget.rb +34 -0
  41. data/lib/pdf_paradise/gui/gtk3/to_pdf/to_pdf.rb +32 -0
  42. data/lib/pdf_paradise/gui/libui/extract_all_images_from_this_pdf_file/extract_all_images_from_this_pdf_file.rb +223 -0
  43. data/lib/pdf_paradise/gui/libui/statistics_widget/statistics_widget.rb +233 -0
  44. data/lib/pdf_paradise/gui/shared_code/convert_pdf_to_text/convert_pdf_to_text_module.rb +277 -0
  45. 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 +443 -0
  46. data/lib/pdf_paradise/gui/shared_code/pdf_viewer/pdf_viewer.css +5 -0
  47. data/lib/pdf_paradise/gui/shared_code/pdf_viewer/pdf_viewer_module.rb +284 -0
  48. data/lib/pdf_paradise/gui/shared_code/split_pdf_file/split_pdf_file.css +0 -0
  49. data/lib/pdf_paradise/gui/shared_code/split_pdf_file/split_pdf_file_module.rb +294 -0
  50. data/lib/pdf_paradise/gui/shared_code/statistics_widget/statistics_widget_module.rb +349 -0
  51. data/lib/pdf_paradise/gui/shared_code/to_pdf/to_pdf_module.rb +281 -0
  52. data/lib/pdf_paradise/hexapdf/001_rainbow_pattern_example.rb +0 -0
  53. data/lib/pdf_paradise/hexapdf/hexapdf.rb +123 -0
  54. data/lib/pdf_paradise/images/PDF_PARADISE_LOGO.png +0 -0
  55. data/lib/pdf_paradise/main_pdf/main_pdf.rb +444 -0
  56. data/lib/pdf_paradise/merge_pdf/menu.rb +63 -0
  57. data/lib/pdf_paradise/merge_pdf/merge_pdf.rb +306 -0
  58. data/lib/pdf_paradise/merge_pdf_namespace.rb +9 -0
  59. data/lib/pdf_paradise/merge_then_open/merge_then_open.rb +105 -0
  60. data/lib/pdf_paradise/pdf_file_n_total_pages.rb +249 -0
  61. data/lib/pdf_paradise/prawn_addons/README.md +2 -0
  62. data/lib/pdf_paradise/prawn_addons/prawn_addons.rb +17 -0
  63. data/lib/pdf_paradise/project/project.rb +22 -0
  64. data/lib/pdf_paradise/remove_pdf_password.rb +391 -0
  65. data/lib/pdf_paradise/requires/batch_require_toplevel_files.rb +22 -0
  66. data/lib/pdf_paradise/requires/colours.rb +7 -0
  67. data/lib/pdf_paradise/requires/colours_and_esystem_and_save_file_and_fileutils_and_opn.rb +11 -0
  68. data/lib/pdf_paradise/requires/esystem_and_colours.rb +10 -0
  69. data/lib/pdf_paradise/requires/esystem_and_opn_and_colours.rb +8 -0
  70. data/lib/pdf_paradise/requires/require_the_whole_project.rb +28 -0
  71. data/lib/pdf_paradise/requires/require_utility_scripts.rb +9 -0
  72. data/lib/pdf_paradise/set_main_book.rb +156 -0
  73. data/lib/pdf_paradise/set_pdf_title.rb +220 -0
  74. data/lib/pdf_paradise/sinatra/embeddable_interface.rb +318 -0
  75. data/lib/pdf_paradise/toplevel_methods/automatic_pdf_title.rb +55 -0
  76. data/lib/pdf_paradise/toplevel_methods/convert_epub_to_pdf.rb +27 -0
  77. data/lib/pdf_paradise/toplevel_methods/convert_markdown_to_pdf.rb +45 -0
  78. data/lib/pdf_paradise/toplevel_methods/convert_ppt_to_pdf.rb +35 -0
  79. data/lib/pdf_paradise/toplevel_methods/e.rb +16 -0
  80. data/lib/pdf_paradise/toplevel_methods/esystem.rb +19 -0
  81. data/lib/pdf_paradise/toplevel_methods/misc.rb +76 -0
  82. data/lib/pdf_paradise/toplevel_methods/number_pages.rb +38 -0
  83. data/lib/pdf_paradise/toplevel_methods/opened_pdf_files.rb +221 -0
  84. data/lib/pdf_paradise/toplevel_methods/query_pdf_title.rb +191 -0
  85. data/lib/pdf_paradise/toplevel_methods/reduce_size_of_this_pdf_file.rb +46 -0
  86. data/lib/pdf_paradise/toplevel_methods/roebe.rb +17 -0
  87. data/lib/pdf_paradise/toplevel_methods/rotate_pdf_file.rb +143 -0
  88. data/lib/pdf_paradise/toplevel_methods/to_pdf.rb +38 -0
  89. data/lib/pdf_paradise/utility_scripts/README.md +3 -0
  90. data/lib/pdf_paradise/utility_scripts/combine_these_pdf_pages.rb +118 -0
  91. data/lib/pdf_paradise/utility_scripts/convert_pdf_to_text.rb +175 -0
  92. data/lib/pdf_paradise/utility_scripts/delete_first_page_of_this_pdf_file.rb +221 -0
  93. data/lib/pdf_paradise/utility_scripts/delete_last_page_of_this_pdf_file.rb +180 -0
  94. data/lib/pdf_paradise/utility_scripts/delete_this_page_of_this_pdf_file.rb +329 -0
  95. data/lib/pdf_paradise/utility_scripts/extract_all_images_from_this_pdf_file.rb +129 -0
  96. data/lib/pdf_paradise/utility_scripts/extract_pdf_page.rb +283 -0
  97. data/lib/pdf_paradise/utility_scripts/pdf_optimizer.rb +111 -0
  98. data/lib/pdf_paradise/utility_scripts/pdf_statistics.rb +148 -0
  99. data/lib/pdf_paradise/utility_scripts/pdf_to_html.rb +75 -0
  100. data/lib/pdf_paradise/utility_scripts/remove_images.rb +110 -0
  101. data/lib/pdf_paradise/utility_scripts/split_pdf.rb +340 -0
  102. data/lib/pdf_paradise/utility_scripts/to_qdf.rb +82 -0
  103. data/lib/pdf_paradise/version/version.rb +19 -0
  104. data/lib/pdf_paradise/www/README.md +2 -0
  105. data/lib/pdf_paradise/www/sinatra/app.rb +276 -0
  106. data/lib/pdf_paradise/yaml/working_on_these_pdf_files.yml +4 -0
  107. data/lib/pdf_paradise.rb +5 -0
  108. data/pdf_paradise.gemspec +61 -0
  109. data/test/testing_pdf_paradise.rb +9 -0
  110. metadata +219 -0
@@ -0,0 +1,306 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === PdfParadise::MergePdf
6
+ #
7
+ # This class will merge together some .pdf files.
8
+ #
9
+ # Usage example:
10
+ #
11
+ # PdfParadise::MergePdf.new(ARGV)
12
+ #
13
+ # =========================================================================== #
14
+ # require 'pdf_paradise/merge_pdf/merge_pdf.rb'
15
+ # =========================================================================== #
16
+ require 'pdf_paradise/base/base.rb'
17
+ require 'pdf_paradise/merge_pdf/menu.rb'
18
+
19
+ module PdfParadise
20
+
21
+ class MergePdf < Base # === PdfParadise::MergePdf
22
+
23
+ # ========================================================================= #
24
+ # === NAMESPACE
25
+ # ========================================================================= #
26
+ NAMESPACE = inspect
27
+
28
+ # ========================================================================= #
29
+ # === THIS_FILE_HERE
30
+ # ========================================================================= #
31
+ THIS_FILE_HERE =
32
+ '/home/x/programming/ruby/src/pdf_paradise/lib/pdf_paradise/merge_pdf/merge_pdf.rb'
33
+
34
+ # ========================================================================= #
35
+ # === STORE_WHERE_WE_MERGED_FILES
36
+ # ========================================================================= #
37
+ STORE_WHERE_WE_MERGED_FILES =
38
+ '/home/Temp/merged_these_pdf_files.md'
39
+
40
+ # ========================================================================= #
41
+ # === initialize
42
+ # ========================================================================= #
43
+ def initialize(
44
+ i = nil,
45
+ run_already = true
46
+ )
47
+ reset
48
+ set_commandline_arguments(
49
+ return_hyphen_arguments(i)
50
+ )
51
+ case i
52
+ when :dont_run_yet
53
+ run_already = false
54
+ else
55
+ set_array_pdf_files(i)
56
+ end
57
+ run if run_already
58
+ end
59
+
60
+ # ========================================================================= #
61
+ # === reset (reset tag)
62
+ # ========================================================================= #
63
+ def reset
64
+ # ======================================================================= #
65
+ # === @array_pdf_files
66
+ # ======================================================================= #
67
+ @array_pdf_files = []
68
+ # ======================================================================= #
69
+ # === @use_this_program_for_merging_the_pdf_files
70
+ #
71
+ # Currently we can either use :ghostscript (gs) or :hexapdf. The
72
+ # latter is a pure ruby-gem.
73
+ # ======================================================================= #
74
+ @use_this_program_for_merging_the_pdf_files = :hexapdf # :ghostscript
75
+ set_output_filename
76
+ end
77
+
78
+ # ========================================================================= #
79
+ # === show_help (help tag)
80
+ # ========================================================================= #
81
+ def show_help
82
+ e
83
+ e 'To remove the merged files, do this:'
84
+ e
85
+ e ' mergepdf --remove'
86
+ e
87
+ e 'To use hexapdf:'
88
+ e
89
+ e ' mergepdf --use-hexapdf'
90
+ e
91
+ e 'To use ghostscript:'
92
+ e
93
+ e ' mergepdf --use-ghostscript'
94
+ e
95
+ end
96
+
97
+ # ========================================================================= #
98
+ # === remove_merged_files (remove tag)
99
+ # ========================================================================= #
100
+ def remove_merged_files
101
+ _ = where_are_the_merged_files?
102
+ opnn; e 'We will now remove the merged files, by reading '\
103
+ 'in from `'+sfile(_)+'`.'
104
+ # ======================================================================= #
105
+ # Read in that save-file next. As of Feb 2015, the format is
106
+ # one-file-per-line. We also get rid of '"' characters.
107
+ # ======================================================================= #
108
+ _ = File.readlines(_).map {|entry|
109
+ entry.chomp.delete('"')
110
+ } # .split(' ')
111
+ _.each {|file| delete(file) }
112
+ end
113
+
114
+ # ========================================================================= #
115
+ # === open_this_file_here
116
+ # ========================================================================= #
117
+ def open_this_file_here
118
+ _ = 'bluefish '+THIS_FILE_HERE
119
+ esystem _
120
+ end
121
+
122
+ # ========================================================================= #
123
+ # === do_conversion
124
+ #
125
+ # This method will do the actual conversion.
126
+ # ========================================================================= #
127
+ def do_conversion
128
+ these_files = @array_pdf_files.join(N)
129
+ # ======================================================================= #
130
+ # Next, we store this in the save-file.
131
+ # ======================================================================= #
132
+ write_what_into(these_files, where_are_the_merged_files?)
133
+ case @use_this_program_for_merging_the_pdf_files
134
+ # ======================================================================= #
135
+ # === :hexapdf
136
+ # ======================================================================= #
137
+ when :hexapdf
138
+ _ = 'hexapdf merge --force '.dup
139
+ _ << these_files.tr(N,' ')
140
+ _ << " #{@output_filename}"
141
+ # ======================================================================= #
142
+ # === :ghostscript
143
+ #
144
+ # To use this via the commandline, try:
145
+ #
146
+ # mergepdf one.pdf two.pdf --use-ghostscript
147
+ #
148
+ # ======================================================================= #
149
+ when :ghostscript,
150
+ :default
151
+ _ = 'gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE="'+
152
+ @output_filename+
153
+ '" -dBATCH '
154
+ _ << these_files.tr(N,' ')
155
+ end
156
+ e
157
+ cliner
158
+ e "#{::Colours.rev}We will run this command next for "\
159
+ "#{@array_pdf_files.size.to_s} .pdf files:"
160
+ e
161
+ efancy " #{_}" # This is the command we will run.
162
+ e
163
+ system _
164
+ cliner
165
+ end
166
+
167
+ # ========================================================================= #
168
+ # === where_are_the_merged_files?
169
+ # ========================================================================= #
170
+ def where_are_the_merged_files?
171
+ STORE_WHERE_WE_MERGED_FILES
172
+ end
173
+
174
+ # ========================================================================= #
175
+ # === delete
176
+ # ========================================================================= #
177
+ def delete(i)
178
+ unless i == '/'
179
+ efancy(" - #{i}") # Add a slight padding to the output.
180
+ File.delete(i) if File.exist? i # Safeguard.
181
+ end
182
+ end
183
+
184
+ # ========================================================================= #
185
+ # === pad_this
186
+ # ========================================================================= #
187
+ def pad_this(i)
188
+ return '"'+i+'"'
189
+ end
190
+
191
+ # ========================================================================= #
192
+ # === set_array_pdf_files
193
+ # ========================================================================= #
194
+ def set_array_pdf_files(i = '')
195
+ if i and i.is_a?(String) and i.include?(' ')
196
+ # ===================================================================== #
197
+ # Do automatic splitting in this case.
198
+ # ===================================================================== #
199
+ i = i.split(' ')
200
+ end
201
+ i = [i].flatten.compact.reject {|entry| entry.start_with?('--') }
202
+ if i.is_a?(Array) and i.empty?
203
+ all_pdf_files = Dir['*.pdf']
204
+ # ===================================================================== #
205
+ # Try to use all .pdf files.
206
+ # ===================================================================== #
207
+ unless all_pdf_files.empty?
208
+ opnn; e 'No specific input was given, thus using all '+
209
+ sfancy(all_pdf_files.size.to_s)+' .pdf files '\
210
+ 'in this directory'
211
+ i = all_pdf_files
212
+ end
213
+ end
214
+ if i.is_a? Array # Keep only files that exist.
215
+ i.select! {|entry| File.exist? entry }
216
+ end
217
+ if i.is_a? Array
218
+ i.map! {|entry| pad_this(entry) }
219
+ end
220
+ if i.empty?
221
+ opnn; ewarn 'Unable to find any existing files '\
222
+ 'to match to, thus exiting now.'
223
+ exit
224
+ end
225
+ @array_pdf_files << i
226
+ @array_pdf_files = @array_pdf_files.flatten # Always keep it flattened.
227
+ end; alias << set_array_pdf_files # === <<
228
+
229
+ # ========================================================================= #
230
+ # === set_output_filename
231
+ #
232
+ # Store the filename of the pdf through this method, the name of
233
+ # the output file.
234
+ # ========================================================================= #
235
+ def set_output_filename(
236
+ i = 'Merged_PDF_Files.pdf'
237
+ )
238
+ if i.size > 255
239
+ opnn; ewarn 'The name for the new filename is larger than 255.'
240
+ opnn; ewarn 'We will thus truncate the name to the first 255 '\
241
+ 'characters instead.'
242
+ i = i[0, 254]
243
+ # ===================================================================== #
244
+ # Since as of Jun 2016, we will get rid of the last 4
245
+ # characters and append '.pdf'
246
+ # ===================================================================== #
247
+ i[-4,4] = ''
248
+ i << '.pdf'
249
+ end
250
+ @output_filename = i
251
+ end; alias store_at set_output_filename # === store_at
252
+
253
+ # ========================================================================= #
254
+ # === opnn
255
+ # ========================================================================= #
256
+ def opnn
257
+ super(NAMESPACE)
258
+ end
259
+
260
+ # ========================================================================= #
261
+ # === feedback_where_it_is_stored
262
+ # ========================================================================= #
263
+ def feedback_where_it_is_stored
264
+ if File.exist? result?
265
+ opnn; e "The result is stored at `#{sfile(self.result)}`."
266
+ end
267
+ end; alias report feedback_where_it_is_stored # === report
268
+
269
+ # ========================================================================= #
270
+ # === output_filename
271
+ # ========================================================================= #
272
+ def output_filename
273
+ _ = @output_filename
274
+ _ = _.join(', ') if _.is_a? Array
275
+ return _
276
+ end; alias result output_filename # === result
277
+ alias result? output_filename # === result?
278
+ alias output_filename? output_filename # === output_filename?
279
+ alias output_file? output_filename # === output_file?
280
+
281
+ # ========================================================================= #
282
+ # === build_new_output_name_based_on_input
283
+ # ========================================================================= #
284
+ def build_new_output_name_based_on_input
285
+ _ = @array_pdf_files.map {|entry|
286
+ File.basename(entry).gsub(File.extname(entry), '')
287
+ }
288
+ _ = _.join(' ').gsub(/ /,'_').gsub(/\"/,'')+'.pdf'
289
+ set_output_filename(_)
290
+ end
291
+
292
+ # ========================================================================= #
293
+ # === run (run tag)
294
+ # ========================================================================= #
295
+ def run
296
+ menu
297
+ build_new_output_name_based_on_input
298
+ do_conversion
299
+ end
300
+
301
+ end; end
302
+
303
+ if __FILE__ == $PROGRAM_NAME
304
+ _ = PdfParadise::MergePdf.new(ARGV)
305
+ _.feedback_where_it_is_stored # Call it manually.
306
+ end # merge_pdf
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'pdf_paradise/merge_pdf_namespace'
6
+ # =========================================================================== #
7
+ require 'pdf_paradise/requires/require_the_whole_project.rb'
8
+
9
+ MergePdf = PdfParadise::MergePdf # Now the MergePdf namespace is available in the toplevel.
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === PdfParadise::MergeThenOpen
6
+ #
7
+ # This will first merge different .pdf files, and then open the
8
+ # newly generated .pdf file.
9
+ #
10
+ # Usage example:
11
+ #
12
+ # PdfParadise::MergeThenOpen.new(ARGV)
13
+ #
14
+ # =========================================================================== #
15
+ # require 'pdf_paradise/merge_then_open/merge_then_open.rb'
16
+ # PdfParadise::MergeThenOpen.new(ARGV)
17
+ # =========================================================================== #
18
+ require 'pdf_paradise/merge_pdf/merge_pdf.rb'
19
+
20
+ module PdfParadise
21
+
22
+ class MergeThenOpen < Base # === PdfParadise::MergeThenOpen
23
+
24
+ # ========================================================================= #
25
+ # === NAMESPACE
26
+ # ========================================================================= #
27
+ NAMESPACE = inspect
28
+
29
+ # ========================================================================= #
30
+ # === initialize
31
+ # ========================================================================= #
32
+ def initialize(
33
+ commandline_arguments = nil,
34
+ run_already = true
35
+ )
36
+ reset
37
+ set_commandline_arguments(
38
+ commandline_arguments
39
+ )
40
+ run if run_already
41
+ end
42
+
43
+ # ========================================================================= #
44
+ # === reset (reset tag)
45
+ # ========================================================================= #
46
+ def reset
47
+ super()
48
+ end
49
+
50
+ # ========================================================================= #
51
+ # === opnn
52
+ # ========================================================================= #
53
+ def opnn(i = NAMESPACE)
54
+ super(i)
55
+ end
56
+
57
+ # ========================================================================= #
58
+ # === set_commandline_arguments
59
+ # ========================================================================= #
60
+ def set_commandline_arguments(i = '')
61
+ i = [i].flatten.compact
62
+ @commandline_arguments = i
63
+ end
64
+
65
+ # ========================================================================= #
66
+ # === commandline_arguments?
67
+ # ========================================================================= #
68
+ def commandline_arguments?
69
+ @commandline_arguments
70
+ end
71
+
72
+ # ========================================================================= #
73
+ # === run (run tag)
74
+ # ========================================================================= #
75
+ def run
76
+ merge_pdf = MergePdf.new(@commandline_arguments)
77
+ new_file = merge_pdf.output_file?
78
+ if File.exist? new_file
79
+ # ===================================================================== #
80
+ # We have to open this file next.
81
+ # ===================================================================== #
82
+ begin
83
+ require 'open'
84
+ if Object.const_defined? :Open
85
+ opnn; e "Opening #{sfile(new_file)} next."
86
+ Open.in_editor(new_file)
87
+ end
88
+ rescue LoadError; end
89
+ else
90
+ opnn; e "No file appears to exist at #{sfile(new_file)}."
91
+ end
92
+ end
93
+
94
+ # ========================================================================= #
95
+ # === PdfParadise::MergeThenOpen[]
96
+ # ========================================================================= #
97
+ def self.[](i = '')
98
+ new(i)
99
+ end
100
+
101
+ end; end
102
+
103
+ if __FILE__ == $PROGRAM_NAME
104
+ PdfParadise::MergeThenOpen.new(ARGV)
105
+ end # mergethenopen
@@ -0,0 +1,249 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === PdfParadise::PdfFileNTotalPages
6
+ #
7
+ # This class can report how many pages are in a given .pdf file.
8
+ #
9
+ # Also note that an alternative exists:
10
+ #
11
+ # https://github.com/prawnpdf/pdf-inspector
12
+ #
13
+ # The code would be like this here:
14
+ #
15
+ # page_analysis = PDF::Inspector::Page.analyze(pdf)
16
+ # page_analysis.pages.size # <-- like 50 pages
17
+ #
18
+ # Usage example:
19
+ #
20
+ # PdfParadise::PdfFileNTotalPages.new(ARGV)
21
+ #
22
+ # =========================================================================== #
23
+ # require 'pdf_paradise/pdf_file_n_total_pages.rb'
24
+ # PdfParadise::PdfFileNTotalPages.new(ARGV)
25
+ # =========================================================================== #
26
+ require 'pdf_paradise/base/base.rb'
27
+
28
+ module PdfParadise
29
+
30
+ class PdfFileNTotalPages < Base # === PdfParadise::PdfFileNTotalPages
31
+
32
+ # ========================================================================= #
33
+ # === MATCH_AGAINST_THIS_REGEX
34
+ # ========================================================================= #
35
+ MATCH_AGAINST_THIS_REGEX = /Count (\d+)/
36
+
37
+ # ========================================================================= #
38
+ # === USE_THIS_PROGRAM_TO_DETERMINE_HOW_MANY_PAGES_ARE_PART_OF_THE_PDF_FILE
39
+ #
40
+ # This can be :pdfinfo or :qpdf or similar.
41
+ # ========================================================================= #
42
+ USE_THIS_PROGRAM_TO_DETERMINE_HOW_MANY_PAGES_ARE_PART_OF_THE_PDF_FILE = :qpdf # :pdfinfo
43
+
44
+ # ========================================================================= #
45
+ # === initialize
46
+ # ========================================================================= #
47
+ def initialize(
48
+ i = nil,
49
+ run_already = true
50
+ )
51
+ reset
52
+ set_commandline_arguments(i)
53
+ case run_already
54
+ when :be_silent
55
+ @be_verbose = false
56
+ run_already = false
57
+ end
58
+ run if run_already
59
+ end
60
+
61
+ # ========================================================================= #
62
+ # === reset (reset tag)
63
+ # ========================================================================= #
64
+ def reset
65
+ super()
66
+ # ======================================================================= #
67
+ # === @n_pages
68
+ #
69
+ # This variable will keep track as to how many pages the given .pdf
70
+ # page has.
71
+ # ======================================================================= #
72
+ @n_pages = 0
73
+ # ======================================================================= #
74
+ # === @be_verbose
75
+ # ======================================================================= #
76
+ @be_verbose = true
77
+ # ======================================================================= #
78
+ # === @use_this_program_to_determine_how_many_pages_are_part_of_the_pdf_file
79
+ # ======================================================================= #
80
+ @use_this_program_to_determine_how_many_pages_are_part_of_the_pdf_file =
81
+ USE_THIS_PROGRAM_TO_DETERMINE_HOW_MANY_PAGES_ARE_PART_OF_THE_PDF_FILE
82
+ end
83
+
84
+ # ========================================================================= #
85
+ # === n_pages
86
+ # ========================================================================= #
87
+ def n_pages?
88
+ @n_pages
89
+ end; alias n_pages n_pages? # === n_pages
90
+ alias result? n_pages? # === result?
91
+
92
+ # ========================================================================= #
93
+ # === set_n_pages
94
+ #
95
+ # Since as of December 2021 this method will do a tiny bit of
96
+ # sanitizing the given input.
97
+ # ========================================================================= #
98
+ def set_n_pages(i)
99
+ if i.is_a? String
100
+ i = i.strip
101
+ end
102
+ i = i.to_i
103
+ @n_pages = i
104
+ end
105
+
106
+ # ========================================================================= #
107
+ # === determine_dataset
108
+ # ========================================================================= #
109
+ def determine_dataset(of_this_pdf_file = @this_pdf_file)
110
+ @dataset = File.binread(of_this_pdf_file)
111
+ end
112
+
113
+ # ========================================================================= #
114
+ # === be_verbose?
115
+ # ========================================================================= #
116
+ def be_verbose?
117
+ @be_verbose
118
+ end
119
+
120
+ # ========================================================================= #
121
+ # === report_how_many_pages_were_found
122
+ # ========================================================================= #
123
+ def report_how_many_pages_were_found
124
+ e "#{rev}The pdf-file #{sfile(@this_pdf_file)} has exactly "\
125
+ "#{simp(n_pages?.to_s)} pages."
126
+ end
127
+
128
+ # ========================================================================= #
129
+ # === set_this_pdf_file
130
+ # ========================================================================= #
131
+ def set_this_pdf_file(i)
132
+ @this_pdf_file = i
133
+ end
134
+
135
+ # ========================================================================= #
136
+ # === determine_n_pages
137
+ # ========================================================================= #
138
+ def determine_n_pages
139
+ _ = @dataset
140
+ case @use_this_program_to_determine_how_many_pages_are_part_of_the_pdf_file
141
+ # ======================================================================= #
142
+ # === :qpdf
143
+ # ======================================================================= #
144
+ when :qpdf
145
+ result = `qpdf #{@this_pdf_file} --show-npages`
146
+ set_n_pages(result)
147
+ # ======================================================================= #
148
+ # === :pdfinfo
149
+ # ======================================================================= #
150
+ when :pdfinfo
151
+ result = `pdfinfo #{@this_pdf_file}`
152
+ determine_n_pages_via_pdfinfo(result)
153
+ else # else tag
154
+ # ===================================================================== #
155
+ # This here has the advantage (in theory) that we can just use
156
+ # a Regex and obtain the number of pages in the .pdf file. This
157
+ # works ok for many .pdf files, but not for all of them. This
158
+ # is also the reason why I switched to pdfinfo in March 2020 -
159
+ # it seems to be more reliable than the regex I am using.
160
+ # ===================================================================== #
161
+ scanned = _.scan(MATCH_AGAINST_THIS_REGEX)
162
+ # ===================================================================== #
163
+ # Note that the following may still return the wrong entry.
164
+ # I had this problem in March 2020.
165
+ # ===================================================================== #
166
+ max_value = scanned.map {|entry|
167
+ entry.first.to_i
168
+ }.max
169
+ set_n_pages(max_value)
170
+ end
171
+ end
172
+
173
+ # ========================================================================= #
174
+ # === determine_n_pages_via_pdfinfo
175
+ #
176
+ # We have to find an entry such as the following one:
177
+ #
178
+ # Pages: 35
179
+ #
180
+ # ========================================================================= #
181
+ def determine_n_pages_via_pdfinfo(
182
+ i = @this_pdf_file,
183
+ use_this_regex = Regexp.new(/Pages: (.+)/)
184
+ )
185
+ if i.include? 'Pages:'
186
+ i = i.scan(use_this_regex).flatten.first.strip
187
+ end
188
+ set_n_pages(i)
189
+ end
190
+
191
+ # ========================================================================= #
192
+ # === run (run tag)
193
+ # ========================================================================= #
194
+ def run
195
+ return_files_from_the_commandline_arguments.each {|this_pdf_file|
196
+ reset
197
+ set_this_pdf_file(this_pdf_file)
198
+ determine_dataset
199
+ determine_n_pages # Determine how many pages are in that .pdf file.
200
+ report_how_many_pages_were_found if be_verbose?
201
+ }
202
+ end
203
+
204
+ # ========================================================================= #
205
+ # === PdfFileNTotalPages.return_n_pages
206
+ #
207
+ # This method is silent by default.
208
+ # ========================================================================= #
209
+ def self.return_n_pages(of_this_pdf_file)
210
+ _ = PdfFileNTotalPages.new(of_this_pdf_file, :be_silent)
211
+ _.run
212
+ return _.n_pages.to_i # Ought to return a number, as an integer.
213
+ end
214
+
215
+ # ========================================================================= #
216
+ # === PdfParadise::PdfFileNTotalPages[]
217
+ # ========================================================================= #
218
+ def self.[](i)
219
+ new(i).result?
220
+ end
221
+
222
+ end
223
+
224
+ # =========================================================================== #
225
+ # === PdfParadise.n_pdf_pages?
226
+ #
227
+ # This is the top-level method to find out how many pdf pages are
228
+ # part of the given .pdf file at hand.
229
+ #
230
+ # The first argument to this method is simply the name of the .pdf file
231
+ # or, rather, the path to it.
232
+ #
233
+ # Usage example:
234
+ #
235
+ # PdfParadise.n_pdf_pages?("/home/x/STUDIUM/UNI_WIEN/300260_Immunologie_und_zellul�re_Mikrobiologie_Teil_A/XIV-XVII_combined.pdf")
236
+ #
237
+ # =========================================================================== #
238
+ def self.n_pdf_pages?(of_this_pdf_file)
239
+ PdfFileNTotalPages.return_n_pages(of_this_pdf_file).to_i
240
+ end; self.instance_eval { alias n_pages? n_pdf_pages? } # === PdfParadise.n_pages?
241
+ self.instance_eval { alias n_pages n_pdf_pages? } # === PdfParadise.n_pages
242
+ self.instance_eval { alias n_pdf_pages n_pdf_pages? } # === PdfParadise.n_pdf_pages
243
+ self.instance_eval { alias n_pages_in_this_pdf_file? n_pdf_pages? } # === PdfParadise.n_pages_in_this_pdf_file?
244
+
245
+ end
246
+
247
+ if __FILE__ == $PROGRAM_NAME
248
+ PdfParadise::PdfFileNTotalPages.new(ARGV)
249
+ end # n_pages $UNI_WIEN/300609_Molekulare_Entwicklungsbiologie/Entwicklungsbiologie7.pdf
@@ -0,0 +1,2 @@
1
+ This directory may contain some modifications to the prawn gem
2
+ and Prawn namespace.
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'pdf_paradise/prawn_addons/prawn_addons.rb'
6
+ # =========================================================================== #
7
+ if Object.const_defined? :Prawn
8
+
9
+ module Prawn
10
+
11
+ class Document
12
+
13
+ if respond_to? :start_new_page
14
+ alias add_page start_new_page
15
+ end
16
+
17
+ end; end; end