Επεξεργασία αρχείων Word (docx) από κονσόλα.

Πρόσφατα έπρεπε να συμπληρώσω έναν μεγάλο αριθμό βεβαιώσεων για κάποιους σπουδαστές που παρακολούθησαν ένα σεμινάριο. Οι βεβαιώσεις ήταν σε φορμά docx από το Microsoft Word. Το μόνο που έπρεπε να αλλάζει στην βεβαίωση ήταν το όνομα. Όπως φαίνεται παρακάτω.

Word-1

Τα αρχεία docx δεν είναι κάτι άλλο από συμπιεσμένα αρχεία zip. Έτσι, αν αλλάξετε την επέκταση ενός αρχείου σε zip (π.χ. το βεβαίωση.docx που έχω εγώ σε βεβαίωση.zip) παρατηρούμε πως μπορούμε να το ανοίξουμε με οποιοδήποτε πρόγραμμα για συμπιεσμένα αρχεία (π.χ. winrar).

Rar-1

Μέσα στο συμπιεσμένο αυτό αρχείο υπάρχει ένας φάκελος με όνομα word. Μέσα στον φάκελο word υπάρχει ένα αρχείο με όνομα document.xml.

Rar-2

Αν αποσυμπιέσουμε το αρχείο και ανοίξουμε το αρχείο document.xml με έναν editor (όχι το notepad) θα δούμε μέσα στα πολλά, κάποια κομμάτια κειμένου που με ενδιαφέρουν.

document

Είναι το όνομα και επώνυμο. Το πρώτο γράμμα είναι είναι ξεχωριστά επειδή έχει μεγαλύτερη γραμματοσειρά. Όλα περικλείονται από “t><“. Π.χ. “t>ΠΩΝΥΜΟ<“.

Είχα στα χέρια μου την λίστα με τα ονόματα για τα οποία έπρεπε να εκδοθεί βεβαίωση. Σε απλό αρχείο κειμένου με μορφή που φαίνεται παρακάτω.

names-1

Αρχικά άλλαξα την βεβαίωση στην παρακάτω μορφή.

Word-2

Αν μπορούσα να γράψω ένα script που να διαβάζει την λίστα με τα ονόματα, να αποσυμπιέζει το αρχείο “Βεβαίωση.docx”, να βρίσκει και να αλλάζει στο αρχείο document.xml (για κάθε όνομα από την λίστα) τον όρο “ΧΧ” με το πρώτο γράμμα του επώνυμου, τον όρο “SURNAME” με το υπόλοιπο όνομα, τον όρο “ΥΥ” με το πρώτο γράμμα του ονόματος, τον όρο “NAMEA” με το υπόλοιπο όνομα (και το ίδιο για το δεύτερο όνομα αν υπάρχει), να συμπιέζει το σύνολο των αρχείων και να μετονομάζει το συμπιεσμένο αρχείο σε “ΕΠΩΝΥΜΟ ΟΝΟΜΑ.docx” θα κέρδιζα αρκετό χρόνο.

Μετά από μερικά λεπτά είχα το παρακάτω “quick n’ dirty” bash script. Είναι για GNU/Linux. Αν είστε σε Microsoft Windows, λυπάμαι αλλά…

#!/bin/bash
 
wordfile=$1
nameslist=$2
 
mkdir output
 
unzip "$wordfile" -d tempf
 
cp tempf/word/document.xml tempf/word/document.xml.bck
 
while read LINE || [[ -n "$LINE" ]]; do
 
  XX=`echo $LINE|awk '{print substr($1,0,1)}'`
  SURNAME=`echo $LINE|awk '{print substr($1,2)}'`
  YY=`echo $LINE|awk '{print substr($2,0,1)}'`
  NAMEA=`echo $LINE|awk '{print substr($2,2)}'`
  ZZ=`echo $LINE|awk '{print substr($3,0,1)}'`
  NAMEB=`echo $LINE|awk '{print substr($3,2)}'`
   
  eval sed -e 's/\>XX\</\>$XX\</' -e 's/\>SURNAME\</\>$SURNAME\</' -e 's/\>YY\</\>$YY\</' -e 's/\>NAMEA\</\>$NAMEA\</' -e 's/\>ZZ\</\>$ZZ\</' -e 's/\>NAMEB\</\>$NAMEB\</' tempf/word/document.xml.bck > tempf/word/document.xml
   
  cd tempf
   
  zip -r ../output/"$LINE.docx" * -x word/document.xml.bck
   
  cd ..
   
done < $nameslist
 
rm -rf tempf

Το script δέχεται δύο ορίσματα. Το όνομα του αρχείου του Word (βεβαίωση.docx) και το αρχείο με την λίστα ονομάτων. Το πρώτο πράγμα που κάνει το script είναι να αποσυμπιέσει το αρχείο του word σε έναν προσωρινό φάκελο (tempf). Στην συνέχεια δημιουργεί ένα αντίγραφο του αρχείου document.xml (το document.xml.bck). Στην συνέχεια ένας βρόχος διαβάζει κάθε γραμμή από το αρχείο με τα ονόματα. Η μεταβλητή LINE θα περιέχει κάθε φορά ένα αλφαριθμητικό του τύπου “ΕΠΩΝΥΜΟ ΟΝΟΜΑ”. Στην συνέχεια, με την βοήθεια της γλώσσας awk βρίσκει και αποθηκεύει στην μεταβλητή XX το πρώτο γράμμα του επώνυμου, στην μεταβλητή SURNAME το υπόλοιπο όνομα, στην μεταβλητή ΥΥ το πρώτο γράμμα του ονόματος, στην μεταβλητή NAMEA το υπόλοιπο επώνυμο (αντίστοιχα πράττει για τις μεταβλητές ZZ και NAMEB, εφόσον υπάρχει δεύτερο όνομα). Μετά με την εντολή sed εντοπίζει στο αρχείο document.xml.bck τα τμήματα που με ενδιαφέρουν να αλλάξω (π.χ. >ΝΑΜΕΑ<) και τα αλλάζει με το περιεχόμενο των αντίστοιχων μεταβλητών, και σώζει το αρχείο σαν document.xml. Στην συνέχεια συμπιέζει όλα τα αρχεία, εκτός του document.xml.bck, σε ένα αρχείο "ΕΠΩΝΥΜΟ ΟΝΟΜΑ.docx" σε έναν φάκελο με όνομα output. Θα δημιουργηθούν τόσα αρχεία όσα τα ονόματα στην λίστα.

Εκτελώντας το script (docx-edit) στον φάκελο που βρίσκεται το αρχείο βεβαίωση.docx και η λίστα με ονόματα (αρχείο names) δημιουργείται ένας φάκελος με όνομα output που θα περιέχει πολλά docx αρχεία.

Run-1

Run-2

Αν ανοίξουμε τα αρχεία με το Microsoft Word θα δούμε πως το αποτέλεσμα είναι ακριβώς αυτό που θέλαμε.

Run-3

Έτσι όμως έχουμε πολλά αρχεία για εκτύπωση, που είναι κουραστικό. Ευτυχώς μπορούμε να ενώσουμε πολύ εύκολα τα αρχεία αυτά σε ένα. Ανοίγουμε ένα από τα αρχεία με το Word και στην συνέχεια πάμε στο Εισαγωγή > Αντικείμενο > Κείμενο από αρχείο.

Run-4

Επιλέγουμε όλα τα υπόλοιπα αρχεία και πατάμε εισαγωγή.

Run-5

Αυτό ήταν. Ένα ενιαίο αρχείο έτοιμο για εκτύπωση.

Run-7

Σημείωση 1. Το συγκεκριμένο script είναι πολύ πρόχειρο και επιδέχεται πολλών βελτιώσεων.

Σημείωση 2. Τα Windows και το Word είναι μέσα από το Virtual Box της Oracle σε GNU/Linux.

Advertisements
This entry was posted in GNU/Linux, Miscellaneous and tagged , , , , , , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s