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.
- checksums.yaml +7 -0
- data/README.md +933 -0
- data/bin/automatic_pdf_title +7 -0
- data/bin/burst_this_pdf_file +7 -0
- data/bin/combine_these_pdf_pages +7 -0
- data/bin/compress_via_hexapdf +7 -0
- data/bin/convert_markdown_to_pdf +7 -0
- data/bin/convert_pdf_to_text +7 -0
- data/bin/delete_first_page_of_this_pdf_file +7 -0
- data/bin/djvu_to_pdf +7 -0
- data/bin/merge_then_open +7 -0
- data/bin/n_pages +10 -0
- data/bin/open_main_pdf +7 -0
- data/bin/pdf_paradise +9 -0
- data/bin/rotate_pdf +7 -0
- data/bin/set_main_book +7 -0
- data/bin/set_title_of_this_pdf_file +15 -0
- data/doc/README.gen +871 -0
- data/doc/todo/todo.md +13 -0
- data/images/Logo_for_the_pdf_paradise_project.avif +0 -0
- data/lib/pdf_paradise/base/base.rb +344 -0
- data/lib/pdf_paradise/base/colours.rb +67 -0
- data/lib/pdf_paradise/colours/colours.rb +27 -0
- data/lib/pdf_paradise/commandline/commandline.rb +109 -0
- data/lib/pdf_paradise/commandline/help.rb +77 -0
- data/lib/pdf_paradise/commandline/menu.rb +173 -0
- data/lib/pdf_paradise/compress/compress_this_pdf_file.rb +108 -0
- data/lib/pdf_paradise/compress/compress_via_hexapdf.rb +27 -0
- data/lib/pdf_paradise/compress/compress_via_qpdf.rb +32 -0
- data/lib/pdf_paradise/constants/constants.rb +76 -0
- data/lib/pdf_paradise/convert_text_to_pdf.rb +94 -0
- data/lib/pdf_paradise/css/project.css +17 -0
- data/lib/pdf_paradise/fpdf/README.md +2 -0
- data/lib/pdf_paradise/fpdf/bookmark.rb +129 -0
- data/lib/pdf_paradise/fpdf/chinese.rb +454 -0
- data/lib/pdf_paradise/fpdf/fpdf.rb +1902 -0
- data/lib/pdf_paradise/fpdf/fpdf_eps.rb +138 -0
- data/lib/pdf_paradise/fpdf/makefont.rb +1794 -0
- data/lib/pdf_paradise/gui/README.md +6 -0
- data/lib/pdf_paradise/gui/fox/split_pdf_file.rb +77 -0
- data/lib/pdf_paradise/gui/gtk2/pdf_viewer/pdf_viewer.rb +34 -0
- data/lib/pdf_paradise/gui/gtk2/split_pdf_file/split_pdf_file.rb +34 -0
- data/lib/pdf_paradise/gui/gtk2/statistics_widget/statistics_widget.rb +34 -0
- data/lib/pdf_paradise/gui/gtk3/controller/controller.rb +214 -0
- data/lib/pdf_paradise/gui/gtk3/pdf_viewer/pdf_viewer.rb +34 -0
- data/lib/pdf_paradise/gui/gtk3/split_pdf_file/split_pdf_file.rb +34 -0
- 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
- 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
- data/lib/pdf_paradise/gui/libui/extract_all_images_from_this_pdf_file/extract_all_images_from_this_pdf_file.rb +223 -0
- 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
- data/lib/pdf_paradise/gui/libui/rotate_pdf_file/rotate_pdf_file.rb +219 -0
- data/lib/pdf_paradise/gui/libui/statistics_widget/statistics_widget.rb +233 -0
- data/lib/pdf_paradise/gui/shared_code/pdf_viewer/pdf_viewer.css +5 -0
- data/lib/pdf_paradise/gui/shared_code/pdf_viewer/pdf_viewer_module.rb +287 -0
- 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
- data/lib/pdf_paradise/gui/shared_code/split_pdf_file/split_pdf_file_module.rb +295 -0
- data/lib/pdf_paradise/gui/universal_widgets/convert_pdf_to_text/convert_pdf_to_text.rb +366 -0
- 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
- data/lib/pdf_paradise/gui/universal_widgets/statistics_widget/statistics_widget.rb +407 -0
- data/lib/pdf_paradise/gui/universal_widgets/to_pdf/to_pdf.rb +351 -0
- data/lib/pdf_paradise/hexapdf/001_rainbow_pattern_example.rb +0 -0
- data/lib/pdf_paradise/hexapdf/hexapdf.rb +123 -0
- data/lib/pdf_paradise/images/PDF_PARADISE_LOGO.png +0 -0
- data/lib/pdf_paradise/main_pdf/main_pdf.rb +474 -0
- data/lib/pdf_paradise/merge_pdf/menu.rb +63 -0
- data/lib/pdf_paradise/merge_pdf/merge_pdf.rb +307 -0
- data/lib/pdf_paradise/merge_pdf_namespace.rb +9 -0
- data/lib/pdf_paradise/merge_then_open/merge_then_open.rb +105 -0
- data/lib/pdf_paradise/prawn_addons/README.md +2 -0
- data/lib/pdf_paradise/prawn_addons/prawn_addons.rb +17 -0
- data/lib/pdf_paradise/project/project.rb +22 -0
- data/lib/pdf_paradise/remove_pdf_password.rb +391 -0
- data/lib/pdf_paradise/requires/batch_require_toplevel_files.rb +22 -0
- data/lib/pdf_paradise/requires/colours.rb +11 -0
- data/lib/pdf_paradise/requires/colours_and_esystem_and_save_file_and_fileutils_and_opn.rb +13 -0
- data/lib/pdf_paradise/requires/esystem_and_colours.rb +11 -0
- data/lib/pdf_paradise/requires/esystem_and_opn_and_colours.rb +10 -0
- data/lib/pdf_paradise/requires/require_the_whole_project.rb +30 -0
- data/lib/pdf_paradise/requires/require_utility_scripts.rb +9 -0
- data/lib/pdf_paradise/set_main_book.rb +156 -0
- data/lib/pdf_paradise/set_pdf_title.rb +220 -0
- data/lib/pdf_paradise/sinatra/embeddable_interface.rb +389 -0
- data/lib/pdf_paradise/toplevel_methods/convert_epub_to_pdf.rb +27 -0
- data/lib/pdf_paradise/toplevel_methods/convert_markdown_to_pdf.rb +45 -0
- data/lib/pdf_paradise/toplevel_methods/convert_ppt_to_pdf.rb +35 -0
- data/lib/pdf_paradise/toplevel_methods/e.rb +16 -0
- data/lib/pdf_paradise/toplevel_methods/esystem.rb +20 -0
- data/lib/pdf_paradise/toplevel_methods/misc.rb +228 -0
- data/lib/pdf_paradise/toplevel_methods/number_pages.rb +38 -0
- data/lib/pdf_paradise/toplevel_methods/opened_pdf_files.rb +221 -0
- data/lib/pdf_paradise/toplevel_methods/query_pdf_title.rb +201 -0
- data/lib/pdf_paradise/toplevel_methods/reduce_size_of_this_pdf_file.rb +46 -0
- data/lib/pdf_paradise/toplevel_methods/roebe.rb +17 -0
- data/lib/pdf_paradise/toplevel_methods/to_pdf.rb +12 -0
- data/lib/pdf_paradise/utility_scripts/README.md +3 -0
- data/lib/pdf_paradise/utility_scripts/automatic_pdf_title.rb +104 -0
- data/lib/pdf_paradise/utility_scripts/check_syntax_of_pdf_files.rb +106 -0
- data/lib/pdf_paradise/utility_scripts/combine_these_pdf_pages.rb +118 -0
- data/lib/pdf_paradise/utility_scripts/convert_pdf_to_text.rb +179 -0
- data/lib/pdf_paradise/utility_scripts/delete_last_page_of_this_pdf_file.rb +180 -0
- 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
- data/lib/pdf_paradise/utility_scripts/delete_this_page_of_this_pdf_file.rb +356 -0
- data/lib/pdf_paradise/utility_scripts/djvu_to_pdf.rb +87 -0
- data/lib/pdf_paradise/utility_scripts/extract_all_images_from_this_pdf_file.rb +129 -0
- data/lib/pdf_paradise/utility_scripts/extract_pdf_page.rb +283 -0
- data/lib/pdf_paradise/utility_scripts/pdf_file_n_total_pages.rb +348 -0
- data/lib/pdf_paradise/utility_scripts/pdf_optimizer.rb +111 -0
- data/lib/pdf_paradise/utility_scripts/pdf_statistics.rb +148 -0
- data/lib/pdf_paradise/utility_scripts/pdf_to_html.rb +75 -0
- data/lib/pdf_paradise/utility_scripts/remove_images.rb +110 -0
- data/lib/pdf_paradise/utility_scripts/rotate_pdf_file.rb +303 -0
- data/lib/pdf_paradise/utility_scripts/split_pdf.rb +364 -0
- data/lib/pdf_paradise/utility_scripts/to_pdf.rb +130 -0
- data/lib/pdf_paradise/utility_scripts/to_qdf.rb +66 -0
- data/lib/pdf_paradise/version/version.rb +19 -0
- data/lib/pdf_paradise/www/README.md +2 -0
- data/lib/pdf_paradise/www/sinatra/app.rb +304 -0
- data/lib/pdf_paradise/yaml/working_on_these_pdf_files.yml +4 -0
- data/lib/pdf_paradise.rb +5 -0
- data/pdf_paradise.gemspec +61 -0
- data/test/fpdf/001_minimal_example.rb +12 -0
- data/test/fpdf/002.pdf +0 -0
- data/test/fpdf/002_header_and_footer_example.rb +64 -0
- data/test/fpdf/003.pdf +98 -0
- data/test/fpdf/003_justified_paragraphs.rb +96 -0
- data/test/fpdf/file1.md +3 -0
- data/test/fpdf/file2.md +3 -0
- data/test/fpdf/test.pdf +0 -0
- data/test/testing_pdf_paradise.rb +12 -0
- metadata +239 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# === PdfParadise::DeleteTheFirstPageOfThisPdfFile
|
|
6
|
+
#
|
|
7
|
+
# This class can be used to delete the first page of a .pdf file.
|
|
8
|
+
#
|
|
9
|
+
# The user can pass one (or several) .pdf files to this class, and this
|
|
10
|
+
# class will then proceed to try to remove the very first .pdf page,
|
|
11
|
+
# in that given .pdf file. So, for instance, if the pdf-file at hand
|
|
12
|
+
# has 100 pages, the new .pdf file should have 99 pages, and the first
|
|
13
|
+
# page will be gone. That is the primary rationale this class follows.
|
|
14
|
+
#
|
|
15
|
+
# By default, the class will overwrite the original file; this behaviour
|
|
16
|
+
# depends on the constant SHALL_WE_OVERWRITE_THE_ORIGINAL_PDF_FILE and
|
|
17
|
+
# the user can toggle this to false, to NOT overwrite the original file.
|
|
18
|
+
#
|
|
19
|
+
# Note that the functionality made available through this class here
|
|
20
|
+
# depends on external tools, such as the binary called "qpdf" or the
|
|
21
|
+
# binary called "pdftk" or "hexapdf".
|
|
22
|
+
#
|
|
23
|
+
# Since as of July 2023 the class will also log its action, by storing
|
|
24
|
+
# the path to the last .pdf file that was modified.
|
|
25
|
+
#
|
|
26
|
+
# Usage example:
|
|
27
|
+
#
|
|
28
|
+
# PdfParadise::DeleteTheFirstPageOfThisPdfFile.new(ARGV)
|
|
29
|
+
#
|
|
30
|
+
# =========================================================================== #
|
|
31
|
+
# require 'pdf_paradise/utility_scripts/delete_the_first_page_of_this_pdf_file/delete_the_first_page_of_this_pdf_file.rb'
|
|
32
|
+
# PdfParadise.delete_the_first_page_of_this_pdf_file('foobar.pdf')
|
|
33
|
+
# PdfParadise::DeleteTheFirstPageOfThisPdfFile.new(ARGV)
|
|
34
|
+
# =========================================================================== #
|
|
35
|
+
require 'pdf_paradise/base/base.rb'
|
|
36
|
+
|
|
37
|
+
module PdfParadise
|
|
38
|
+
|
|
39
|
+
class DeleteTheFirstPageOfThisPdfFile < Base # === PdfParadise::DeleteTheFirstPageOfThisPdfFile
|
|
40
|
+
|
|
41
|
+
require 'pdf_paradise/utility_scripts/pdf_file_n_total_pages.rb'
|
|
42
|
+
|
|
43
|
+
# ========================================================================= #
|
|
44
|
+
# === SHALL_WE_OVERWRITE_THE_ORIGINAL_PDF_FILE
|
|
45
|
+
#
|
|
46
|
+
# Set this constant to false if you do not want to overwrite the
|
|
47
|
+
# original .pdf file.
|
|
48
|
+
# ========================================================================= #
|
|
49
|
+
SHALL_WE_OVERWRITE_THE_ORIGINAL_PDF_FILE = true
|
|
50
|
+
|
|
51
|
+
# ========================================================================= #
|
|
52
|
+
# === initialize
|
|
53
|
+
# ========================================================================= #
|
|
54
|
+
def initialize(
|
|
55
|
+
commandline_arguments = nil,
|
|
56
|
+
run_already = true,
|
|
57
|
+
&block
|
|
58
|
+
)
|
|
59
|
+
reset
|
|
60
|
+
case commandline_arguments
|
|
61
|
+
# ======================================================================= #
|
|
62
|
+
# === :do_not_run_yet
|
|
63
|
+
# ======================================================================= #
|
|
64
|
+
when :do_not_run_yet
|
|
65
|
+
commandline_arguments = []
|
|
66
|
+
run_already = false
|
|
67
|
+
end
|
|
68
|
+
set_commandline_arguments(
|
|
69
|
+
commandline_arguments
|
|
70
|
+
)
|
|
71
|
+
# ======================================================================= #
|
|
72
|
+
# === Handle blocks next
|
|
73
|
+
# ======================================================================= #
|
|
74
|
+
if block_given?
|
|
75
|
+
yielded = yield
|
|
76
|
+
case yielded
|
|
77
|
+
# ===================================================================== #
|
|
78
|
+
# === :be_quiet
|
|
79
|
+
# ===================================================================== #
|
|
80
|
+
when :be_quiet
|
|
81
|
+
set_be_quiet
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
run if run_already
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# ========================================================================= #
|
|
88
|
+
# === reset (reset tag)
|
|
89
|
+
# ========================================================================= #
|
|
90
|
+
def reset
|
|
91
|
+
super()
|
|
92
|
+
infer_the_namespace
|
|
93
|
+
reset_the_internal_hash
|
|
94
|
+
# ======================================================================= #
|
|
95
|
+
# === :work_on_these_files
|
|
96
|
+
# ======================================================================= #
|
|
97
|
+
@internal_hash[:work_on_these_files] = []
|
|
98
|
+
# ======================================================================= #
|
|
99
|
+
# === :array_backup_files
|
|
100
|
+
#
|
|
101
|
+
# We also keep track of backup fiels next.
|
|
102
|
+
# ======================================================================= #
|
|
103
|
+
@internal_hash[:array_backup_files] = []
|
|
104
|
+
# ======================================================================= #
|
|
105
|
+
# === :use_this_pdf_application
|
|
106
|
+
#
|
|
107
|
+
# The following variable may have any of the following values:
|
|
108
|
+
#
|
|
109
|
+
# :hexapdf
|
|
110
|
+
# :pdftk
|
|
111
|
+
# :qpdf
|
|
112
|
+
#
|
|
113
|
+
# It specifies which application can be used for deleting .pdf pages.
|
|
114
|
+
# ======================================================================= #
|
|
115
|
+
@internal_hash[:use_this_pdf_application] = :hexapdf # :qpdf # :hexapdf # :pdftk
|
|
116
|
+
# ======================================================================= #
|
|
117
|
+
# === :original_pwd
|
|
118
|
+
#
|
|
119
|
+
# Keep track of the original working directory.
|
|
120
|
+
# ======================================================================= #
|
|
121
|
+
@internal_hash[:original_pwd] = return_pwd
|
|
122
|
+
# ======================================================================= #
|
|
123
|
+
# === :shall_we_overwrite_the_original_pdf_file
|
|
124
|
+
# ======================================================================= #
|
|
125
|
+
@internal_hash[:shall_we_overwrite_the_original_pdf_file] =
|
|
126
|
+
SHALL_WE_OVERWRITE_THE_ORIGINAL_PDF_FILE
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# ========================================================================= #
|
|
130
|
+
# === use_this_pdf_application?
|
|
131
|
+
# ========================================================================= #
|
|
132
|
+
def use_this_pdf_application?
|
|
133
|
+
@internal_hash[:use_this_pdf_application]
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# ========================================================================= #
|
|
137
|
+
# === use_pdftk?
|
|
138
|
+
# ========================================================================= #
|
|
139
|
+
def use_pdftk?
|
|
140
|
+
use_this_pdf_application? == :pdftk
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# ========================================================================= #
|
|
144
|
+
# === array_backup_files?
|
|
145
|
+
# ========================================================================= #
|
|
146
|
+
def array_backup_files?
|
|
147
|
+
@internal_hash[:array_backup_files]
|
|
148
|
+
end; alias backups? array_backup_files? # === backups?
|
|
149
|
+
|
|
150
|
+
# ========================================================================= #
|
|
151
|
+
# === run (run tag)
|
|
152
|
+
# ========================================================================= #
|
|
153
|
+
def run
|
|
154
|
+
determine_the_input_files
|
|
155
|
+
_ = work_on_these_files?
|
|
156
|
+
if _.empty?
|
|
157
|
+
opne 'No .pdf file was assigned to this class.'
|
|
158
|
+
else
|
|
159
|
+
do_work_on_these_pdf_files(_)
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# ========================================================================= #
|
|
164
|
+
# === determine_the_input_files
|
|
165
|
+
#
|
|
166
|
+
# This method will specifically select for all .pdf files.
|
|
167
|
+
# ========================================================================= #
|
|
168
|
+
def determine_the_input_files(
|
|
169
|
+
commandline_arguments = commandline_arguments?
|
|
170
|
+
)
|
|
171
|
+
# ======================================================================= #
|
|
172
|
+
# Next, if i is empty, and we are on Roebe, we will use the default
|
|
173
|
+
# book, if a certain ENV variable exists AND if the file that points
|
|
174
|
+
# to that location also exists.
|
|
175
|
+
# ======================================================================= #
|
|
176
|
+
if commandline_arguments.empty? and is_on_roebe?
|
|
177
|
+
if ENV.has_key?('MAIN_BOOK') and
|
|
178
|
+
File.exist?(ENV['MAIN_BOOK'])
|
|
179
|
+
this_file = ENV['MAIN_BOOK'].dup
|
|
180
|
+
e "#{rev}As we are on roebe, we will use this file:"
|
|
181
|
+
e
|
|
182
|
+
e sfile(" #{this_file}")
|
|
183
|
+
e
|
|
184
|
+
commandline_arguments << this_file
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
commandline_arguments.map! {|entry|
|
|
188
|
+
entry = entry.to_s unless entry.is_a?(String)
|
|
189
|
+
entry = Dir[entry] if entry.include? '*'
|
|
190
|
+
entry
|
|
191
|
+
}
|
|
192
|
+
commandline_arguments.flatten!
|
|
193
|
+
_ = commandline_arguments.select {|entry|
|
|
194
|
+
entry.end_with?('.pdf') and File.file?(entry)
|
|
195
|
+
}
|
|
196
|
+
_.map! {|entry| File.absolute_path(entry) } if _ and !_.empty?
|
|
197
|
+
@internal_hash[:work_on_these_files] = _
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# ========================================================================= #
|
|
201
|
+
# === create_a_backup_file
|
|
202
|
+
# ========================================================================= #
|
|
203
|
+
def create_a_backup_file(
|
|
204
|
+
entry,
|
|
205
|
+
temp_dir = temp_dir?
|
|
206
|
+
)
|
|
207
|
+
e "#{rev}First, #{steelblue('a backup file will be created')}#{rev}."
|
|
208
|
+
# ======================================================================= #
|
|
209
|
+
# Next ensure that the temp-dir exists.
|
|
210
|
+
# ======================================================================= #
|
|
211
|
+
try_to_ensure_that_this_directory_exists(temp_dir)
|
|
212
|
+
target = temp_dir+File.basename(entry)
|
|
213
|
+
if File.exist? target # Delete the old .pdf copy here.
|
|
214
|
+
delete_file(target)
|
|
215
|
+
end
|
|
216
|
+
copy_file(entry, target)
|
|
217
|
+
if File.exist? target
|
|
218
|
+
e "#{rev}A backup-file (a copy) now exists at `#{sfile(target)}#{rev}`."
|
|
219
|
+
@internal_hash[:array_backup_files] << File.absolute_path(target)
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
# ========================================================================= #
|
|
224
|
+
# === work_on_these_files?
|
|
225
|
+
# ========================================================================= #
|
|
226
|
+
def work_on_these_files?
|
|
227
|
+
@internal_hash[:work_on_these_files]
|
|
228
|
+
end; alias input? work_on_these_files? # === input?
|
|
229
|
+
alias input_files? work_on_these_files? # === input_files?
|
|
230
|
+
|
|
231
|
+
# ========================================================================= #
|
|
232
|
+
# === do_work_on_these_pdf_files (main tag)
|
|
233
|
+
#
|
|
234
|
+
# This is the method that will delete the first page of a given .pdf
|
|
235
|
+
# file.
|
|
236
|
+
# ========================================================================= #
|
|
237
|
+
def do_work_on_these_pdf_files(
|
|
238
|
+
i = work_on_these_files?,
|
|
239
|
+
temp_dir = temp_dir?
|
|
240
|
+
)
|
|
241
|
+
i.each {|entry|
|
|
242
|
+
opnn { :no_trailing }
|
|
243
|
+
e; e
|
|
244
|
+
e "#{rev}Working on the file #{sfile(entry)} #{rev}next."
|
|
245
|
+
create_a_backup_file(entry)
|
|
246
|
+
backup_copy = backups?.last # Refer to the last entry there.
|
|
247
|
+
n_pages = PdfParadise.n_pages?(backup_copy)
|
|
248
|
+
e "#{rev}Now that a backup file has been created, it is time to "\
|
|
249
|
+
"work on that backup"
|
|
250
|
+
e "#{rev}copy. The .pdf currently has #{steelblue(n_pages)} #{rev}pages."
|
|
251
|
+
# ===================================================================== #
|
|
252
|
+
# Always cd into the target directory next - we have to remember
|
|
253
|
+
# the original working directory, though, so that we cd back
|
|
254
|
+
# into it:
|
|
255
|
+
# ===================================================================== #
|
|
256
|
+
if temp_dir and File.directory?(temp_dir)
|
|
257
|
+
@internal_hash[:original_pwd] = temp_dir
|
|
258
|
+
cd(temp_dir)
|
|
259
|
+
end
|
|
260
|
+
new_path = do_delete_the_first_page_of_this_pdf_file(backup_copy)
|
|
261
|
+
n_pages = PdfParadise.n_pages?(new_path)
|
|
262
|
+
e "#{rev}The .pdf file now has #{steelblue(n_pages)} #{rev}pages."
|
|
263
|
+
e 'It can be found at '+sfile(new_path)+'.' if File.exist?(new_path)
|
|
264
|
+
# ===================================================================== #
|
|
265
|
+
# === Keeping track of changes via a log-file
|
|
266
|
+
#
|
|
267
|
+
# Sine as of July 2023 we will also log into a .yml file. We will
|
|
268
|
+
# store the original .pdf file, though, as the modified .pdf
|
|
269
|
+
# file tends to be volatile.
|
|
270
|
+
# ===================================================================== #
|
|
271
|
+
if File.exist?(entry)
|
|
272
|
+
store_this_pdf_file_in_the_log_file(entry) # See the explanation above.
|
|
273
|
+
end
|
|
274
|
+
if @internal_hash[:shall_we_overwrite_the_original_pdf_file] and
|
|
275
|
+
File.exist?(new_path)
|
|
276
|
+
e "#{rev}The variable #{gold(':shall_we_overwrite_the_original_pdf_file')}"\
|
|
277
|
+
" #{rev}was set to"
|
|
278
|
+
e "#{rev}true, so the file at"
|
|
279
|
+
e "#{sfile(entry)}#{rev} will be overwritten now."
|
|
280
|
+
# =================================================================== #
|
|
281
|
+
# In this case we will overwrite the original .pdf file. The
|
|
282
|
+
# following call to mv() does this.
|
|
283
|
+
# =================================================================== #
|
|
284
|
+
delete_file(entry) if File.exist?(new_path)
|
|
285
|
+
mv(
|
|
286
|
+
new_path,
|
|
287
|
+
entry
|
|
288
|
+
)
|
|
289
|
+
end
|
|
290
|
+
}
|
|
291
|
+
cd(@internal_hash[:original_pwd]) # And go back to the initial working directory again.
|
|
292
|
+
end; alias process_each_pdf do_work_on_these_pdf_files # === process_each_pdf
|
|
293
|
+
|
|
294
|
+
# ========================================================================= #
|
|
295
|
+
# === shall_we_overwrite_the_original_pdf_file?
|
|
296
|
+
# ========================================================================= #
|
|
297
|
+
def shall_we_overwrite_the_original_pdf_file?
|
|
298
|
+
@internal_hash[:shall_we_overwrite_the_original_pdf_file]
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
# ========================================================================= #
|
|
302
|
+
# === store_this_pdf_file_in_the_log_file
|
|
303
|
+
# ========================================================================= #
|
|
304
|
+
def store_this_pdf_file_in_the_log_file(i)
|
|
305
|
+
PdfParadise.set_use_this_file(i)
|
|
306
|
+
what = YAML.dump(i)
|
|
307
|
+
# ======================================================================= #
|
|
308
|
+
# Find out the full, absolute path to the .yml file next:
|
|
309
|
+
# ======================================================================= #
|
|
310
|
+
into = File.absolute_path("#{log_directory?}last_modified_pdf_file.yml")
|
|
311
|
+
e "#{rev}Logging information into the file `#{sfile(into)}#{rev}`."
|
|
312
|
+
write_what_into(what, into)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
# ========================================================================= #
|
|
316
|
+
# === use_hexapdf?
|
|
317
|
+
# ========================================================================= #
|
|
318
|
+
def use_hexapdf?
|
|
319
|
+
use_this_pdf_application? == :hexapdf
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
# ========================================================================= #
|
|
323
|
+
# === name_of_the_output_file?
|
|
324
|
+
#
|
|
325
|
+
# This method will determine the output file of the .pdf file.
|
|
326
|
+
# ========================================================================= #
|
|
327
|
+
def name_of_the_output_file?(i)
|
|
328
|
+
i.delete_suffix('.pdf')+'_output_file.pdf'
|
|
329
|
+
end; alias output? name_of_the_output_file? # === output?
|
|
330
|
+
|
|
331
|
+
# ========================================================================= #
|
|
332
|
+
# === do_delete_the_first_page_of_this_pdf_file
|
|
333
|
+
# ========================================================================= #
|
|
334
|
+
def do_delete_the_first_page_of_this_pdf_file(
|
|
335
|
+
i,
|
|
336
|
+
use_this_pdf_application = @internal_hash[:use_this_pdf_application],
|
|
337
|
+
be_verbose = be_verbose?
|
|
338
|
+
)
|
|
339
|
+
use_this_pdf_application = use_this_pdf_application.to_s
|
|
340
|
+
# ======================================================================= #
|
|
341
|
+
# Determine the name of the (new) output file next:
|
|
342
|
+
# ======================================================================= #
|
|
343
|
+
name_of_the_output_file = name_of_the_output_file?(i)
|
|
344
|
+
if File.exist?(name_of_the_output_file) # Delete the output file first.
|
|
345
|
+
delete_file(name_of_the_output_file)
|
|
346
|
+
end
|
|
347
|
+
if i.include? ' '
|
|
348
|
+
i = '"'+i+'"'
|
|
349
|
+
end
|
|
350
|
+
# ======================================================================= #
|
|
351
|
+
# Store how many pages this .pdf file has.
|
|
352
|
+
# ======================================================================= #
|
|
353
|
+
has_n_pages = PdfParadise.n_pages_in_this_pdf_file?(i)
|
|
354
|
+
_ = ''.dup
|
|
355
|
+
_ << use_this_pdf_application
|
|
356
|
+
case _
|
|
357
|
+
# ======================================================================= #
|
|
358
|
+
# === Support for pdftk
|
|
359
|
+
# ======================================================================= #
|
|
360
|
+
when /pdftk/
|
|
361
|
+
_ << ' '+i+' cat 2-'+(has_n_pages.to_i).to_s+' '+
|
|
362
|
+
has_n_pages.to_s+'-end output '+
|
|
363
|
+
name_of_the_output_file
|
|
364
|
+
# ======================================================================= #
|
|
365
|
+
# === Support for hexapdf
|
|
366
|
+
# ======================================================================= #
|
|
367
|
+
when /hexapdf/
|
|
368
|
+
_ << ' modify '+i+' -i 2-e '+name_of_the_output_file
|
|
369
|
+
# ======================================================================= #
|
|
370
|
+
# === Support for qpdf
|
|
371
|
+
# ======================================================================= #
|
|
372
|
+
when /qpdf/
|
|
373
|
+
_ << ' '+'--pages '+i+' 2-'+(has_n_pages.to_i).to_s+' -- '+
|
|
374
|
+
i+' '+
|
|
375
|
+
name_of_the_output_file
|
|
376
|
+
else
|
|
377
|
+
e 'Unknown pdf handler: '+steelblue(_)
|
|
378
|
+
e 'Exiting.'
|
|
379
|
+
exit
|
|
380
|
+
end
|
|
381
|
+
e "Deleting the first page of this .pdf file next: "\
|
|
382
|
+
"#{sfile(i)}" if be_verbose
|
|
383
|
+
# ======================================================================= #
|
|
384
|
+
# Next, do the actual work as-such, via esystem() and a bit of padding:
|
|
385
|
+
# ======================================================================= #
|
|
386
|
+
e; e " #{_}"; system(_); e
|
|
387
|
+
return name_of_the_output_file
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
# ========================================================================= #
|
|
391
|
+
# === PdfParadise::DeleteTheFirstPageOfThisPdfFile[]
|
|
392
|
+
# ========================================================================= #
|
|
393
|
+
def self.[](i = ARGV)
|
|
394
|
+
new(i)
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
# =========================================================================== #
|
|
400
|
+
# === PdfParadise.use_which_pdf_application_for_deleting_the_first_page_of_a_pdf_file?
|
|
401
|
+
#
|
|
402
|
+
# Usage example:
|
|
403
|
+
#
|
|
404
|
+
# PdfParadise.use_which_pdf_application_for_deleting_the_first_page_of_a_pdf_file? # => :hexapdf
|
|
405
|
+
#
|
|
406
|
+
# =========================================================================== #
|
|
407
|
+
def self.use_which_pdf_application_for_deleting_the_first_page_of_a_pdf_file?
|
|
408
|
+
_ = PdfParadise::DeleteTheFirstPageOfThisPdfFile.new(:do_not_run_yet)
|
|
409
|
+
return _.use_this_pdf_application?
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
# =========================================================================== #
|
|
413
|
+
# === PdfParadise.delete_first_page_of_this_pdf_file
|
|
414
|
+
#
|
|
415
|
+
# Easier method-way to invoke the above class.
|
|
416
|
+
# =========================================================================== #
|
|
417
|
+
def self.delete_first_page_of_this_pdf_file(
|
|
418
|
+
i = ARGV, &block
|
|
419
|
+
)
|
|
420
|
+
PdfParadise::DeleteTheFirstPageOfThisPdfFile.new(i, &block)
|
|
421
|
+
end; self.instance_eval { alias remove_the_first_page_of_this_pdf_file delete_first_page_of_this_pdf_file } # === PdfParadise.remove_the_first_page_of_this_pdf_file
|
|
422
|
+
self.instance_eval { alias remove_first_page_of_this_pdf_file delete_first_page_of_this_pdf_file } # === PdfParadise.remove_first_page_of_this_pdf_file
|
|
423
|
+
self.instance_eval { alias delete_the_first_page_of_this_pdf_file delete_first_page_of_this_pdf_file } # === PdfParadise.delete_the_first_page_of_this_pdf_file
|
|
424
|
+
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
if __FILE__ == $PROGRAM_NAME
|
|
428
|
+
PdfParadise::DeleteTheFirstPageOfThisPdfFile.new(ARGV)
|
|
429
|
+
end # deletethefirstpageofthispdffile
|