Réécriture de l’alias epdf vers pdf – manque encore la partie info, la liste des composants et l’extraction et on est bon

This commit is contained in:
Benjamin VAUDOUR 2021-12-21 20:57:02 +00:00
parent d0069b2c99
commit 958f4a22ce
2 changed files with 264 additions and 5 deletions

253
aliases/pdf.elv Normal file
View File

@ -0,0 +1,253 @@
use moi/util/format
use moi/util/pdf
use re
use str
fn -must-pdf {|file|
if (not (pdf:is-pdf $file)) {
fail (printf '%s nest pas un fichier pdf' $file)
}
}
fn -must-exist {|file|
if (pdf:not-exist $file) {
fail (printf '%s nexiste pas' $file)
}
}
fn -must-not-exist {|file|
if (pdf:exist $file) {
fail (printf '%s existe déjà' $file)
}
}
fn -must-pdf-exist {|file|
-must-pdf $file
-must-exist $file
}
fn -must-pdf-not-exist {|file|
-must-pdf $file
-must-not-exist $file
}
fn -must-valid {|v cond|
if (not ($cond $v)) {
fail (printf '%s: paramètre invalide' $v)
}
}
fn -out {|in suffix|
var out = (str:trim-suffix $in .pdf)
str:join '' [ $out $suffix ]
}
fn help {|@args|
cat $E:HOME/.config/elvish/aliases/pdf.help
}
fn decrypt {|@args|
var l = (count $args)
if (or (< $l 1) (> $l 3)) {
fail 'decrypt doit contenir entre 1 et 3 paramètres'
}
var in = $args[0]
var out = (-out $in _decrypted.pdf)
var passwd = []
-must-pdf-exist $in
if (> $l 1) {
set @passwd = $args[1]
if (> $l 2) {
set out = $args[2]
}
}
-must-pdf-not-exist $out
pdf:decrypt &out=$out $in $@passwd
}
fn rotate {|@args|
var l = (- (count $args) 1)
if (< $l 1) {
fail 'rotate doit contenir au moins 1 paramètres'
}
var in = $args[0]
var out = (-out $in _rotated.pdf)
if (pdf:is-pdf $args[$l]) {
set @args out = (all $args[1..])
}
-must-pdf-exist $in
-must-pdf-not-exist $out
each {|e|
-must-valid $e $pdf:is-rotate-selection~
} $args
pdf:rotate &keep=$true &out=$out $in $@args
}
fn merge {|@args|
var l = (- (count $args) 1)
if (< $l 1) {
fail 'merge doit contenir au moins 2 paramètres'
}
var @selection out = $@args
-must-pdf-not-exist $out
var has-in = $false
each {|e|
if (pdf:is-pdf $e) {
-must-exist $e
set has-in = $true
} else {
if (not $has-in) {
fail 'Une sélection doit être précédée dun fichier dentrée'
}
-must-valid $e $pdf:is-selection~
}
} $selection
pdf:cat &out=$out $@selection
}
fn unmerge {|@args|
var l = (- (count $args) 1)
if (< $l 1) {
fail 'unmerge doit contenir au moins 2 paramètres'
}
var in = $args[0]
var out = (-out $in _unmerged)
if (not (pdf:is-selection $args[$l])) {
set @args out = (all $args[1..])
}
-must-pdf-exist $in
-must-not-exist $out
each {|e|
-must-valid $e $pdf:is-selection~
} $args
pdf:uncat $in $out $@args
}
fn split {|@args|
var l = (- (count $args) 1)
if (< $l 1) {
fail 'split doit contenir au moins 2 paramètres'
}
var out = $args[$l]
set args = $args[..$l]
-must-not-exist $out
var s = 1
if (pdf:is-number $args[0]) {
set s @args = $@args
}
var t = (pdf:-t)
try {
pdf:cat &out=$t $@args
pdf:split &size=$s $t $out
} finally {
rm -f $t
}
}
fn split-at {|@args|
var l = (count $args)
if (!= $l 3) {
fail 'split-at doit contenir 3 paramètres'
}
var rg in out = $@args
-must-pdf-exist $in
-must-not-exist $out
-must-valid $rg {|e| re:match '^\d+(,\d+)*$' $e }
var b sel = 1 []
str:split ',' $rg | order | each {|s|
var e = (- $s 1)
if (== $b $e) {
set @sel = $@sel $b
set b = $s
} elif (< $b $e) {
set @sel = $@sel (printf '%d-%d' $b $e)
set b = $s
}
}
set @sel = $@sel (printf '%d-z' $b)
unmerge $in $@sel $out
}
fn zip {|@args|
var l = (- (count $args) 1)
if (< $l 1) {
fail 'zip doit contenir au moins 2 paramètres'
}
var @selection out = $@args
-must-pdf-not-exist $out
var has-in = $false
each {|e|
if (pdf:is-pdf $e) {
-must-exist $e
set has-in = $true
} else {
if (not $has-in) {
fail 'Une sélection doit être précédée dun fichier dentrée'
}
-must-valid $e $pdf:is-selection~
}
} $selection
pdf:cat &collate=$true &out=$out $@selection
}
fn unzip {|@args|
var l = (- (count $args) 1)
if (< $l 1) {
fail 'unzip doit contenir au moins 2 paramètres'
}
var in @sel out = $@args
var mod = 2
if (pdf:is-number $in) {
set mod = $in
if (eq (count $sel) 0) {
fail 'unzip doit contenir au moins 3 paramètres'
}
set in @sel = $@sel
}
-must-not-exist $out
var t = (pdf:-t)
try {
pdf:cat &out=$t $in $@sel
var n = (pdf:nb-pages $t)
mkdir $out
range 1 (+ 1 $mod) | each {|m|
var sel = (range 1 (+ $n 1) | each {|i|
var s = (% $i $mod)
if (== $s 0) {
set s = $mod
}
if (== $s $m) {
put $i
}
} | each $to-string~ | str:join ',')
pdf:cat &out=(printf '%s/%d.pdf' $out $m) $t $sel
}
} finally {
rm -f $t
}
}
edit:add-var pdf~ {|action @args|
var actions = [
&help=$help~
&decrypt=$decrypt~
&rotate=$rotate~
&merge=$merge~
&cat=$merge~
&unmerge=$unmerge~
&uncat=$unmerge~
&split=$split~
&split-at=$split-at~
&cut=$split-at~
&zip=$zip~
&unzip=$unzip~
#&info=$info~
#&list=$list~
#&extract=$extract~
]
if (not (has-key $actions $action)) {
fail (printf '%s: action inconnue' $action)
}
$actions[$action] $@args
}

View File

@ -3,12 +3,18 @@ Usage: epdf (commande) [options]
Commandes: Commandes:
merge: <inputfile> [<pagerange>] ... <outputfile> merge: <inputfile> [<pagerange>] ... <outputfile>
Fusionne la liste des pages sélectionnées dans le fichier de sortie Fusionne la liste des pages sélectionnées dans le fichier de sortie
cat: alias de merge
unmerge: <inputfile> <pagerange>... [<outputdir>]
Crée un nouveau pdf pour chaque pagerange défini
Défauts : <outputdir> = <inputfile>_unmerged
uncat: alias de unmerge
split: [<size>] <inputfile> [pagerange] .... <outputdir> split: [<size>] <inputfile> [pagerange] .... <outputdir>
Découpe les fichiers dentrée en fichiers de <size> pages Découpe les fichiers dentrée en fichiers de <size> pages
et place les découpes dans les fichiers <outputdir>/{1,2,…}.pdf et place les découpes dans les fichiers <outputdir>/{1,2,…}.pdf
Défauts : <size> = 1 Défauts : <size> = 1
split_at: <pageselect> <inputfile> [pagerange] ... <outputdir> split-at: <pageselect> <inputfile> [pagerange] ... <outputdir>
Découpe les fichiers dentrée aux pages indiquées (séparées par des virgules) Découpe les fichiers dentrée aux pages indiquées (séparées par des virgules)
cut: alias de split-at
zip: <inputfile> [<pagerange>] ... <outputfile> zip: <inputfile> [<pagerange>] ... <outputfile>
Réunit alternativement chaque page de chaque fichier dentrée Réunit alternativement chaque page de chaque fichier dentrée
dans le fichier de sortie dans le fichier de sortie
@ -16,13 +22,13 @@ Commandes:
Sépare alternativement chaque page dans les fichiers <outputdir>/{1,2,…}.pdf Sépare alternativement chaque page dans les fichiers <outputdir>/{1,2,…}.pdf
Le nombre de fichiers créé est indiqué par le modulo. Le nombre de fichiers créé est indiqué par le modulo.
Défauts : <modulo> = 2 Défauts : <modulo> = 2
rotate: <inputfile> <pagerange> ... rotate: <inputfile> <pagerange> ... [<outputfile>]
Copie le fichier en tournant les pages demandées Copie le fichier en tournant les pages demandées
Fichier de sortie : <input_file>_rotated.pdf Fichier de sortie par défaut : <inputfile>_rotated.pdf
decrypt: <inputfile> [<password>] decrypt: <inputfile> [<password>] [<outputfile>]
Retourne un fichier déchiffré. Si aucun mot de passe nest donné, tente le déchiffrement Retourne un fichier déchiffré. Si aucun mot de passe nest donné, tente le déchiffrement
avec un mot de passe à blanc avec un mot de passe à blanc
Fichier de sortie : <inputfile>_decrypted.pdf Fichier de sortie par défaut : <inputfile>_decrypted.pdf
list: (a(ttachments)|i(mages)|f(onts)) <inputfile> list: (a(ttachments)|i(mages)|f(onts)) <inputfile>
Affiche la liste des fichiers inclus en filtrant selon le type (pièce-jointe, image ou police) Affiche la liste des fichiers inclus en filtrant selon le type (pièce-jointe, image ou police)
extract: (a(ttachments)|i(mages)|f(onts)) <inputfile> <outputdir> extract: (a(ttachments)|i(mages)|f(onts)) <inputfile> <outputdir>