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,201 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === PdfParadise::QueryPdfTitle
6
+ #
7
+ # This class will simply report the title of a .pdf file (or more accurately,
8
+ # all .pdf files that were passed to this class).
9
+ #
10
+ # Presently this depends on exiftool, but there are other ways how to
11
+ # query the title of a .pdf file, such as via prawn.
12
+ #
13
+ # However had, for the time being, we will depend on exiftool.
14
+ #
15
+ # The shell-invocation command for this would be:
16
+ #
17
+ # exiftool *.pdf | grep Title
18
+ #
19
+ # Usage example:
20
+ #
21
+ # PdfParadise::QueryPdfTitle.new(ARGV)
22
+ #
23
+ # =========================================================================== #
24
+ # require 'pdf_paradise/toplevel_methods/query_pdf_title.rb'
25
+ # PdfParadise::QueryPdfTitle.new(ARGV)
26
+ # =========================================================================== #
27
+ require 'pdf_paradise/base/base.rb'
28
+
29
+ module PdfParadise
30
+
31
+ class QueryPdfTitle < Base # === PdfParadise::QueryPdfTitle
32
+
33
+ # ========================================================================= #
34
+ # === NAMESPACE
35
+ # ========================================================================= #
36
+ NAMESPACE = inspect
37
+
38
+ # ========================================================================= #
39
+ # === initialize
40
+ # ========================================================================= #
41
+ def initialize(
42
+ i = nil,
43
+ run_already = true
44
+ )
45
+ reset
46
+ set_input(i)
47
+ if block_given?
48
+ yielded = yield
49
+ case yielded
50
+ when :be_verbose
51
+ @be_verbose = true
52
+ when :be_quiet
53
+ @be_verbose = false
54
+ end
55
+ end
56
+ run if run_already
57
+ end
58
+
59
+ # ========================================================================= #
60
+ # === reset (reset tag)
61
+ # ========================================================================= #
62
+ def reset
63
+ super()
64
+ # ======================================================================= #
65
+ # === @be_verbose
66
+ # ======================================================================= #
67
+ @be_verbose = true
68
+ # ======================================================================= #
69
+ # === @namespace
70
+ # ======================================================================= #
71
+ @namespace = NAMESPACE
72
+ end
73
+
74
+ # ========================================================================= #
75
+ # === set_input
76
+ # ========================================================================= #
77
+ def set_input(i = '')
78
+ i = [i] unless i.is_a? Array
79
+ @input = i
80
+ end
81
+
82
+ # ========================================================================= #
83
+ # === input?
84
+ # ========================================================================= #
85
+ def input?
86
+ @input
87
+ end; alias pdf_files? input? # === pdf_files?
88
+
89
+ # ========================================================================= #
90
+ # === iterate_over_the_input_files
91
+ # ========================================================================= #
92
+ def iterate_over_the_input_files
93
+ use_this_regex = /^Title\s*: (.+)$/
94
+ pdf_files?.each {|this_pdf_file|
95
+ if File.exist? this_pdf_file
96
+ sys_cmd = `exiftool #{this_pdf_file}`
97
+ begin
98
+ @title = sys_cmd.scan(use_this_regex).flatten.first
99
+ rescue ArgumentError => error
100
+ e 'An error happened for '+sfile(this_pdf_file)+'.'
101
+ pp error
102
+ pp error.class
103
+ exit
104
+ end
105
+ if @be_verbose
106
+ e "#{rev}The title for `#{sfile(this_pdf_file)}#{rev}` is:"
107
+ e
108
+ e " #{sfancy(@title)}"
109
+ e
110
+ end
111
+ else
112
+ opnn(namespace: @namespace); e "No file exists at `#{sfile(this_pdf_file)}`."
113
+ end
114
+ }
115
+ end
116
+
117
+ # ========================================================================= #
118
+ # === title?
119
+ # ========================================================================= #
120
+ def title?
121
+ @title
122
+ end
123
+
124
+ # ========================================================================= #
125
+ # === string?
126
+ #
127
+ # This variant will always return a String - an empty String if the .pdf
128
+ # file has no title set.
129
+ # ========================================================================= #
130
+ def string?
131
+ title?.to_s
132
+ end
133
+
134
+ # ========================================================================= #
135
+ # === run (run tag)
136
+ # ========================================================================= #
137
+ def run
138
+ iterate_over_the_input_files
139
+ end
140
+
141
+ # ========================================================================= #
142
+ # === PdfParadise::QueryPdfTitle[]
143
+ # ========================================================================= #
144
+ def self.[](i = '')
145
+ self.new(i)
146
+ end
147
+
148
+ end
149
+
150
+ # =========================================================================== #
151
+ # === PdfParadise.does_this_pdf_file_have_a_title?
152
+ #
153
+ # This method can be used to query whether a given .pdf file has a title
154
+ # or whether it does not.
155
+ #
156
+ # Usage examples:
157
+ #
158
+ # PdfParadise.does_this_pdf_file_have_a_title? "foobar.pdf" # => true
159
+ # PdfParadise.has_title? "foobar.pdf" # => true
160
+ #
161
+ # =========================================================================== #
162
+ def self.does_this_pdf_file_have_a_title?(i)
163
+ !query_pdf_title(i).empty?
164
+ end; self.instance_eval { alias has_title? does_this_pdf_file_have_a_title? } # === PdfParadise.has_title?
165
+
166
+ # =========================================================================== #
167
+ # === PdfParadise.pdf_has_no_title?
168
+ # =========================================================================== #
169
+ def self.pdf_has_no_title?(i)
170
+ !does_this_pdf_file_have_a_title?(i)
171
+ end
172
+
173
+ # =========================================================================== #
174
+ # === PdfParadise.query_pdf_title
175
+ #
176
+ # The input to this method should be an existing .pdf file.
177
+ #
178
+ # It will call class QueryPdfTitle to determine the title of the .pdf
179
+ # file at hand.
180
+ #
181
+ # This method will return a String if a title can be found in the
182
+ # .pdf file at hand.
183
+ #
184
+ # Usage example:
185
+ #
186
+ # title = PdfParadise.query_pdf_title('/foobar.pdf') # => "Lecture 2 - Scaling"
187
+ # title = PdfParadise.return_title_of_this_pdf_file('')
188
+ #
189
+ # =========================================================================== #
190
+ def self.query_pdf_title(i)
191
+ PdfParadise::QueryPdfTitle.new(i) { :be_quiet }.string?
192
+ end; self.instance_eval { alias return_pdf_title_of query_pdf_title } # === PdfParadise.return_pdf_title
193
+ self.instance_eval { alias return_title_of_this_pdf_file query_pdf_title } # === PdfParadise.return_title_of_this_pdf_file
194
+ self.instance_eval { alias title? query_pdf_title } # === PdfParadise.title?
195
+ self.instance_eval { alias return_title_of_this_pdf_file query_pdf_title } # === PdfParadise.return_title_of_this_pdf_file
196
+
197
+ end
198
+
199
+ if __FILE__ == $PROGRAM_NAME
200
+ PdfParadise::QueryPdfTitle.new(ARGV)
201
+ end # querypdftitle
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'pdf_paradise/toplevel_methods/reduce_size_of_this_pdf_file.rb'
6
+ # =========================================================================== #
7
+ module PdfParadise
8
+
9
+ require 'pdf_paradise/toplevel_methods/e.rb'
10
+
11
+ begin
12
+ require 'esystem'
13
+ rescue LoadError; end
14
+
15
+ # ========================================================================= #
16
+ # === PdfParadise.reduce_size_of_this_pdf_file
17
+ #
18
+ # This method can be used to reduce the size of the passed .pdf file.
19
+ #
20
+ # This functionality depends on ghostscript (on the "gs" binary,
21
+ # specifically).
22
+ # ========================================================================= #
23
+ def self.reduce_size_of_this_pdf_file(this_pdf_file)
24
+ if this_pdf_file.is_a? Array
25
+ this_pdf_file.each {|entry|
26
+ reduce_size_of_this_pdf_file(entry)
27
+ }
28
+ else
29
+ guessed_name = File.basename(this_pdf_file).sub(/#{File.extname(this_pdf_file)}$/,'').dup
30
+ name_of_the_output_file = "output_#{guessed_name}".dup
31
+ name_of_the_output_file << '.pdf' unless name_of_the_output_file.end_with?('.pdf')
32
+ e
33
+ e 'Trying to reduce the size of the file '+this_pdf_file+' next:'
34
+ e
35
+ _ = 'gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 '\
36
+ '-dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH '\
37
+ '-sOutputFile='+name_of_the_output_file+' '+this_pdf_file
38
+ Esystem.esystem(_)
39
+ end
40
+ end; self.instance_eval { alias reduce_size reduce_size_of_this_pdf_file } # === PdfParadise.reduce_size
41
+
42
+ end
43
+
44
+ if __FILE__ == $PROGRAM_NAME
45
+ PdfParadise.reduce_size_of_this_pdf_file(ARGV)
46
+ end # reduce_size_of_this_pdf_file
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'pdf_paradise/toplevel_methods/roebe.rb'
6
+ # PdfParadise.is_on_roebe?
7
+ # =========================================================================== #
8
+ module PdfParadise
9
+
10
+ # ========================================================================= #
11
+ # === PdfParadise.is_on_roebe?
12
+ # ========================================================================= #
13
+ def self.is_on_roebe?
14
+ ENV['IS_ROEBE'].to_s == '1'
15
+ end
16
+
17
+ end
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'pdf_paradise/toplevel_methods/to_pdf.rb'
6
+ # PdfParadise.to_pdf
7
+ # =========================================================================== #
8
+ require 'pdf_paradise/utility_scripts/to_pdf.rb'
9
+
10
+ if __FILE__ == $PROGRAM_NAME
11
+ PdfParadise.to_pdf(ARGV)
12
+ end # topdf
@@ -0,0 +1,3 @@
1
+ This directory shall contain .rb files that can be used
2
+ practically, e. g. to delete the last page of a .pdf file,
3
+ and similar manipulations.
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === PdfParadise::AutomaticPdfTitle
6
+ #
7
+ # This class can automatically set the title of a .pdf file.
8
+ # =========================================================================== #
9
+ # require 'pdf_paradise/utility_scripts/automatic_pdf_title.rb'
10
+ # PdfParadise.autotitle(ARGV)
11
+ # =========================================================================== #
12
+ require 'pdf_paradise/base/base.rb'
13
+
14
+ module PdfParadise
15
+
16
+ class AutomaticPdfTitle < Base # === PdfParadise::AutomaticPdfTitle
17
+
18
+ require 'pdf_paradise/set_pdf_title.rb'
19
+
20
+ # ========================================================================= #
21
+ # === initialize
22
+ # ========================================================================= #
23
+ def initialize(
24
+ input_files = ARGV,
25
+ run_already = true
26
+ )
27
+ reset
28
+ set_commandline_arguments(
29
+ input_files
30
+ )
31
+ run if run_already
32
+ end
33
+
34
+ # ========================================================================= #
35
+ # === reset
36
+ # ========================================================================= #
37
+ def reset
38
+ super()
39
+ infer_the_namespace
40
+ end
41
+
42
+ # ========================================================================= #
43
+ # === automatic_pdf_title
44
+ # ========================================================================= #
45
+ def automatic_pdf_title(
46
+ i = commandline_arguments?
47
+ )
48
+ i.each {|this_pdf_file|
49
+ if File.exist? this_pdf_file
50
+ new_pdf_title = File.basename(this_pdf_file).
51
+ sub(/#{File.extname(this_pdf_file)}$/,'').
52
+ tr('_',' ')
53
+ # =================================================================== #
54
+ # Remove leading 'DONE_' substrings:
55
+ # =================================================================== #
56
+ if new_pdf_title.start_with? 'DONE'
57
+ new_pdf_title.sub!(/^DONE_/,'') if new_pdf_title.include? 'DONE_'
58
+ new_pdf_title.sub!(/^DONE /,'') if new_pdf_title.include? 'DONE '
59
+ end
60
+ e "#{rev}Setting the title of the .pdf file "\
61
+ "#{sfile(this_pdf_file)} #{rev}to:"
62
+ e
63
+ e " #{PdfParadise.darkolivegreen(new_pdf_title)}"
64
+ e
65
+ PdfParadise.set_pdf_title(
66
+ this_pdf_file,
67
+ new_pdf_title # First comes the file, then the title.
68
+ )
69
+ else
70
+ e "#{rev}No .pdf file exists at `#{sfile(this_pdf_file)}#{rev}`."
71
+ end
72
+ }
73
+ end
74
+
75
+ # ========================================================================= #
76
+ # === run (run tag)
77
+ # ========================================================================= #
78
+ def run
79
+ automatic_pdf_title(commandline_arguments?)
80
+ end
81
+
82
+ end
83
+
84
+ # =========================================================================== #
85
+ # === PdfParadise.automatic_pdf_title
86
+ #
87
+ # This method will automatically set the title of a .pdf file to its
88
+ # filename, with all '_' tokens replaced by ' ' tokens.
89
+ #
90
+ # The input to this method should be .pdf files that are existing locally.
91
+ # =========================================================================== #
92
+ def self.automatic_pdf_title(
93
+ of_this_pdf_file = ARGV
94
+ )
95
+ [of_this_pdf_file].flatten.compact.each {|this_pdf_file|
96
+ PdfParadise::AutomaticPdfTitle.new(this_pdf_file)
97
+ }
98
+ end; self.instance_eval { alias autotitle automatic_pdf_title } # === PdfParadise.autotitle
99
+
100
+ end
101
+
102
+ if __FILE__ == $PROGRAM_NAME
103
+ PdfParadise.automatic_pdf_title(ARGV)
104
+ end # apdf
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === PdfParadise::CheckSyntaxOfPdfFiles
6
+ #
7
+ # This class will check for the syntax of .pdf files.
8
+ #
9
+ # Usage example:
10
+ #
11
+ # PdfParadise::CheckSyntaxOfPdfFiles.new(ARGV)
12
+ #
13
+ # =========================================================================== #
14
+ # require 'pdf_paradise/utility_scripts/check_syntax_of_pdf_files.rb'
15
+ # PdfParadise::CheckSyntaxOfPdfFiles.new(ARGV)
16
+ # =========================================================================== #
17
+ require 'pdf_paradise/base/base.rb'
18
+
19
+ module PdfParadise
20
+
21
+ class CheckSyntaxOfPdfFiles < ::PdfParadise::Base # === PdfParadise::CheckSyntaxOfPdfFiles
22
+
23
+ # ========================================================================= #
24
+ # === initialize
25
+ # ========================================================================= #
26
+ def initialize(
27
+ i = ARGV,
28
+ run_already = true
29
+ )
30
+ reset
31
+ set_commandline_arguments(i)
32
+ run if run_already
33
+ end
34
+
35
+ # ========================================================================= #
36
+ # === reset (reset tag)
37
+ # ========================================================================= #
38
+ def reset
39
+ super()
40
+ end
41
+
42
+ # ========================================================================= #
43
+ # === run (run tag)
44
+ # ========================================================================= #
45
+ def run
46
+ _ = commandline_arguments?
47
+ work_on_these_files(_)
48
+ end
49
+
50
+ # ========================================================================= #
51
+ # === work_on_these_files
52
+ # ========================================================================= #
53
+ def work_on_these_files(i)
54
+ if i.is_a?(Array) and (i.first == :work_on_every_pdf_file_in_the_current_working_directory)
55
+ i = Dir['*.pdf']
56
+ end
57
+ i.each {|entry|
58
+ if File.file?(entry)
59
+ check_this_pdf_file(entry)
60
+ end
61
+ }
62
+ end
63
+
64
+ # ========================================================================= #
65
+ # === check_this_pdf_file
66
+ #
67
+ # This is the method that does the syntax-check, via qpdf.
68
+ #
69
+ # The specific commandline that will be invoked is:
70
+ #
71
+ # qpdf --check 09.11.2009_Scan_Dr_Kirchmayer_Statik_und_Edbebensicherheit.pdf
72
+ #
73
+ # ========================================================================= #
74
+ def check_this_pdf_file(
75
+ i
76
+ )
77
+ # ======================================================================= #
78
+ # Always work on an Array:
79
+ # ======================================================================= #
80
+ [i].flatten.compact.each {|this_pdf_file|
81
+ cmd_to_run = "qpdf --check #{this_pdf_file}"
82
+ e
83
+ e cmd_to_run
84
+ e
85
+ result = `#{cmd_to_run}`
86
+ if result.include? 'No syntax or stream encoding errors found'
87
+ e sfile(this_pdf_file)+rev+': all is fine with this .pdf file.'
88
+ else
89
+ e swarn('Some problem exists for ')+sfile(this_pdf_file)+rev
90
+ pp result
91
+ end
92
+ }
93
+ end
94
+
95
+ # ========================================================================= #
96
+ # === PdfParadise::CheckSyntaxOfPdfFiles[]
97
+ # ========================================================================= #
98
+ def self.[](i = ARGV)
99
+ new(i)
100
+ end
101
+
102
+ end; end
103
+
104
+ if __FILE__ == $PROGRAM_NAME
105
+ PdfParadise::CheckSyntaxOfPdfFiles.new(ARGV)
106
+ end # CheckSyntaxOfPdfFiles
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === PdfParadise::CombineThesePdfPages
6
+ # =========================================================================== #
7
+ # require 'pdf_paradise/utility_scripts/combine_these_pdf_pages.rb'
8
+ # =========================================================================== #
9
+ require 'pdf_paradise/base/base.rb'
10
+
11
+ module PdfParadise
12
+
13
+ class CombineThesePdfPages < PdfParadise::Base # === PdfParadise::CombineThesePdfPages
14
+
15
+ require 'pdf_paradise/utility_scripts/split_pdf.rb'
16
+
17
+ # ========================================================================= #
18
+ # === NAMESPACE
19
+ # ========================================================================= #
20
+ NAMESPACE = inspect
21
+
22
+ # ========================================================================= #
23
+ # === initialize
24
+ # ========================================================================= #
25
+ def initialize(
26
+ commandline_arguments = ARGV,
27
+ run_already = true
28
+ )
29
+ reset
30
+ set_commandline_arguments(
31
+ commandline_arguments
32
+ )
33
+ run if run_already
34
+ end
35
+
36
+ # ========================================================================= #
37
+ # === reset (reset tag)
38
+ # ========================================================================= #
39
+ def reset
40
+ super()
41
+ end
42
+
43
+ # ========================================================================= #
44
+ # === opnn
45
+ # ========================================================================= #
46
+ def opnn
47
+ super(NAMESPACE)
48
+ end
49
+
50
+ # ========================================================================= #
51
+ # === run (run tag)
52
+ # ========================================================================= #
53
+ def run
54
+ name_of_the_pdf_file = File.absolute_path(first_argument?)
55
+ unless File.exist? name_of_the_pdf_file
56
+ e 'Please provide a path to an existing .pdf file.'
57
+ return
58
+ end
59
+ _ = log_dir?
60
+ mkdir(_) unless File.directory? _
61
+ cd _
62
+ if File.exist? name_of_the_pdf_file
63
+ unless File.exist? File.absolute_path(File.basename(name_of_the_pdf_file))
64
+ e 'Copying the file '+name_of_the_pdf_file+'.'
65
+ copy_file(name_of_the_pdf_file)
66
+ end
67
+ if File.exist? File.basename(name_of_the_pdf_file)
68
+ name_of_the_pdf_file = File.absolute_path(File.basename(name_of_the_pdf_file))
69
+ end
70
+ end
71
+ these_pages_must_be_kept = commandline_arguments?[1]
72
+ # Must be converted into an array.
73
+ if these_pages_must_be_kept.include? ','
74
+ these_pages_must_be_kept = these_pages_must_be_kept.split(',')
75
+ else
76
+ these_pages_must_be_kept = [these_pages_must_be_kept]
77
+ end
78
+ these_pages_must_be_kept.map! {|entry| entry.to_i }
79
+ begin
80
+ require 'hexapdf'
81
+ pdf = HexaPDF::Document.open(name_of_the_pdf_file)
82
+ new_pdf = HexaPDF::Document.new
83
+ pdf.pages.each_with_index { |page, index| index += 1
84
+ if these_pages_must_be_kept.include? index
85
+ e 'Copying page page number: '+
86
+ steelblue(index.to_s)
87
+ new_pdf.pages << new_pdf.import(page)
88
+ end
89
+ }
90
+ @output_file_to_use = 'output.pdf'
91
+ @output_file_to_use = File.absolute_path(@output_file_to_use)
92
+ delete_file(@output_file_to_use) if File.exist? @output_file_to_use
93
+ e 'Storing into `'+@output_file_to_use+'`.'
94
+ new_pdf.write(
95
+ @output_file_to_use,
96
+ validate: false,
97
+ optimize: true
98
+ )
99
+ rescue LoadError
100
+ e 'HexaPDF is not available. Please install it via:'
101
+ e
102
+ e ' gem install hexapdf'
103
+ e
104
+ end
105
+ end
106
+
107
+ # ========================================================================= #
108
+ # === stored_where?
109
+ # ========================================================================= #
110
+ def stored_where?
111
+ @output_file_to_use
112
+ end; alias output_file_to_use? stored_where? # === output_file_to_use?
113
+
114
+ end; end
115
+
116
+ if __FILE__ == $PROGRAM_NAME
117
+ PdfParadise::CombineThesePdfPages.new(ARGV)
118
+ end # combinethesepdfpages