Βοήθεια για σκριπτ μετατροπής σε pdf

Καλησπέρα.

Δείτε αυτό:

    #!/bin/bash
    espeak -v el "Ηη μετατροπή, Άρχισε"
    notify-send -i /usr/share/pixmaps/dvd95/properties.png "Η μετατροπή άρχισε......."
    mogrify -format png *.jpg
    notify-send -i /usr/share/pixmaps/dvd95/run.png "Η μετατροπή τελείωσε"
    espeak -v el "Ηη ΜΕΤΑΤΡΟΠΉ, τελείωσε."

Δείτε επίσης αυτό:

    #!/bin/bash
    espeak -v el "Ηη μετατροπή, Άρχισε"
    notify-send -i /usr/share/pixmaps/dvd95/properties.png "Η μετατροπή άρχισε......."
    for file in *.3gp; do 
             mencoder -oac mp3lame -ovc lavc "$file" -o "`echo $file | sed -e 's/\.flv$/\.avi/'`"; 
    done

    notify-send -i /usr/share/pixmaps/dvd95/run.png "Η μετατροπή τελείωσε"
    espeak -v el "Ηη ΜΕΤΑΤΡΟΠΉ, τελείωσε."

Ευχαριστώ για την παρακολούθηση.

Στο θέμα μας τώρα. Γνωρίζω τι κάνουν αυτά τα σκριπτάκια (μα γι αυτό τα έχεις ρε μάπα! Φαντάζεσαι να μην ηξερες και τι κάνουν; !!!)
Τα έχω το καθένα ξεχωριστά σε ένα φάκελο. Το πρώτο ας πούμε το έχω στον φάκελο “Μετατροπή σε png” και το δεύτερο “Μετατροπή σε avi”.
(Τα έχω από παλιά. Τότε που το γιουτούμπ είχε βιντεάκια flv. Τα κατέβαζα για να τα δω στην tv αφού τα γράψω στο usbάκι. Έλα όμως που τα flv δεν έπαιζαν στην tv! Έπαιζαν τα avi τα mpeg4 και ίσως κάποια άλλα. Για κάποιον λόγο θεωρούσα τα avi καλύτερα - δεν ξέρω όμως αν ισχύει πραγματικά).
Αντί να βρω κάποιο γραφικό προγραμματάκι μετατροπής και επειδή ήθελα μαζική μετατροπή αρκετές φορές (και 10 αρχεία ίσως) είχα βρει αυτόν τον τρόπο που για μένα είναι εύκολος και … πως να το πω; Ταιριάζει ατην κουλτούρα μου.

Η διαδικασία πανεύκολη. Τσίμπαγα τα αρχεία και τα πέταγα μέσα στον φάκελο που βρίσκεται και το εν λόγω σκριπτάκι (του είχα και κυριλέ εικονίδιο να ξεχωρίζει. Του έδινα και όνομα τέτοιο ώστε να είναι πάντα πάνω αριστερά.)
Του έκανα κλικ και… βουαλά! Μου έβγαινε η ειδοποίηση όπως καταλάβατε με το notify-send και το espeak μου έλεγε με ρομποτική φωνή αυτό που βλέπετε. όταν μου έλεγε ότι τελείωσε αυτό σήμαινε ότι είχε ολοκληρωθεί πλήρως η διαδικασία.
Έχει ξεμείνει χρόνια και δεν το χρησιμοποιώ πια mpeg4 γαρ τα βίντεο του yt.

Μου ξαναπαρουσιάστηκε όμως η ανάγκη να κάνω το ίδιο, αλλά αυτή τη φορά για pdf μέσω του image magic,
Για παράδειγμα η εντολή

convert out-0005.png out-0006.png out-0007.png july19.pdf

μου παράγει το pdf που θέλω. Όμως μπορεί να θέλω να κάνω ένα άλλο που θα περιέχει 10 png αρχεία.

Το πως δουλεύουν τα σκριπτάκια που παρουσίασα… δεν το καταλαβαίνω ακριβώς. Δηλαδή το καταλαβαίνω ρε παιδί μου! Εντολή bash είναι. Αλλά αυτό που θέλω να καταφέρω είναι η εντολή να αφορά μόνο το συγκεκριμένο φάκελο και να μετατρέπει ότι βρίσκεται εκείνη τη στιγμή στο φάκελο. (Μετά θα τα σβήνω τα png προκειμένου να βάλω άλλα για νέα μετατροπή).

Βοηθήστε το φτωχομπινέ ρε σεις! Θα σας στείλω την ευχή μου! :grin:

Υ.Γ. Αν έχετε όρεξη να το κάνετε ακόμα πιο τσαχπίνικο και να γράφει το pdf σε άλλο φάκελο (κάποιον διπλανό ή και εκεί μέσα ας πούμε που να μπαίνουν μόνο τα προϊόντα της δραστηριότητας. Αν γίνεται και να σβήνονται τα png ή να τα βουτάει και να τα γράφει κι αυτά αλλού - γιατί μπορεί να ξαναχρειαστούν ας πούμε - θα ήταν ωραίο. Λέω τώρα!

Υ.Γ.2 Σας την σπάει πολύ έτσι πως περιγράφω; Εντάξει θέλω μεν να λύνω το ζήτημά μου κάθε φορά, αλλά θέλω και να μιλάω και να εκφράζω διάφορα. (Φόρουμ είμαστε γαμώτο). Αλλά μπορεί να κουράζει το κατανοώ. Ισχύει;

Ευχαριστώ ρε παίδες.

Αυτό μπορεί έυκολα να γίνει

convert out-*.png  $(LC_ALL=C date +"%B-%M").pdf
gvfs-trash *.png

Η τελευταία εντολή θα τα στείλει στα σκουπίδια. Το LC_ALL=C καταργεί τα ελληνικά. Αν το θες κάπου αλλού

out_dir="where"
pdf_file=$(LC_ALL=C date +"%B-%M").pdf
convert out-*.png  ${out_dir}/${pdf_file}
gvfs-trash out-*.png

Καλύτερα με μικρότερα αρχεία και με περισσότερη ασφάλεια (τα πάντα σε διπλά εισαγωγικά). Επίσης με την χρήση της ls μπορείς να τα βάλεις σε μια σειρά (πχ αν θέλεις κατα ημερομηνία)

out_dir="where"
pdf_file=$(LC_ALL=C date +"%B-%M").pdf
png_files=$(ls)
convert -compress jpeg "${png_files}"  "${out_dir}/${pdf_file}"
gvfs-trash "${png_files}"

PS: I love your style :smiley:

Δεν κατάλαβα, γιατί όπως το περιγράφεις και το απλό

convert *.png july19.pdf

είναι αρκετό

ή για να πάει σε διπλάνό

convert *.png ../διπλανός/july19.pdf

Για να μετακινήσεις τα png αλλού

mv *.png αλλού

ρίξε μια ματιά στο

1 Like

Στην πραγματικότητα και οι δύο τρόποι είναι λάθος :grinning:

Το λιγότερο που μπορείς να κάνεις είναι να χρησιμοποιείς πάντα τις μεταβλητές σε εισαγωγικά. Ναι η χρήση της ls είναι εντελώς λάθος πρακτική και θα αποτύχει αν το όνομα του αρχείου περιέχει παράξενους χαρακτήρες (κενά, εισαγωγικά, αλλαγές γραμμής). Αλλά αρκεί για ένα απλό script χωρίς να μπαίνεις στα βαθιά.

Για όποιον θέλει να μάθει περισσότερα, ας δεί το πρώτο pitfall

https://mywiki.wooledge.org/BashPitfalls

Είναι καλύτερα να χρησιμοποιείς κάποια άλλη scripting γλώσσα (ruby, python,…) και να κάνεις χρήση της execlp, ή κάποια άλλη κλήση συστήματος της οικογένειας, αφού πάρεις τα αρχεία σε κάποια δομή και τα ταξινομήσεις με την σειρά που τα θες.

Αλλά ψιλά γράμματα

οι μεταβλητές στο bash πάντα σε εισαγωγικά!
Τώρα για «απλές» περιπτώσεις, μια χαρά είναι οι μπαλαντέρ, η grep, η find, άντε και μια απλή for.
Για «σύνθετη» περίπτωση είχα φτιάξει προγραμματάκι σε python που έφτιαχνε σκριπτάκι σε bash :stuck_out_tongue: (πολλές απλές εντολές)
Υποθέτω θα υπήρχε κάποιος μαγικός τρόπος με awk αλλά σιγά μη κάτσω να μάθω awk.

Ειλικρινά, αυτό είναι η ποιο χαζή ιδέα που έχω ακούσει ποτέ :astonished: Αφού το έχεις σε μια καλύτερη και ποιο ασφαλή γλώσσα, γιατί να φτιάξει σε bash;

To awk δεν κάνει για τέτοιες δουλείες. Με το gawk ίσως καταφέρεις να κάνεις χειρισμό αρχείων, αλλά δεν είναι αυτή η δουλεία του.

Σε νεότερες εκδόσεις ImageMagick δεν θα μπορείς να κάνεις μετατροπή σε .pdf λόγω του ότι το ImageMagick για να δημιουργήσει το .pdf χρησιμοποιεί το GhostScript το οποίο με την σειρά του «είναι τρύπιο».
Οπότε, για να μην υπάρχει θέμα, προς το παρόν, δημιούργησαν ένα policy.xml το οποίο απαγορεύει τέτοιου είδους ενέργειες.

Μπορείς να το παρακάμψεις αλλά εκτίθεσαι.
Γνώμη μου βρες άλλο εργαλειάκι, που θα πρέπει να κάνεις εγκατάσταση, για να κάνεις δουλειά που σίγουρα θα την κάνει και καλύτερα.

Αυτή η εκδοχή κακόβουλων ενεργειών επηρεάζει Debian, Fedora, CentOS, FreeBSD, Gentoo, Red Hat Inc, SUSE Linux, Synology, Ubuntu και όλες τις παράγωγες διανομές. Ο μόνος τρόπος να είσαι 100% ασφαλής από αυτή την ευπάθεια είναι να αφαιρέσεις εντελώς το ghostscript με αποτέλεσμα όσα προγράμματα το χρησιμοποιούν, να σταματήσουν να λειτουργούν, βλ. ImageMagick.

Δεν ξέρω σε μένα λειτουργεί μια χαρά. Έχω imagemagick 7.0.8.64-1 και ghostscript 9.27-2.
Μήπως απλά το φτιάξαν;

This issue is addressed in Ghostscript version 9.24.

ναι το φτιάξαν.

Ένα γρήγορο που κάνει την δουλεία, και αν ξέρεις λίγο \LaTeX{} το φέρνεις στα μέτρα σου, όπως πχ πολλές φωτογραφίες ανα σελίδα, πρόσθετες πληροφορίες κλπ

#!/usr/bin/env bash

indir="/home/talos/tmp/images"
pdf_file="${indir}/$(LC_ALL=C date +"%B-%d").pdf"

base_file=$(mktemp -u "/tmp/png2pdf-XXX.")
latex_file="${base_file}.ltx"

cat <<End-of-latex >"${latex_file}"
\documentclass[a4paper]{article}
\usepackage{graphicx}
%\usepackage{geometry}
%\usepackage[obeyspaces]{url}
%\geometry{left=-0.8cm,textwidth=21.7cm,top=0cm,textheight=29.6cm}
\begin{document}
End-of-latex

for file in "${indir}"/*.{png,jpeg,jpg}; do
  #title=$(basename "${file}")
  {
    echo "\begin{figure}"
    echo "\centering"
    echo "\includegraphics{${file}}"
    #echo "\caption{${title}}"
    echo "\end{figure}"
    echo "\newpage"
  }>> "${latex_file}"
done

cat <<End-of-latex >> "${latex_file}"
\end{document}
End-of-latex

cat "${latex_file}"
cd "/tmp" || exit
pdflatex "${latex_file}"
mv "${base_file}.pdf" "${pdf_file}"
#xdg-open "${pdf_file}"

Έχει κάποιους περιορισμούς (πχ καθαρές καταλήξεις των αρχείων, και αν θέλεις τίτλους δεν θα πρέπει να περιέχουν χαρακτήρες που ερμηνεύει το \LaTeX{} αλλιώς, αλλά με λίγη προσοχή στα ονόματα των αρχείων θα δουλέψει μια χαρά.

Μακάρι, αλλά απότι κατάλαβα το ghostscript είναι ακόμη τρύπιο. Στην ουσία απλά δεν μπορείς να χρησιμοποιήσεις πλέον το imagemagick για να εκμεταλλευτείς τις αδυναμίες του ghostscript.

Επίσης αν είχε διορθωθεί δεν θα είχαν αφαιρέσει το workaround; :thinking:

Το ghostscript είναι μια ολόκληρη γλώσσα προγραμματισμού. Την λένε αλλιώς Postscript και δεν είχαν σχεδιαστεί ποτέ τα αρχεία .ps να είναι ασφαλή, μιας και αυτή ή γλώσσα είχε σχεδιαστεί να τρέχει σε εκτυπωτές. Τα αρχεία pdf βγάλανε το προγραμματιστικό κομμάτι, κρατήσανε το σχεδιαστικό μοντέλο και έγιναν ασφαλή, τουλάχιστον μέχρι που κάποιος αποφάσισε πως να βάλεις javascript μέσα στο pdf ήταν μια καλή ιδέα :grinning:

Προβλήματα με αυτό είχαμε από την προηγούμενη χιλιετία, και δεν παίρνει φτιάξιμο. Αλλά αν ελέγχεις εσύ την πηγή , όπως σε αυτή την περίπτωση είναι ασφαλές. Αλλά να πειράξεις το αρχείο και να παρακάμψεις τις ασφάλειες, δεν είναι μια καλή ιδέα.

1 Like

Καποιος βαρεθηκε να γραφει με το χερι στοιχεια στις PDF φορμες και αποφασισε με Javascript να κανει κατι αναλογο με το τι κανανε στα doc και docx με τις μακροεντολες VBA. Και τελος η ασφαλειααα.

Γι αυτο θα το λεω μεχρι να καταλαβουμε… ενα συστημα ειναι ασφαλες οταν ο χρηστης δεν ψαχνει ολες τις “ευκολες” λυσεις και κανει αυτο που πρεπει να κανει χωρις να ψαχνει για συντομευσεις.

Χωρις να ξερω πολλα για το PDF , αλλα αν το σωσεις σε PDF/A τοτε δεν μπορεις ουτε να το πειραξεις αλλα και η ασφαλεια και η συμβατοτητα ειναι στο φουλ.

Φανταζομαι οτι και ολα τα javascript και δεν ξερω εγω τι αλλο, φευγουν και μενει απλο PDF

1 Like

Ευχαριστώ πάρα πολύ.
Ψάχνω τώρα μια ώρα πως να κάνω την ημερομηνία να φαίνεται έτσι
19-9-2019.pdf

Επίσης δεν κατάλαβα το gvfs τι κάνει. Νόμιζα ότι κάνει απλό move. Αλλά στο man του βλέπω διάφορα. Τέλος πάντων. Αντί να τα πετάει τα png τα κάνω mv στο φάκελο where (εντάξει, τον ονόμασα “Φύλαξη εικόνων”.
Μια χαρά δουλεύει εκτός από το date που πειραματίζομαι ακόμα

Ωπ ΟΚ το βρήκα

#!/bin/bash
espeak -v el "Ηη μετατροπή, Άρχισε"
notify-send -i /usr/share/icons/Mint-X/mimetypes/48/application-pdf.png "Η μετατροπή άρχισε......."
convert *.png  $(date +"%d-%m-%Y\%H:%M").pdf
mv *.png Φύλαξη\ εικόνων/
notify-send -i /usr/share/icons/Mint-X/mimetypes/48/application-pdf.png "Η μετατροπή τελείωσε"
espeak -v el "Ηη ΜΕΤΑΤΡΟΠΉ, τελείωσε."

Για την ασφάλεια που λέτε, δεν κατάλαβα ποιοι είναι οι κίνδυνοι. Πάντως πράγματι πριν κάνω το νήμα δεν δούλευε η convert. Πήγα και άλλαξα κάτι στο /etc/ImageMagick-6/policy.xml και τώρα δουλεύει

policy domain="coder" rights="read|write" pattern="PDF" />