pdf_paradise 0.3.20

Sign up to get free protection for your applications and to get access to all the features.
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,35 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'pdf_paradise/toplevel_methods/convert_ppt_to_pdf.rb'
6
+ # =========================================================================== #
7
+ require 'pdf_paradise/toplevel_methods/esystem.rb'
8
+
9
+ module PdfParadise
10
+
11
+ # ========================================================================= #
12
+ # === PdfParadise.convert_this_ppt_file_to_a_pdf_file
13
+ #
14
+ # This method will make use of libreoffice to convert .pptx or
15
+ # ppt files into .pdf files.
16
+ # ========================================================================= #
17
+ def self.convert_this_ppt_file_to_a_pdf_file(
18
+ i, use_this_format = 'pptx'
19
+ )
20
+ if i.is_a? Array
21
+ i.each {|entry|
22
+ convert_this_ppt_file_to_a_pdf_file(entry, use_this_format)
23
+ }
24
+ else
25
+ cmd = 'libreoffice --headless --invisible --convert-to pdf *.'+use_this_format
26
+ esystem cmd
27
+ end
28
+ end; self.instance_eval { alias convert_ppt_to_pdf convert_this_ppt_file_to_a_pdf_file } # === PdfParadise.convert_ppt_to_pdf
29
+ self.instance_eval { alias convert_pptx_to_pdf convert_this_ppt_file_to_a_pdf_file } # === PdfParadise.convert_pptx_to_pdf
30
+
31
+ end
32
+
33
+ if __FILE__ == $PROGRAM_NAME
34
+ PdfParadise.convert_this_ppt_file_to_a_pdf_file(ARGV)
35
+ end
@@ -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,20 @@
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/colours/colours.rb'
10
+ require 'pdf_paradise/toplevel_methods/e.rb'
11
+
12
+ # ========================================================================= #
13
+ # === PdfParadise.esystem
14
+ # ========================================================================= #
15
+ def self.esystem(i)
16
+ e "#{rev}#{i}"
17
+ system i
18
+ end
19
+
20
+ end
@@ -0,0 +1,228 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'pdf_paradise/toplevel_methods/misc.rb'
6
+ # PdfParadise.use_which_file?
7
+ # PdfParadise.djvu_to_pdf
8
+ # PdfParadise.do_require_the_utility_scripts
9
+ # =========================================================================== #
10
+ module PdfParadise
11
+
12
+ require 'pdf_paradise/toplevel_methods/esystem.rb'
13
+ require 'pdf_paradise/requires/colours.rb'
14
+
15
+ # ========================================================================= #
16
+ # === @use_this_file
17
+ #
18
+ # This variable can be used to keep track of the current .pdf file
19
+ # the PdfParadise gem operates on - for instance, from which the
20
+ # first page has been deleted from.
21
+ # ========================================================================= #
22
+ @use_this_file = nil
23
+
24
+ # ========================================================================= #
25
+ # === PdfParadise.use_which_file?
26
+ # ========================================================================= #
27
+ def self.use_which_file?
28
+ @use_this_file
29
+ end
30
+
31
+ # ========================================================================= #
32
+ # === PdfParadise.set_use_this_file
33
+ # ========================================================================= #
34
+ def self.set_use_this_file(i)
35
+ @use_this_file = i
36
+ end
37
+
38
+ # ========================================================================= #
39
+ # === PdfParadise.set_author
40
+ #
41
+ # This method can be used to set the author of a given .pdf file.
42
+ #
43
+ # The external tool called "exiftool" is required for this.
44
+ # ========================================================================= #
45
+ def self.set_author(
46
+ of_this_pdf_file,
47
+ this_author = 'foobar'
48
+ )
49
+ _ = 'exiftool -Author="'+this_author+'" '+of_this_pdf_file
50
+ esystem(_)
51
+ end
52
+
53
+ # ========================================================================= #
54
+ # === PdfParadise.n_pdf_files_in_this_directory
55
+ # ========================================================================= #
56
+ def self.n_pdf_files_in_this_directory(
57
+ i
58
+ )
59
+ Dir[i+'**/**.pdf'].size
60
+ end
61
+
62
+ # ========================================================================= #
63
+ # === PdfParadise.djvu_to_pdf
64
+ #
65
+ # This method can be used to convert a .djvu file to a .pdf file.
66
+ # ========================================================================= #
67
+ def self.djvu_to_pdf(i)
68
+ if i.is_a? Array
69
+ i = i.join(' ').strip
70
+ end
71
+ output_file = 'output_file.pdf'
72
+ esystem "djvups #{i} | ps2pdf - #{output_file}"
73
+ return output_file
74
+ end
75
+
76
+ # ========================================================================= #
77
+ # === PdfParadise.number_this_pdf_file
78
+ #
79
+ # This method can be used to number a given .pdf file - that is to add
80
+ # numbers to this file, typically on the bottom right area (by default).
81
+ #
82
+ # Specific usage example:
83
+ #
84
+ # PdfParadise.number_this_pdf_file('foobar.pdf')
85
+ #
86
+ # ========================================================================= #
87
+ def self.number_this_pdf_file(
88
+ this_pdf_file,
89
+ font_size_to_use = 30
90
+ )
91
+ [this_pdf_file].flatten.each {|pdf_file|
92
+ x = pdf_file
93
+ require 'combine_pdf'
94
+ pdf = CombinePDF.load(x)
95
+ pdf.number_pages(
96
+ location: [:bottom_right],
97
+ number_format: ' %s ',
98
+ border_width: 1,
99
+ font_size: font_size_to_use
100
+ )
101
+ pdf.save "numbered_pages.pdf"
102
+ }
103
+ end
104
+
105
+ # ========================================================================= #
106
+ # === PdfParadise.remove_html
107
+ #
108
+ # Usage example:
109
+ #
110
+ # PdfParadise.remove_html('<one>two</three>')
111
+ #
112
+ # ========================================================================= #
113
+ def self.remove_html(i)
114
+ i.gsub(
115
+ %r{<[^>]+>},
116
+ ''
117
+ )
118
+ end
119
+
120
+ # ========================================================================= #
121
+ # === PdfParadise.ensure_that_the_log_directory_exists
122
+ # ========================================================================= #
123
+ def self.ensure_that_the_log_directory_exists
124
+ require 'fileutils'
125
+ log_dir = PdfParadise.log_dir?
126
+ unless File.directory? log_dir
127
+ begin
128
+ FileUtils.mkdir_p(log_dir)
129
+ return log_dir # And return it here, just in case.
130
+ rescue LoadError; end
131
+ end
132
+ end
133
+
134
+ # ========================================================================= #
135
+ # === PdfParadise.cd_to_the_log_directory
136
+ # ========================================================================= #
137
+ def self.cd_to_the_log_directory
138
+ Dir.chdir(PdfParadise.log_dir?)
139
+ end; self.instance_eval { alias cd_to_the_log_dir cd_to_the_log_directory } # === PdfParadise.cd_to_the_log_dir
140
+
141
+ # ========================================================================= #
142
+ # === PdfParadise.do_require_the_utility_scripts
143
+ # ========================================================================= #
144
+ def self.do_require_the_utility_scripts
145
+ Dir[project_base_directory?+'utility_scripts/*.rb'].each {|entry|
146
+ require "pdf_paradise/utility_scripts/#{File.basename(entry)}"
147
+ }
148
+ # ======================================================================= #
149
+ # And some ad-hoc requires:
150
+ # ======================================================================= #
151
+ require 'pdf_paradise/utility_scripts/delete_the_first_page_of_this_pdf_file/delete_the_first_page_of_this_pdf_file.rb'
152
+ end
153
+
154
+ # ========================================================================= #
155
+ # === PdfParadise.report_which_pdf_viewer_is_in_use
156
+ #
157
+ # This method will simply report which pdf-viewer is in use.
158
+ # ========================================================================= #
159
+ def self.report_which_pdf_viewer_is_in_use
160
+ e "#{Colours.rev}The current pdf-viewer in use is "\
161
+ "#{Colours.sfancy(PdfParadise.pdf_viewer?)}."
162
+ end
163
+
164
+ # ========================================================================= #
165
+ # === PdfParadise.convert_this_pdf_file_into_a_png_file
166
+ # ========================================================================= #
167
+ def self.convert_this_pdf_file_into_a_png_file(
168
+ this_pdf_file
169
+ )
170
+ _ = 'gs -dNOPAUSE -q -r300 -sPAPERSIZE=a4 -dTextAlphaBits=4 -dDownScaleFactor=3 '.dup
171
+ _ << '-dGraphicsAlphaBits=4 -dUseTrimBox -sDEVICE=png16m -dBATCH '
172
+ _ << '-sOutputFile="C:\ingrid\pdf\outputfile%d.png" '
173
+ _ << '-c \"30000000 setvmthreshold\" '
174
+ _ << '-f "'+this_pdf_file+'" '
175
+ esystem _
176
+ end
177
+
178
+ # ========================================================================= #
179
+ # === PdfParadise.convert_postscript_to_pdf
180
+ #
181
+ # This method will convert a postscript-file into a .pdf file.
182
+ # ========================================================================= #
183
+ def self.convert_postscript_to_pdf(
184
+ i = 'filein.ps'
185
+ )
186
+ _ = 'gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=fileout.pdf '+i
187
+ esystem(_)
188
+ end
189
+
190
+ # ========================================================================= #
191
+ # === PdfParadise.is_on_windows?
192
+ # ========================================================================= #
193
+ def self.is_on_windows?
194
+ case RUBY_PLATFORM
195
+ when /win/,
196
+ /mingw/
197
+ true
198
+ else
199
+ false
200
+ end
201
+ end; self.instance_eval { alias on_windows? is_on_windows? } # === PdfParadise.on_windows?
202
+
203
+ require 'tmpdir'
204
+ # ========================================================================= #
205
+ # === PdfParadise.log_dir?
206
+ #
207
+ # This method must return a proper temp-dir (temporary directory),
208
+ # both on a Linux system, as well as on a windows system.
209
+ #
210
+ # Why is this necessary?
211
+ #
212
+ # Some operations of the pdf_paradise gem require access to such a
213
+ # a temp-directory.
214
+ # ========================================================================= #
215
+ def self.log_dir?
216
+ _ = '/tmp/pdf_paradise/' # This is the default. It should work on Linux.
217
+ _ = Dir.tmpdir
218
+ _ = ENV['TEMP_DIR'].dup if ENV['TEMP_DIR']
219
+ _ = _.dup
220
+ _ << '/pdf_paradise/' unless _.end_with?
221
+ return _.squeeze('/')
222
+ end
223
+
224
+ end
225
+
226
+ if __FILE__ == $PROGRAM_NAME
227
+ PdfParadise.convert_postscript_to_pdf(ARGV)
228
+ 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,221 @@
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
+ # Usage example from ruby code:
33
+ #
34
+ # array = PdfParadise.return_array_of_all_currently_opened_pdf_files(:extensive)
35
+ #
36
+ # ========================================================================= #
37
+ def self.return_array_of_all_currently_opened_pdf_files(
38
+ also_run_locate = false
39
+ )
40
+ case also_run_locate
41
+ # ======================================================================= #
42
+ # === :make_use_of_locate
43
+ # ======================================================================= #
44
+ when :make_use_of_locate,
45
+ :extensive
46
+ also_run_locate = true
47
+ # ======================================================================= #
48
+ # === :do_not_run_locate
49
+ # ======================================================================= #
50
+ when :do_not_run_locate
51
+ also_run_locate = false
52
+ end
53
+ ps_ax_result = `ps ax`.split("\n").map(&:strip)
54
+ array = ps_ax_result.select {|line|
55
+ line.include? '.pdf'
56
+ }.map {|inner_liner|
57
+ # ===================================================================== #
58
+ # A line here may look like this:
59
+ # 10970 pts/25 Sl 0:38 evince DONE_MolBiol_?bungen_SS2017_Transfection_english_060220.pdf
60
+ # For now we split on ' ' and just use the last part.
61
+ # ===================================================================== #
62
+ inner_line = inner_liner.split(' ').last.strip
63
+ # ===================================================================== #
64
+ # We will also try to locate the file, via "locate". This functionality
65
+ # depends on findutils' "locate" binary and a prior run of "updatedb".
66
+ # ===================================================================== #
67
+ if also_run_locate
68
+ run_this_command = "locate #{inner_line} 2>&1"
69
+ # =================================================================== #
70
+ # The command above ^^^ may look like this:
71
+ #
72
+ # locate DONE_foobar_abc_2006.pdf 2>&1
73
+ #
74
+ # =================================================================== #
75
+ result = `#{run_this_command}`.strip
76
+ inner_line = result if result and result.include? inner_line
77
+ if inner_line.include?('?') and !File.exist?(inner_line)
78
+ inner_line.tr!('?','ä')
79
+ end
80
+ end
81
+ inner_line
82
+ }
83
+ return array
84
+ end
85
+
86
+ # ========================================================================= #
87
+ # === PdfParadise.open_last_opened_pdf_files (open tag)
88
+ #
89
+ # This method will try to open all the last opened .pdf files. This
90
+ # functionality depends on having stored these .pdf files in a local
91
+ # file, which presently has to be done manually (e. g. via the
92
+ # commandline) rather than automatically.
93
+ #
94
+ # Invocation example from the commandline:
95
+ #
96
+ # pdfparadise --open-last-pdf-files
97
+ #
98
+ # ========================================================================= #
99
+ def self.open_last_opened_pdf_files(
100
+ pdf_viewer_to_use = PdfParadise.pdf_viewer?
101
+ )
102
+ _ = FILE_ALL_CURRENTLY_OPENED_PDF_FILES
103
+ if File.exist? _
104
+ dataset = YAML.load_file(_)
105
+ dataset.each {|this_pdf_file|
106
+ if File.exist? this_pdf_file
107
+ esystem pdf_viewer_to_use+' "'+this_pdf_file+'" &'
108
+ else
109
+ e "No file exists at `#{::Colours.sfile(this_pdf_file)}`."
110
+ end
111
+ }
112
+ else
113
+ e 'No file exists at `'+sfile(_)+'`.'
114
+ end
115
+ end
116
+
117
+ # ========================================================================= #
118
+ # === PdfParadise.show_last_opened_pdf_files
119
+ # ========================================================================= #
120
+ def self.show_last_opened_pdf_files
121
+ _ = FILE_ALL_CURRENTLY_OPENED_PDF_FILES
122
+ if File.exist? _
123
+ dataset = YAML.load_file(_)
124
+ if dataset.empty?
125
+ e 'No .pdf files have been registered as having been opened.'
126
+ else
127
+ e 'The following .pdf files have been opened:'
128
+ e
129
+ dataset.each {|this_pdf_file| e " #{Colours.sfile(this_pdf_file)}" }
130
+ e
131
+ end
132
+ else
133
+ e 'No file exists at `'+_+'`.'
134
+ end
135
+ end
136
+
137
+ # ========================================================================= #
138
+ # === PdfParadise.file_all_currently_opened_pdf_files?
139
+ # ========================================================================= #
140
+ def self.file_all_currently_opened_pdf_files?
141
+ FILE_ALL_CURRENTLY_OPENED_PDF_FILES
142
+ end
143
+
144
+ # ========================================================================= #
145
+ # === PdfParadise.store_all_currently_opened_pdf_files
146
+ #
147
+ # To invoke this method from the commandline, do:
148
+ #
149
+ # pdfparadise --store-open-pdf-files
150
+ #
151
+ # ========================================================================= #
152
+ def self.store_all_currently_opened_pdf_files
153
+ begin
154
+ require 'save_file'
155
+ rescue LoadError; end
156
+ array = return_array_of_all_currently_opened_pdf_files(:extensive)
157
+ if array.empty?
158
+ e 'No .pdf file is currently empty.'
159
+ else
160
+ # ===================================================================== #
161
+ # Designate where to store the open .pdf files.
162
+ # ===================================================================== #
163
+ into = FILE_ALL_CURRENTLY_OPENED_PDF_FILES
164
+ e 'All currently opened .pdf files will be stored into the file'
165
+ e
166
+ e " `#{Colours.sfile(into)}`."
167
+ e
168
+ e 'These are the .pdf files that will be stored:'
169
+ e
170
+ array.each {|this_file|
171
+ e " #{Colours.sfile(this_file)}"
172
+ }
173
+ e
174
+ what = YAML.dump(array)
175
+ SaveFile.write_what_into(what, into)
176
+ if is_on_roebe?
177
+ update_main_pdf_entries(array)
178
+ into = '/home/x/programming/ruby/src/pdf_paradise/lib/pdf_paradise/yaml/working_on_these_pdf_files.yml'
179
+ e 'As we are on roebe, we will also store into the pdf-paradise'
180
+ e "project's designated yaml file at:"
181
+ e
182
+ e " #{Colours.sfile(into)}"
183
+ e
184
+ SaveFile.write_what_into(what, into)
185
+ end
186
+ end
187
+ end; self.instance_eval { alias store_all_currently_open_pdf_files store_all_currently_opened_pdf_files } # === PdfParadise.store_all_currently_open_pdf_files
188
+ self.instance_eval { alias save_open_pdf_files store_all_currently_opened_pdf_files } # === PdfParadise.save_open_pdf_files
189
+
190
+ # ========================================================================= #
191
+ # === PdfParadise.update_main_pdf_entries
192
+ #
193
+ # This method will update entries for e. g. openpdf1, openpdf2 and
194
+ # so forth.
195
+ # ========================================================================= #
196
+ def self.update_main_pdf_entries(
197
+ use_this_array = :try_to_use_the_main_file
198
+ )
199
+ begin
200
+ require 'roebe/classes/open_pdf.rb'
201
+ rescue LoadError; end
202
+ unless use_this_array.is_a? Array
203
+ case use_this_array
204
+ when :try_to_use_the_main_file
205
+ _ = file_all_currently_opened_pdf_files?
206
+ if File.exist? _
207
+ use_this_array = File.readlines(_).map(&:strip)
208
+ end
209
+ end
210
+ end
211
+ use_this_array.each_with_index {|pdf_location, pdf_number_to_use| pdf_number_to_use += 1
212
+ Roebe.set_pdf_for_this_number(pdf_number_to_use, pdf_location)
213
+ }
214
+ end
215
+
216
+ end
217
+
218
+ if __FILE__ == $PROGRAM_NAME
219
+ pp PdfParadise.return_array_of_all_currently_opened_pdf_files
220
+ PdfParadise.store_all_currently_opened_pdf_files
221
+ end # openedpdffiles