pdf_paradise 0.1.66
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of pdf_paradise might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/README.md +705 -0
- data/bin/automatic_pdf_title +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/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/set_main_book +7 -0
- data/bin/set_title_of_this_pdf_file +15 -0
- data/doc/README.gen +662 -0
- data/doc/todo/todo.md +7 -0
- data/lib/pdf_paradise/base/base.rb +239 -0
- data/lib/pdf_paradise/base/colours.rb +36 -0
- data/lib/pdf_paradise/commandline/commandline.rb +101 -0
- data/lib/pdf_paradise/commandline/help.rb +73 -0
- data/lib/pdf_paradise/commandline/menu.rb +142 -0
- data/lib/pdf_paradise/compress/compress_via_hexapdf.rb +27 -0
- data/lib/pdf_paradise/compress_this_pdf_file.rb +87 -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/djvu_to_pdf.rb +85 -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/delete_the_first_or_the_last_page_of_this_pdf_file/delete_the_first_or_the_last_page_of_this_pdf_file.rb +39 -0
- 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/gtk2/to_pdf/to_pdf.rb +32 -0
- data/lib/pdf_paradise/gui/gtk3/controller/controller.rb +212 -0
- data/lib/pdf_paradise/gui/gtk3/convert_pdf_to_text/convert_pdf_to_text.rb +34 -0
- data/lib/pdf_paradise/gui/gtk3/delete_the_first_or_the_last_page_of_this_pdf_file/delete_the_first_or_the_last_page_of_this_pdf_file.rb +39 -0
- 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/gtk3/statistics_widget/statistics_widget.rb +34 -0
- data/lib/pdf_paradise/gui/gtk3/to_pdf/to_pdf.rb +32 -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/statistics_widget/statistics_widget.rb +233 -0
- data/lib/pdf_paradise/gui/shared_code/convert_pdf_to_text/convert_pdf_to_text_module.rb +277 -0
- data/lib/pdf_paradise/gui/shared_code/delete_the_first_or_the_last_page_of_this_pdf_file/delete_the_first_or_the_last_page_of_this_pdf_file_module.rb +443 -0
- 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 +284 -0
- data/lib/pdf_paradise/gui/shared_code/split_pdf_file/split_pdf_file.css +0 -0
- data/lib/pdf_paradise/gui/shared_code/split_pdf_file/split_pdf_file_module.rb +294 -0
- data/lib/pdf_paradise/gui/shared_code/statistics_widget/statistics_widget_module.rb +349 -0
- data/lib/pdf_paradise/gui/shared_code/to_pdf/to_pdf_module.rb +281 -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 +444 -0
- data/lib/pdf_paradise/merge_pdf/menu.rb +63 -0
- data/lib/pdf_paradise/merge_pdf/merge_pdf.rb +306 -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/pdf_file_n_total_pages.rb +249 -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 +7 -0
- data/lib/pdf_paradise/requires/colours_and_esystem_and_save_file_and_fileutils_and_opn.rb +11 -0
- data/lib/pdf_paradise/requires/esystem_and_colours.rb +10 -0
- data/lib/pdf_paradise/requires/esystem_and_opn_and_colours.rb +8 -0
- data/lib/pdf_paradise/requires/require_the_whole_project.rb +28 -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 +318 -0
- data/lib/pdf_paradise/toplevel_methods/automatic_pdf_title.rb +55 -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 +19 -0
- data/lib/pdf_paradise/toplevel_methods/misc.rb +76 -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 +191 -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/rotate_pdf_file.rb +143 -0
- data/lib/pdf_paradise/toplevel_methods/to_pdf.rb +38 -0
- data/lib/pdf_paradise/utility_scripts/README.md +3 -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 +175 -0
- data/lib/pdf_paradise/utility_scripts/delete_first_page_of_this_pdf_file.rb +221 -0
- data/lib/pdf_paradise/utility_scripts/delete_last_page_of_this_pdf_file.rb +180 -0
- data/lib/pdf_paradise/utility_scripts/delete_this_page_of_this_pdf_file.rb +329 -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_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/split_pdf.rb +340 -0
- data/lib/pdf_paradise/utility_scripts/to_qdf.rb +82 -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 +276 -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/testing_pdf_paradise.rb +9 -0
- metadata +219 -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,19 @@
|
|
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/toplevel_methods/e.rb'
|
10
|
+
|
11
|
+
# ========================================================================= #
|
12
|
+
# === PdfParadise.esystem
|
13
|
+
# ========================================================================= #
|
14
|
+
def self.esystem(i)
|
15
|
+
e i
|
16
|
+
system i
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,76 @@
|
|
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.do_require_the_utility_scripts
|
7
|
+
# =========================================================================== #
|
8
|
+
module PdfParadise
|
9
|
+
|
10
|
+
require 'pdf_paradise/toplevel_methods/esystem.rb'
|
11
|
+
require 'pdf_paradise/requires/colours.rb'
|
12
|
+
|
13
|
+
# ========================================================================= #
|
14
|
+
# === PdfParadise.log_dir?
|
15
|
+
# ========================================================================= #
|
16
|
+
def self.log_dir?
|
17
|
+
'/tmp/pdf_paradise/'
|
18
|
+
end
|
19
|
+
|
20
|
+
# ========================================================================= #
|
21
|
+
# === PdfParadise.cd_to_the_log_directory
|
22
|
+
# ========================================================================= #
|
23
|
+
def self.cd_to_the_log_directory
|
24
|
+
Dir.chdir(PdfParadise.log_dir?)
|
25
|
+
end
|
26
|
+
|
27
|
+
# ========================================================================= #
|
28
|
+
# === PdfParadise.do_require_the_utility_scripts
|
29
|
+
# ========================================================================= #
|
30
|
+
def self.do_require_the_utility_scripts
|
31
|
+
Dir[project_base_directory?+'utility_scripts/*.rb'].each {|entry|
|
32
|
+
require "pdf_paradise/utility_scripts/#{File.basename(entry)}"
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
# ========================================================================= #
|
37
|
+
# === PdfParadise.report_which_pdf_viewer_is_in_use
|
38
|
+
#
|
39
|
+
# This method will simply report which pdf-viewer is in use.
|
40
|
+
# ========================================================================= #
|
41
|
+
def self.report_which_pdf_viewer_is_in_use
|
42
|
+
e "#{Colours.rev}The current pdf-viewer in use is "\
|
43
|
+
"#{Colours.sfancy(PdfParadise.pdf_viewer?)}."
|
44
|
+
end
|
45
|
+
|
46
|
+
# ========================================================================= #
|
47
|
+
# === PdfParadise.convert_this_pdf_file_into_a_png_file
|
48
|
+
# ========================================================================= #
|
49
|
+
def self.convert_this_pdf_file_into_a_png_file(
|
50
|
+
this_pdf_file
|
51
|
+
)
|
52
|
+
_ = 'gs -dNOPAUSE -q -r300 -sPAPERSIZE=a4 -dTextAlphaBits=4 -dDownScaleFactor=3 '.dup
|
53
|
+
_ << '-dGraphicsAlphaBits=4 -dUseTrimBox -sDEVICE=png16m -dBATCH '
|
54
|
+
_ << '-sOutputFile="C:\ingrid\pdf\outputfile%d.png" '
|
55
|
+
_ << '-c \"30000000 setvmthreshold\" '
|
56
|
+
_ << '-f "'+this_pdf_file+'" '
|
57
|
+
esystem _
|
58
|
+
end
|
59
|
+
|
60
|
+
# ========================================================================= #
|
61
|
+
# === PdfParadise.convert_postscript_to_pdf
|
62
|
+
#
|
63
|
+
# This method will convert a postscript-file into a .pdf file.
|
64
|
+
# ========================================================================= #
|
65
|
+
def self.convert_postscript_to_pdf(
|
66
|
+
i = 'filein.ps'
|
67
|
+
)
|
68
|
+
_ = 'gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=fileout.pdf '+i
|
69
|
+
esystem(_)
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
if __FILE__ == $PROGRAM_NAME
|
75
|
+
PdfParadise.convert_postscript_to_pdf(ARGV)
|
76
|
+
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
|
@@ -0,0 +1,191 @@
|
|
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
|
+
# =========================================================================== #
|
26
|
+
require 'pdf_paradise/base/base.rb'
|
27
|
+
|
28
|
+
module PdfParadise
|
29
|
+
|
30
|
+
class QueryPdfTitle < Base # === PdfParadise::QueryPdfTitle
|
31
|
+
|
32
|
+
# ========================================================================= #
|
33
|
+
# === NAMESPACE
|
34
|
+
# ========================================================================= #
|
35
|
+
NAMESPACE = inspect
|
36
|
+
|
37
|
+
# ========================================================================= #
|
38
|
+
# === initialize
|
39
|
+
# ========================================================================= #
|
40
|
+
def initialize(
|
41
|
+
i = nil,
|
42
|
+
run_already = true
|
43
|
+
)
|
44
|
+
reset
|
45
|
+
set_input(i)
|
46
|
+
if block_given?
|
47
|
+
yielded = yield
|
48
|
+
case yielded
|
49
|
+
when :be_verbose
|
50
|
+
@be_verbose = true
|
51
|
+
when :be_quiet
|
52
|
+
@be_verbose = false
|
53
|
+
end
|
54
|
+
end
|
55
|
+
run if run_already
|
56
|
+
end
|
57
|
+
|
58
|
+
# ========================================================================= #
|
59
|
+
# === reset (reset tag)
|
60
|
+
# ========================================================================= #
|
61
|
+
def reset
|
62
|
+
super()
|
63
|
+
# ======================================================================= #
|
64
|
+
# === @be_verbose
|
65
|
+
# ======================================================================= #
|
66
|
+
@be_verbose = true
|
67
|
+
# ======================================================================= #
|
68
|
+
# === @namespace
|
69
|
+
# ======================================================================= #
|
70
|
+
@namespace = NAMESPACE
|
71
|
+
end
|
72
|
+
|
73
|
+
# ========================================================================= #
|
74
|
+
# === set_input
|
75
|
+
# ========================================================================= #
|
76
|
+
def set_input(i = '')
|
77
|
+
i = [i] unless i.is_a? Array
|
78
|
+
@input = i
|
79
|
+
end
|
80
|
+
|
81
|
+
# ========================================================================= #
|
82
|
+
# === input?
|
83
|
+
# ========================================================================= #
|
84
|
+
def input?
|
85
|
+
@input
|
86
|
+
end; alias pdf_files? input? # === pdf_files?
|
87
|
+
|
88
|
+
# ========================================================================= #
|
89
|
+
# === iterate_over_the_input_files
|
90
|
+
# ========================================================================= #
|
91
|
+
def iterate_over_the_input_files
|
92
|
+
use_this_regex = /^Title\s*: (.+)$/
|
93
|
+
pdf_files?.each {|this_pdf_file|
|
94
|
+
if File.exist? this_pdf_file
|
95
|
+
sys_cmd = `exiftool #{this_pdf_file}`
|
96
|
+
begin
|
97
|
+
@title = sys_cmd.scan(use_this_regex).flatten.first
|
98
|
+
rescue ArgumentError => error
|
99
|
+
e 'An error happened for '+sfile(this_pdf_file)+'.'
|
100
|
+
pp error
|
101
|
+
pp error.class
|
102
|
+
exit
|
103
|
+
end
|
104
|
+
if @be_verbose
|
105
|
+
e "The title for `#{sfile(this_pdf_file)}` is:"
|
106
|
+
e
|
107
|
+
e " #{sfancy(@title)}"
|
108
|
+
e
|
109
|
+
end
|
110
|
+
else
|
111
|
+
opnn(namespace: @namespace); e "No file exists at `#{sfile(this_pdf_file)}`."
|
112
|
+
end
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
# ========================================================================= #
|
117
|
+
# === title?
|
118
|
+
# ========================================================================= #
|
119
|
+
def title?
|
120
|
+
@title
|
121
|
+
end
|
122
|
+
|
123
|
+
# ========================================================================= #
|
124
|
+
# === string?
|
125
|
+
#
|
126
|
+
# This variant will always return a String - an empty String if the .pdf
|
127
|
+
# file has no title set.
|
128
|
+
# ========================================================================= #
|
129
|
+
def string?
|
130
|
+
title?.to_s
|
131
|
+
end
|
132
|
+
|
133
|
+
# ========================================================================= #
|
134
|
+
# === run (run tag)
|
135
|
+
# ========================================================================= #
|
136
|
+
def run
|
137
|
+
iterate_over_the_input_files
|
138
|
+
end
|
139
|
+
|
140
|
+
# ========================================================================= #
|
141
|
+
# === PdfParadise::QueryPdfTitle[]
|
142
|
+
# ========================================================================= #
|
143
|
+
def self.[](i = '')
|
144
|
+
self.new(i)
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
# =========================================================================== #
|
150
|
+
# === PdfParadise.does_this_pdf_file_have_a_title?
|
151
|
+
#
|
152
|
+
# This method can be used to query whether a given .pdf file has a title
|
153
|
+
# or whether it does not.
|
154
|
+
#
|
155
|
+
# Usage example:
|
156
|
+
#
|
157
|
+
# PdfParadise.does_this_pdf_file_have_a_title? "foobar.pdf" # => true
|
158
|
+
#
|
159
|
+
# =========================================================================== #
|
160
|
+
def self.does_this_pdf_file_have_a_title?(i)
|
161
|
+
!query_pdf_title(i).empty?
|
162
|
+
end
|
163
|
+
|
164
|
+
# =========================================================================== #
|
165
|
+
# === PdfParadise.pdf_has_no_title?
|
166
|
+
# =========================================================================== #
|
167
|
+
def self.pdf_has_no_title?(i)
|
168
|
+
!does_this_pdf_file_have_a_title?(i)
|
169
|
+
end
|
170
|
+
|
171
|
+
# =========================================================================== #
|
172
|
+
# === PdfParadise.query_pdf_title
|
173
|
+
#
|
174
|
+
# The input to this method should be an existing .pdf file.
|
175
|
+
#
|
176
|
+
# Usage example:
|
177
|
+
#
|
178
|
+
# title = PdfParadise.query_pdf_title('/foobar.pdf') # => "Lecture 2 - Scaling"
|
179
|
+
#
|
180
|
+
# =========================================================================== #
|
181
|
+
def self.query_pdf_title(i)
|
182
|
+
PdfParadise::QueryPdfTitle.new(i) { :be_quiet }.string?
|
183
|
+
end; self.instance_eval { alias return_pdf_title_of query_pdf_title } # === PdfParadise.return_pdf_title
|
184
|
+
self.instance_eval { alias return_title_of_this_pdf_file query_pdf_title } # === PdfParadise.return_title_of_this_pdf_file
|
185
|
+
self.instance_eval { alias title? query_pdf_title } # === PdfParadise.title?
|
186
|
+
|
187
|
+
end
|
188
|
+
|
189
|
+
if __FILE__ == $PROGRAM_NAME
|
190
|
+
PdfParadise::QueryPdfTitle.new(ARGV)
|
191
|
+
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
|