2021-12-21 20:57:02 +00:00
|
|
|
|
use moi/util/format
|
|
|
|
|
use moi/util/pdf
|
2021-12-22 12:32:38 +00:00
|
|
|
|
use math
|
|
|
|
|
use path
|
2021-12-21 20:57:02 +00:00
|
|
|
|
use re
|
|
|
|
|
use str
|
|
|
|
|
|
|
|
|
|
fn -must-pdf {|file|
|
|
|
|
|
if (not (pdf:is-pdf $file)) {
|
|
|
|
|
fail (printf '%s n’est pas un fichier pdf' $file)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn -must-exist {|file|
|
|
|
|
|
if (pdf:not-exist $file) {
|
|
|
|
|
fail (printf '%s n’existe 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 d’un fichier d’entré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 d’un fichier d’entré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
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-22 12:32:38 +00:00
|
|
|
|
fn -pts2cm {|v|
|
|
|
|
|
/ (math:round (* $v 3.52778)) 100
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn -date {|raw|
|
|
|
|
|
var y m d = $raw[2..6] $raw[6..8] $raw[8..10]
|
|
|
|
|
var h n s = $raw[10..12] $raw[12..14] $raw[14..16]
|
|
|
|
|
var rest = []
|
|
|
|
|
if (> (count $raw[16..]) 0) {
|
|
|
|
|
set @rest = (str:split "'" $raw[16..])
|
|
|
|
|
}
|
|
|
|
|
var tz = '+00:00'
|
|
|
|
|
if (> (count $rest) 0) {
|
|
|
|
|
var tz = $rest[0]
|
|
|
|
|
if (eq $tz[0] 'Z') {
|
|
|
|
|
set tz = $tz[1..]
|
|
|
|
|
}
|
|
|
|
|
if (eq $tz '') {
|
|
|
|
|
set tz = '00'
|
|
|
|
|
}
|
|
|
|
|
if (and (not-eq $tz[0] '+') (not-eq $tz[0] '-')) {
|
|
|
|
|
set tz = (printf '+%s' $tz)
|
|
|
|
|
}
|
|
|
|
|
var mm = '00'
|
|
|
|
|
if (and (> (count $rest) 1) (pdf:is-number $rest[1])) {
|
|
|
|
|
set mm = $rest[1]
|
|
|
|
|
}
|
|
|
|
|
set tz = (printf '%s:%s' $tz $mm)
|
|
|
|
|
}
|
|
|
|
|
var date = (printf ^
|
|
|
|
|
'%s-%s-%sT%s:%s:%sZ%s' ^
|
|
|
|
|
$y $m $d ^
|
|
|
|
|
$h $n $s ^
|
|
|
|
|
$tz)
|
|
|
|
|
date --date $date
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn info {|@args|
|
|
|
|
|
if (!= (count $args) 1) {
|
|
|
|
|
fail 'info doit contenir un paramètre'
|
|
|
|
|
}
|
|
|
|
|
var in @_ = $@args
|
|
|
|
|
-must-pdf-exist $in
|
|
|
|
|
var json = (pdf:json $in)
|
|
|
|
|
var objects = $json[objects]
|
|
|
|
|
var trailer = $objects[trailer]
|
|
|
|
|
var infos = $objects[$trailer[/Info]]
|
|
|
|
|
var pages = $json[pages]
|
|
|
|
|
var p1 = $objects[$pages[0][object]]
|
|
|
|
|
var w h = (all $p1[/MediaBox][2..] | each $-pts2cm~)
|
|
|
|
|
var layout = 'Portrait'
|
|
|
|
|
var title = ''
|
|
|
|
|
var subject = ''
|
|
|
|
|
var author = ''
|
|
|
|
|
var creator = ''
|
|
|
|
|
var producer = ''
|
|
|
|
|
var mdate = ''
|
|
|
|
|
var crypted = 'Non'
|
|
|
|
|
var hasform = 'Non'
|
|
|
|
|
if (> $w $h) {
|
|
|
|
|
set layout = 'Paysage'
|
|
|
|
|
}
|
|
|
|
|
if (has-key $infos '/Title') {
|
|
|
|
|
set title = $infos[/Title]
|
|
|
|
|
}
|
|
|
|
|
if (has-key $infos '/Subject') {
|
|
|
|
|
set subject = $infos[/Subject]
|
|
|
|
|
}
|
|
|
|
|
if (has-key $infos '/Author') {
|
|
|
|
|
set author = $infos[/Author]
|
|
|
|
|
}
|
|
|
|
|
if (has-key $infos '/Creator') {
|
|
|
|
|
set creator = $infos[/Creator]
|
|
|
|
|
}
|
|
|
|
|
if (has-key $infos '/Producer') {
|
|
|
|
|
set producer = $infos[/Producer]
|
|
|
|
|
}
|
|
|
|
|
if (has-key $infos '/ModDate') {
|
|
|
|
|
set mdate = (-date $infos[/ModDate])
|
|
|
|
|
}
|
|
|
|
|
if (pdf:encryption $in)[encrypted] {
|
|
|
|
|
set crypted = 'Oui'
|
|
|
|
|
}
|
|
|
|
|
if (pdf:form $in)[hasacroform] {
|
|
|
|
|
set hasform = 'Oui'
|
|
|
|
|
}
|
|
|
|
|
var data = [
|
|
|
|
|
[&k='Chemin' &v=(path:abs $in)]
|
|
|
|
|
[&k='Taille' &v=(format:size (stat -c '%s' $in))]
|
|
|
|
|
[&k='Version PDF' &v=(pdf:version $in)]
|
|
|
|
|
[&k='Nombre de pages' &v=(count $pages)]
|
|
|
|
|
[&k='Format des pages' &v=(printf '%sx%s cm (%s)' $w $h $layout)]
|
|
|
|
|
[&k='Titre' &v=$title]
|
|
|
|
|
[&k='Subjet' &v=$subject]
|
|
|
|
|
[&k='Auteur' &v=$author]
|
|
|
|
|
[&k='Créateur' &v=$creator]
|
|
|
|
|
[&k='producteur' &v=$producer]
|
|
|
|
|
[&k='Date de création' &v=(-date $infos[/CreationDate])]
|
|
|
|
|
[&k='Date de modification' &v=$mdate]
|
|
|
|
|
[&k='Chiffré' &v=$crypted]
|
|
|
|
|
[&k='Acroform' &v=$hasform]
|
|
|
|
|
]
|
|
|
|
|
var label = (format:repeat 21 ' ')
|
|
|
|
|
var @props = (format:column &align=right k $label) (format:column v $label)
|
|
|
|
|
set props = (format:update-props $props $data)
|
|
|
|
|
var sep = (format:repeat (+ $props[0][size] $props[1][size] 3) '.')
|
|
|
|
|
var @part = $data[..5] $data[5..12] $data[12..]
|
|
|
|
|
each {|d|
|
|
|
|
|
format:list &with-header=$false &csep=' : ' &recompute=$false $props $d
|
|
|
|
|
echo $sep
|
|
|
|
|
} $part
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-21 20:57:02 +00:00
|
|
|
|
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~
|
2021-12-22 12:32:38 +00:00
|
|
|
|
&info=$info~
|
2021-12-21 20:57:02 +00:00
|
|
|
|
#&list=$list~
|
|
|
|
|
#&extract=$extract~
|
|
|
|
|
]
|
|
|
|
|
if (not (has-key $actions $action)) {
|
|
|
|
|
fail (printf '%s: action inconnue' $action)
|
|
|
|
|
}
|
|
|
|
|
$actions[$action] $@args
|
|
|
|
|
}
|