pdf_paradise 0.3.20

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.
Files changed (130) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +933 -0
  3. data/bin/automatic_pdf_title +7 -0
  4. data/bin/burst_this_pdf_file +7 -0
  5. data/bin/combine_these_pdf_pages +7 -0
  6. data/bin/compress_via_hexapdf +7 -0
  7. data/bin/convert_markdown_to_pdf +7 -0
  8. data/bin/convert_pdf_to_text +7 -0
  9. data/bin/delete_first_page_of_this_pdf_file +7 -0
  10. data/bin/djvu_to_pdf +7 -0
  11. data/bin/merge_then_open +7 -0
  12. data/bin/n_pages +10 -0
  13. data/bin/open_main_pdf +7 -0
  14. data/bin/pdf_paradise +9 -0
  15. data/bin/rotate_pdf +7 -0
  16. data/bin/set_main_book +7 -0
  17. data/bin/set_title_of_this_pdf_file +15 -0
  18. data/doc/README.gen +871 -0
  19. data/doc/todo/todo.md +13 -0
  20. data/images/Logo_for_the_pdf_paradise_project.avif +0 -0
  21. data/lib/pdf_paradise/base/base.rb +344 -0
  22. data/lib/pdf_paradise/base/colours.rb +67 -0
  23. data/lib/pdf_paradise/colours/colours.rb +27 -0
  24. data/lib/pdf_paradise/commandline/commandline.rb +109 -0
  25. data/lib/pdf_paradise/commandline/help.rb +77 -0
  26. data/lib/pdf_paradise/commandline/menu.rb +173 -0
  27. data/lib/pdf_paradise/compress/compress_this_pdf_file.rb +108 -0
  28. data/lib/pdf_paradise/compress/compress_via_hexapdf.rb +27 -0
  29. data/lib/pdf_paradise/compress/compress_via_qpdf.rb +32 -0
  30. data/lib/pdf_paradise/constants/constants.rb +76 -0
  31. data/lib/pdf_paradise/convert_text_to_pdf.rb +94 -0
  32. data/lib/pdf_paradise/css/project.css +17 -0
  33. data/lib/pdf_paradise/fpdf/README.md +2 -0
  34. data/lib/pdf_paradise/fpdf/bookmark.rb +129 -0
  35. data/lib/pdf_paradise/fpdf/chinese.rb +454 -0
  36. data/lib/pdf_paradise/fpdf/fpdf.rb +1902 -0
  37. data/lib/pdf_paradise/fpdf/fpdf_eps.rb +138 -0
  38. data/lib/pdf_paradise/fpdf/makefont.rb +1794 -0
  39. data/lib/pdf_paradise/gui/README.md +6 -0
  40. data/lib/pdf_paradise/gui/fox/split_pdf_file.rb +77 -0
  41. data/lib/pdf_paradise/gui/gtk2/pdf_viewer/pdf_viewer.rb +34 -0
  42. data/lib/pdf_paradise/gui/gtk2/split_pdf_file/split_pdf_file.rb +34 -0
  43. data/lib/pdf_paradise/gui/gtk2/statistics_widget/statistics_widget.rb +34 -0
  44. data/lib/pdf_paradise/gui/gtk3/controller/controller.rb +214 -0
  45. data/lib/pdf_paradise/gui/gtk3/pdf_viewer/pdf_viewer.rb +34 -0
  46. data/lib/pdf_paradise/gui/gtk3/split_pdf_file/split_pdf_file.rb +34 -0
  47. data/lib/pdf_paradise/gui/jruby/delete_the_first_or_the_last_page_of_this_pdf_file/delete_the_first_or_the_last_page_of_this_pdf_file.rb +167 -0
  48. data/lib/pdf_paradise/gui/jruby/remove_the_first_page_of_this_pdf_file/remove_the_first_page_of_this_pdf_file.rb +103 -0
  49. data/lib/pdf_paradise/gui/libui/extract_all_images_from_this_pdf_file/extract_all_images_from_this_pdf_file.rb +223 -0
  50. data/lib/pdf_paradise/gui/libui/remove_the_first_page_of_this_pdf_file/remove_the_first_page_of_this_pdf_file.rb +267 -0
  51. data/lib/pdf_paradise/gui/libui/rotate_pdf_file/rotate_pdf_file.rb +219 -0
  52. data/lib/pdf_paradise/gui/libui/statistics_widget/statistics_widget.rb +233 -0
  53. data/lib/pdf_paradise/gui/shared_code/pdf_viewer/pdf_viewer.css +5 -0
  54. data/lib/pdf_paradise/gui/shared_code/pdf_viewer/pdf_viewer_module.rb +287 -0
  55. data/lib/pdf_paradise/gui/shared_code/remove_the_first_page_of_this_pdf_file_module/remove_the_first_page_of_this_pdf_file_module.rb +31 -0
  56. data/lib/pdf_paradise/gui/shared_code/split_pdf_file/split_pdf_file_module.rb +295 -0
  57. data/lib/pdf_paradise/gui/universal_widgets/convert_pdf_to_text/convert_pdf_to_text.rb +366 -0
  58. data/lib/pdf_paradise/gui/universal_widgets/delete_the_first_or_the_last_page_of_this_pdf_file/delete_the_first_or_the_last_page_of_this_pdf_file.rb +776 -0
  59. data/lib/pdf_paradise/gui/universal_widgets/statistics_widget/statistics_widget.rb +407 -0
  60. data/lib/pdf_paradise/gui/universal_widgets/to_pdf/to_pdf.rb +351 -0
  61. data/lib/pdf_paradise/hexapdf/001_rainbow_pattern_example.rb +0 -0
  62. data/lib/pdf_paradise/hexapdf/hexapdf.rb +123 -0
  63. data/lib/pdf_paradise/images/PDF_PARADISE_LOGO.png +0 -0
  64. data/lib/pdf_paradise/main_pdf/main_pdf.rb +474 -0
  65. data/lib/pdf_paradise/merge_pdf/menu.rb +63 -0
  66. data/lib/pdf_paradise/merge_pdf/merge_pdf.rb +307 -0
  67. data/lib/pdf_paradise/merge_pdf_namespace.rb +9 -0
  68. data/lib/pdf_paradise/merge_then_open/merge_then_open.rb +105 -0
  69. data/lib/pdf_paradise/prawn_addons/README.md +2 -0
  70. data/lib/pdf_paradise/prawn_addons/prawn_addons.rb +17 -0
  71. data/lib/pdf_paradise/project/project.rb +22 -0
  72. data/lib/pdf_paradise/remove_pdf_password.rb +391 -0
  73. data/lib/pdf_paradise/requires/batch_require_toplevel_files.rb +22 -0
  74. data/lib/pdf_paradise/requires/colours.rb +11 -0
  75. data/lib/pdf_paradise/requires/colours_and_esystem_and_save_file_and_fileutils_and_opn.rb +13 -0
  76. data/lib/pdf_paradise/requires/esystem_and_colours.rb +11 -0
  77. data/lib/pdf_paradise/requires/esystem_and_opn_and_colours.rb +10 -0
  78. data/lib/pdf_paradise/requires/require_the_whole_project.rb +30 -0
  79. data/lib/pdf_paradise/requires/require_utility_scripts.rb +9 -0
  80. data/lib/pdf_paradise/set_main_book.rb +156 -0
  81. data/lib/pdf_paradise/set_pdf_title.rb +220 -0
  82. data/lib/pdf_paradise/sinatra/embeddable_interface.rb +389 -0
  83. data/lib/pdf_paradise/toplevel_methods/convert_epub_to_pdf.rb +27 -0
  84. data/lib/pdf_paradise/toplevel_methods/convert_markdown_to_pdf.rb +45 -0
  85. data/lib/pdf_paradise/toplevel_methods/convert_ppt_to_pdf.rb +35 -0
  86. data/lib/pdf_paradise/toplevel_methods/e.rb +16 -0
  87. data/lib/pdf_paradise/toplevel_methods/esystem.rb +20 -0
  88. data/lib/pdf_paradise/toplevel_methods/misc.rb +228 -0
  89. data/lib/pdf_paradise/toplevel_methods/number_pages.rb +38 -0
  90. data/lib/pdf_paradise/toplevel_methods/opened_pdf_files.rb +221 -0
  91. data/lib/pdf_paradise/toplevel_methods/query_pdf_title.rb +201 -0
  92. data/lib/pdf_paradise/toplevel_methods/reduce_size_of_this_pdf_file.rb +46 -0
  93. data/lib/pdf_paradise/toplevel_methods/roebe.rb +17 -0
  94. data/lib/pdf_paradise/toplevel_methods/to_pdf.rb +12 -0
  95. data/lib/pdf_paradise/utility_scripts/README.md +3 -0
  96. data/lib/pdf_paradise/utility_scripts/automatic_pdf_title.rb +104 -0
  97. data/lib/pdf_paradise/utility_scripts/check_syntax_of_pdf_files.rb +106 -0
  98. data/lib/pdf_paradise/utility_scripts/combine_these_pdf_pages.rb +118 -0
  99. data/lib/pdf_paradise/utility_scripts/convert_pdf_to_text.rb +179 -0
  100. data/lib/pdf_paradise/utility_scripts/delete_last_page_of_this_pdf_file.rb +180 -0
  101. data/lib/pdf_paradise/utility_scripts/delete_the_first_page_of_this_pdf_file/delete_the_first_page_of_this_pdf_file.rb +429 -0
  102. data/lib/pdf_paradise/utility_scripts/delete_this_page_of_this_pdf_file.rb +356 -0
  103. data/lib/pdf_paradise/utility_scripts/djvu_to_pdf.rb +87 -0
  104. data/lib/pdf_paradise/utility_scripts/extract_all_images_from_this_pdf_file.rb +129 -0
  105. data/lib/pdf_paradise/utility_scripts/extract_pdf_page.rb +283 -0
  106. data/lib/pdf_paradise/utility_scripts/pdf_file_n_total_pages.rb +348 -0
  107. data/lib/pdf_paradise/utility_scripts/pdf_optimizer.rb +111 -0
  108. data/lib/pdf_paradise/utility_scripts/pdf_statistics.rb +148 -0
  109. data/lib/pdf_paradise/utility_scripts/pdf_to_html.rb +75 -0
  110. data/lib/pdf_paradise/utility_scripts/remove_images.rb +110 -0
  111. data/lib/pdf_paradise/utility_scripts/rotate_pdf_file.rb +303 -0
  112. data/lib/pdf_paradise/utility_scripts/split_pdf.rb +364 -0
  113. data/lib/pdf_paradise/utility_scripts/to_pdf.rb +130 -0
  114. data/lib/pdf_paradise/utility_scripts/to_qdf.rb +66 -0
  115. data/lib/pdf_paradise/version/version.rb +19 -0
  116. data/lib/pdf_paradise/www/README.md +2 -0
  117. data/lib/pdf_paradise/www/sinatra/app.rb +304 -0
  118. data/lib/pdf_paradise/yaml/working_on_these_pdf_files.yml +4 -0
  119. data/lib/pdf_paradise.rb +5 -0
  120. data/pdf_paradise.gemspec +61 -0
  121. data/test/fpdf/001_minimal_example.rb +12 -0
  122. data/test/fpdf/002.pdf +0 -0
  123. data/test/fpdf/002_header_and_footer_example.rb +64 -0
  124. data/test/fpdf/003.pdf +98 -0
  125. data/test/fpdf/003_justified_paragraphs.rb +96 -0
  126. data/test/fpdf/file1.md +3 -0
  127. data/test/fpdf/file2.md +3 -0
  128. data/test/fpdf/test.pdf +0 -0
  129. data/test/testing_pdf_paradise.rb +12 -0
  130. metadata +239 -0
@@ -0,0 +1,356 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === PdfParadise::DeleteThisPageOfThisPdfFile
6
+ #
7
+ # This class will accept one (or several) .pdf files and then proceed
8
+ # to remove the specified .pdf page in that file.
9
+ #
10
+ # By default, the class here will honour the constant called
11
+ # OVERWRITE_THE_OLD_PDF_FILE in order to determine whether a new
12
+ # .pdf file is to be created, or whether to modify the original
13
+ # .pdf file as-is.
14
+ #
15
+ # Note that this functionality "contained" in this .rb file depends
16
+ # on either "qpdf" or "pdftk" - personally I much prefer qpdf these
17
+ # days.
18
+ # =========================================================================== #
19
+ # require 'pdf_paradise/utility_scripts/delete_this_page_of_this_pdf_file.rb'
20
+ # =========================================================================== #
21
+ require 'pdf_paradise/base/base.rb'
22
+
23
+ module PdfParadise
24
+
25
+ class DeleteThisPageOfThisPdfFile < Base
26
+
27
+ require 'pdf_paradise/utility_scripts/pdf_file_n_total_pages.rb'
28
+
29
+ # ========================================================================= #
30
+ # === OVERWRITE_THE_OLD_PDF_FILE
31
+ #
32
+ # If the following constant is set to true then the given input
33
+ # file will be overwritten. I prefer this on my home system, so
34
+ # the default is true for now.
35
+ # ========================================================================= #
36
+ OVERWRITE_THE_OLD_PDF_FILE = true
37
+
38
+ # ========================================================================= #
39
+ # === DEFAULT_REMOVE_THIS_PDF_PAGE
40
+ #
41
+ # If you don't feel like manually passing data to the .rb file, use
42
+ # the hardcoded value here.
43
+ # ========================================================================= #
44
+ DEFAULT_REMOVE_THIS_PDF_PAGE = 126
45
+
46
+ # ========================================================================= #
47
+ # === initialize
48
+ # ========================================================================= #
49
+ def initialize(
50
+ input_files = ARGV,
51
+ run_already = true
52
+ )
53
+ reset
54
+ set_commandline_arguments(
55
+ input_files
56
+ )
57
+ set_input_files(
58
+ input_files
59
+ )
60
+ # ======================================================================= #
61
+ # === Handle Blocks next
62
+ # ======================================================================= #
63
+ if block_given?
64
+ yielded = yield
65
+ case yielded
66
+ when :do_not_run_yet
67
+ run_already = false
68
+ end
69
+ end
70
+ run if run_already
71
+ end
72
+
73
+ # ========================================================================= #
74
+ # === reset
75
+ # ========================================================================= #
76
+ def reset
77
+ super()
78
+ infer_the_namespace
79
+ # ======================================================================= #
80
+ # === @overwrite_the_old_pdf_file
81
+ #
82
+ # This determines whether the old .pdf file will be overwritten.
83
+ # ======================================================================= #
84
+ @overwrite_the_old_pdf_file = OVERWRITE_THE_OLD_PDF_FILE
85
+ # ======================================================================= #
86
+ # === @remove_this_pdf_page
87
+ #
88
+ # This variable keeps track as to which particular page we wish
89
+ # to remove from our .pdf file. By default we will set to one
90
+ # as is anyway.
91
+ # ======================================================================= #
92
+ @remove_this_pdf_page = DEFAULT_REMOVE_THIS_PDF_PAGE
93
+ # ======================================================================= #
94
+ # === @use_this_program
95
+ # ======================================================================= #
96
+ @use_this_program = 'hexapdf' # qpdf'
97
+ end
98
+
99
+ # ========================================================================= #
100
+ # === show_help (help tag)
101
+ # ========================================================================= #
102
+ def show_help
103
+ e
104
+ e 'The first argument should be the .pdf file.'
105
+ e 'The second argument should be the page number.'
106
+ e
107
+ end
108
+
109
+ # ========================================================================= #
110
+ # === set_input_files
111
+ # ========================================================================= #
112
+ def set_input_files(i)
113
+ i = [i] unless i.is_a? Array
114
+ @input_files = i
115
+ sanitize_input_files
116
+ end; alias set_pdf_file set_input_files # === set_pdf_file
117
+ alias set_pdf_files set_input_files # === set_pdf_files
118
+
119
+ # ========================================================================= #
120
+ # === sanitize_input_files
121
+ # ========================================================================= #
122
+ def sanitize_input_files
123
+ unless @input_files.empty?
124
+ set_page_number(
125
+ @input_files.select {|entry|
126
+ # ================================================================= #
127
+ # Get numbers.
128
+ # ================================================================= #
129
+ entry =~ /^\d+$/
130
+ }
131
+ )
132
+ # ===================================================================== #
133
+ # Select only .pdf files next.
134
+ # ===================================================================== #
135
+ @input_files.select! {|entry|
136
+ entry.end_with? '.pdf'
137
+ }
138
+ end
139
+ end
140
+
141
+ # ========================================================================= #
142
+ # === return_the_proper_range
143
+ #
144
+ # This method will return the proper range, such as:
145
+ #
146
+ # 1-9,11-z
147
+ #
148
+ # The ',' will be included in the return value by this method.
149
+ # ========================================================================= #
150
+ def return_the_proper_range
151
+ before_part = "1-#{(@remove_this_pdf_page - 1).to_s}"
152
+ after_part = (@remove_this_pdf_page + 1).to_s+'-z'
153
+ "#{before_part},#{after_part}"
154
+ end
155
+
156
+ # ========================================================================= #
157
+ # === overwrite_the_old_pdf_file?
158
+ # ========================================================================= #
159
+ def overwrite_the_old_pdf_file?
160
+ @overwrite_the_old_pdf_file
161
+ end
162
+
163
+ # ========================================================================= #
164
+ # === do_not_overwrite_the_original_pdf_file
165
+ # ========================================================================= #
166
+ def do_not_overwrite_the_original_pdf_file
167
+ @overwrite_the_old_pdf_file = false
168
+ end
169
+
170
+ # ========================================================================= #
171
+ # === name_of_the_output_file?
172
+ # ========================================================================= #
173
+ def name_of_the_output_file?(i)
174
+ if overwrite_the_old_pdf_file?
175
+ i.sub(/\.pdf$/,'')+'.pdf'
176
+ else
177
+ i.sub(/\.pdf$/,'')+'_output_file.pdf'
178
+ end
179
+ end; alias output? name_of_the_output_file? # === output?
180
+
181
+ # ========================================================================= #
182
+ # === input?
183
+ # ========================================================================= #
184
+ def input?
185
+ @input_files
186
+ end
187
+
188
+ # ========================================================================= #
189
+ # === process_each_pdf
190
+ # ========================================================================= #
191
+ def process_each_pdf
192
+ @input_files.each {|this_pdf_file|
193
+ # ===================================================================== #
194
+ # The command should be something like this:
195
+ #
196
+ # qpdf input.pdf --pages input.pdf 1-9,26-z -- outputfile.pdf
197
+ #
198
+ # See: https://superuser.com/a/1297395
199
+ # ===================================================================== #
200
+ if File.exist? this_pdf_file
201
+ opnn; e 'Now working on the .pdf file '
202
+ e
203
+ e sfancy(this_pdf_file)
204
+ e
205
+ opnn; e ', containing '+n_pages?(this_pdf_file).to_s+' pages.'
206
+ opnn; e 'The page that will be removed is: '+
207
+ steelblue(@remove_this_pdf_page.to_s)
208
+ case @use_this_program
209
+ when /qpdf/
210
+ _ = @use_this_program.dup
211
+ _ << " #{this_pdf_file}"
212
+ _ << " --pages #{this_pdf_file} "+return_the_proper_range
213
+ _ << " -- output.pdf"
214
+ when /hexapdf/
215
+ _ = @use_this_program.dup
216
+ _ << ' modify'
217
+ _ << " #{this_pdf_file}"
218
+ _ << ' -i '+return_the_proper_range.tr('z','e')
219
+ _ << " output.pdf"
220
+ end
221
+ e
222
+ esystem _
223
+ e
224
+ if overwrite_the_old_pdf_file?
225
+ output_file = 'output.pdf'
226
+ if File.exist? output_file
227
+ File.delete(this_pdf_file) if File.exist? this_pdf_file
228
+ move_file(output_file, this_pdf_file)
229
+ end
230
+ end
231
+ opnn; e 'The .pdf file at '+sfancy(this_pdf_file)+
232
+ rev+' now contains '+n_pages?(this_pdf_file).to_s+rev+
233
+ ' pages.'
234
+ else
235
+ opnn; e "{rev}#No file exists at `#{sfile(this_pdf_file)}#{rev}`."
236
+ end
237
+ }
238
+ end
239
+
240
+ # ========================================================================= #
241
+ # === remove_this_pdf_page?
242
+ # ========================================================================= #
243
+ def remove_this_pdf_page?
244
+ @remove_this_pdf_page
245
+ end; alias page_number? remove_this_pdf_page? # === page_number?
246
+
247
+ # ========================================================================= #
248
+ # === set_remove_this_pdf_page
249
+ # ========================================================================= #
250
+ def set_remove_this_pdf_page(
251
+ i = nil
252
+ )
253
+ if i
254
+ if i.is_a? Array
255
+ i = i.first
256
+ end
257
+ if i.nil?
258
+ # In this case use the default value.
259
+ i = DEFAULT_REMOVE_THIS_PDF_PAGE
260
+ end
261
+ @remove_this_pdf_page = i.to_i
262
+ end
263
+ end; alias set_page_number set_remove_this_pdf_page # === set_page_number
264
+
265
+ # ========================================================================= #
266
+ # === menu (menu tag)
267
+ # ========================================================================= #
268
+ def menu(
269
+ i = return_commandline_arguments_starting_with_hyphens
270
+ )
271
+ if i.is_a? Array
272
+ i.each {|entry| menu(entry) }
273
+ else
274
+ case i
275
+ # ===================================================================== #
276
+ # === deletethispageofthispdffile DONE*pdf --remove-this-page-number=430
277
+ #
278
+ # Remove specific pages from a given .pdf file.
279
+ #
280
+ # Usage example:
281
+ #
282
+ # pagegone DONE*pdf --remove-this-page-number=360
283
+ # pagegone DONE*pdf --remove=94
284
+ # pagegone DONE*pdf --remove=162
285
+ # pagegone DONE*pdf --remove=307
286
+ #
287
+ # ===================================================================== #
288
+ when /^-?-?remove(-|_)?this(-|_)?page(-|_)?number=(.+)$/i, # === $4
289
+ /^-?-?remove=(.+)$/i # === $1
290
+ _ = $1.to_s.dup
291
+ _ = $4.to_s.dup if $4
292
+ set_remove_this_pdf_page(_)
293
+ # ===================================================================== #
294
+ # === --help
295
+ # ===================================================================== #
296
+ when /help/
297
+ show_help
298
+ exit
299
+ end
300
+ end
301
+ end
302
+
303
+ # ========================================================================= #
304
+ # === run
305
+ # ========================================================================= #
306
+ def run
307
+ menu
308
+ process_each_pdf
309
+ end
310
+
311
+ end
312
+
313
+ # =========================================================================== #
314
+ # === PdfParadise.remove_this_page_of_that_pdf_file
315
+ #
316
+ # This method must be able to respond to symbols, such as
317
+ # :do_not_overwrite_the_original_pdf_file.
318
+ # =========================================================================== #
319
+ def self.remove_this_page_of_that_pdf_file(
320
+ this_page,
321
+ that_pdf_file,
322
+ &block
323
+ )
324
+ _ = PdfParadise::DeleteThisPageOfThisPdfFile.new { :do_not_run_yet }
325
+ _.set_pdf_file(that_pdf_file)
326
+ _.set_remove_this_pdf_page(this_page)
327
+ # ========================================================================= #
328
+ # === Handle blocks given to this method
329
+ # ========================================================================= #
330
+ if block_given?
331
+ yielded = yield
332
+ case yielded
333
+ # ======================================================================= #
334
+ # === :do_not_overwrite_the_original_pdf_file
335
+ # ======================================================================= #
336
+ when :do_not_overwrite_the_original_pdf_file
337
+ _.do_not_overwrite_the_original_pdf_file
338
+ end
339
+ end
340
+ _.run
341
+ end; self.instance_eval { alias remove_this_page_from_that_pdf_file remove_this_page_of_that_pdf_file } # === PdfParadise.remove_this_page_from_that_pdf_file
342
+
343
+ # =========================================================================== #
344
+ # === PdfParadise.delete_last_page_of_this_pdf_file
345
+ #
346
+ # Easier method-way to invoke the above class.
347
+ # =========================================================================== #
348
+ def self.delete_last_page_of_this_pdf_file(i = ARGV)
349
+ PdfParadise::DeleteThisPageOfThisPdfFile.new(i)
350
+ end
351
+
352
+ end
353
+
354
+ if __FILE__ == $PROGRAM_NAME
355
+ PdfParadise::DeleteThisPageOfThisPdfFile.new(ARGV)
356
+ end # deletethispageofthispdffile
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === PdfParadise::DjvuToPdf
6
+ #
7
+ # Convert a .djvu file to a .pdf file. This functionality depends on
8
+ # bin/ddjvu from the ddjvulibre package.
9
+ #
10
+ # Usage example:
11
+ #
12
+ # PdfParadise::DjvuToPdf.new(ARGV)
13
+ #
14
+ # =========================================================================== #
15
+ # require 'pdf_paradise/utility_scripts/djvu_to_pdf.rb'
16
+ # =========================================================================== #
17
+ require 'pdf_paradise/base/base.rb'
18
+
19
+ module PdfParadise
20
+
21
+ class DjvuToPdf < Base # === PdfParadise::DjvuToPdf
22
+
23
+ # ========================================================================= #
24
+ # === initialize
25
+ # ========================================================================= #
26
+ def initialize(
27
+ commandline_arguments = nil,
28
+ run_already = true
29
+ )
30
+ reset
31
+ set_commandline_arguments(
32
+ commandline_arguments
33
+ )
34
+ run if run_already
35
+ end
36
+
37
+ # ========================================================================= #
38
+ # === reset (reset tag)
39
+ # ========================================================================= #
40
+ def reset
41
+ super()
42
+ end
43
+
44
+ # ========================================================================= #
45
+ # === set_input
46
+ # ========================================================================= #
47
+ def set_commandline_arguments(i = '')
48
+ i = [i].flatten.compact
49
+ @commandline_arguments = i
50
+ end
51
+
52
+ # ========================================================================= #
53
+ # === commandline_arguments?
54
+ # ========================================================================= #
55
+ def commandline_arguments?
56
+ @commandline_arguments
57
+ end
58
+
59
+ # ========================================================================= #
60
+ # === first_argument?
61
+ # ========================================================================= #
62
+ def first_argument?
63
+ @commandline_arguments.first
64
+ end
65
+
66
+ # ========================================================================= #
67
+ # === run (run tag)
68
+ # ========================================================================= #
69
+ def run
70
+ first = first_argument?
71
+ cmd = 'ddjvu -format=pdf -quality=85 -verbose '+first+' '+
72
+ first.sub(/#{File.extname(first)}$/, '')+'.pdf'
73
+ esystem cmd
74
+ end
75
+
76
+ # ========================================================================= #
77
+ # === PdfParadise::DjvuToPdf[]
78
+ # ========================================================================= #
79
+ def self.[](i = '')
80
+ self.new(i)
81
+ end
82
+
83
+ end; end
84
+
85
+ if __FILE__ == $PROGRAM_NAME
86
+ PdfParadise::DjvuToPdf.new(ARGV)
87
+ end # djvu_to_pdf
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === PdfParadise::ExtractAllImagesFromThisPdfFile
6
+ # =========================================================================== #
7
+ # require 'pdf_paradise/utility_scripts/extract_all_images_from_this_pdf_file.rb'
8
+ # PdfParadise::ExtractAllImagesFromThisPdfFile.new
9
+ # =========================================================================== #
10
+ require 'pdf_paradise/base/base.rb'
11
+
12
+ module PdfParadise
13
+
14
+ class ExtractAllImagesFromThisPdfFile < PdfParadise::Base # === PdfParadise::ExtractAllImagesFromThisPdfFile
15
+
16
+ require 'pdf_paradise/utility_scripts/pdf_file_n_total_pages.rb'
17
+
18
+ # ========================================================================= #
19
+ # === NAMESPACE
20
+ # ========================================================================= #
21
+ NAMESPACE = inspect
22
+
23
+ # ========================================================================= #
24
+ # === initialize
25
+ # ========================================================================= #
26
+ def initialize(
27
+ commandline_arguments = ARGV,
28
+ run_already = true
29
+ )
30
+ reset
31
+ set_commandline_arguments(
32
+ commandline_arguments
33
+ )
34
+ case run_already
35
+ # ======================================================================= #
36
+ # === :do_not_run_yet
37
+ # ======================================================================= #
38
+ when :do_not_run_yet
39
+ run_already = false
40
+ end
41
+ make_sure_that_the_first_argument_is_not_a_symbol
42
+ run if run_already
43
+ end
44
+
45
+ # ========================================================================= #
46
+ # === reset (reset tag)
47
+ # ========================================================================= #
48
+ def reset
49
+ super()
50
+ end
51
+
52
+ # ========================================================================= #
53
+ # === make_sure_that_the_first_argument_is_not_a_symbol
54
+ # ========================================================================= #
55
+ def make_sure_that_the_first_argument_is_not_a_symbol
56
+ if @commandline_arguments
57
+ if @commandline_arguments.is_a? Symbol
58
+ @commandline_arguments = []
59
+ elsif @commandline_arguments.first.is_a? Symbol
60
+ @commandline_arguments.shift
61
+ end
62
+ end
63
+ end
64
+
65
+ # ========================================================================= #
66
+ # === opnn
67
+ # ========================================================================= #
68
+ def opnn
69
+ super(NAMESPACE)
70
+ end
71
+
72
+ # ========================================================================= #
73
+ # === determine_the_raw_name
74
+ #
75
+ # This method will determine the raw filename.
76
+ # ========================================================================= #
77
+ def determine_the_raw_name(
78
+ _ = first_argument?
79
+ )
80
+ if _ and _.is_a?(Array)
81
+ _ = _.first
82
+ end
83
+ if _
84
+ _ = _.dup # Work on a copy.
85
+ _.delete_suffix!('.pdf')
86
+ _ = File.basename(_) if _.include? '/'
87
+ end
88
+ # ======================================================================= #
89
+ # === @raw_name
90
+ # ======================================================================= #
91
+ @raw_name = _
92
+ end
93
+
94
+ # ========================================================================= #
95
+ # === do_extract_the_pdf_file
96
+ # ========================================================================= #
97
+ def do_extract_the_pdf_file(
98
+ i = first_argument?
99
+ )
100
+ if @raw_name.nil?
101
+ determine_the_raw_name(i) if i
102
+ end
103
+ if i and File.exist?(i)
104
+ cmd = "pdfimages -j #{i} #{@raw_name}"
105
+ e
106
+ esystem cmd
107
+ e
108
+ else
109
+ e "No file exists at `#{i}`."
110
+ false
111
+ end
112
+ end
113
+
114
+ # ========================================================================= #
115
+ # === run (run tag)
116
+ # ========================================================================= #
117
+ def run
118
+ _ = first_argument?
119
+ determine_the_raw_name(_)
120
+ if _ and File.exist?(_)
121
+ do_extract_the_pdf_file(_)
122
+ end
123
+ end
124
+
125
+ end; end
126
+
127
+ if __FILE__ == $PROGRAM_NAME
128
+ PdfParadise::ExtractAllImagesFromThisPdfFile.new(ARGV)
129
+ end # eimages