Με περίπου ένα δισεκατομμύριο άτομα που χρησιμοποιούν το Microsoft Office, η μορφή DOCX είναι το πιο δημοφιλές de facto πρότυπο για την ανταλλαγή αρχείων εγγράφων μεταξύ γραφείων. Ο πλησιέστερος ανταγωνιστής του - η μορφή ODT - υποστηρίζεται μόνο από το Open / LibreOffice και ορισμένα προϊόντα ανοιχτού κώδικα, καθιστώντας το μακριά από το τυπικό. Η μορφή PDF δεν είναι ανταγωνιστής, επειδή δεν είναι δυνατή η επεξεργασία PDF και δεν περιέχουν πλήρη δομή εγγράφων, επομένως μπορούν να λάβουν περιορισμένες τοπικές αλλαγές, όπως υδατογραφήματα, υπογραφές και παρόμοια. Αυτός είναι ο λόγος για τον οποίο τα περισσότερα επιχειρηματικά έγγραφα δημιουργούνται σε μορφή DOCX. δεν υπάρχει καλή εναλλακτική λύση για την αντικατάστασή του.
Ενώ το DOCX είναι μια πολύπλοκη μορφή, ίσως θελήσετε να το αναλύσετε χειροκίνητα για απλούστερες εργασίες όπως ευρετηρίαση, μετατροπή σε TXT και πραγματοποίηση άλλων μικρών τροποποιήσεων. Θα ήθελα να σας δώσω αρκετές πληροφορίες για τα εσωτερικά DOCX, ώστε να μην χρειάζεται να αναφέρετε τις προδιαγραφές ECMA, ένα τεράστιο εγχειρίδιο 5.000 σελίδων.
Ο καλύτερος τρόπος για να κατανοήσετε τη μορφή είναι να δημιουργήσετε ένα απλό έγγραφο ενός λέξης με το MSWord και να παρατηρήσετε πώς η επεξεργασία του εγγράφου αλλάζει το υποκείμενο XML. Θα αντιμετωπίσετε ορισμένες περιπτώσεις όπου το DOCX δεν μορφοποιείται σωστά στο MS Word και δεν γνωρίζετε γιατί, ή θα συναντήσετε περιπτώσεις που δεν είναι προφανές πώς να δημιουργήσετε την επιθυμητή μορφοποίηση. Το να βλέπετε και να κατανοείτε ακριβώς τι συμβαίνει στο XML θα το βοηθήσει.
Δούλεψα για περίπου ένα χρόνο σε ένα συνεργατικό πρόγραμμα επεξεργασίας DOCX, CollabOffice και θέλω να μοιραστώ μερικές από αυτές τις γνώσεις με την κοινότητα προγραμματιστών. Σε αυτό το άρθρο θα εξηγήσω τη δομή αρχείων DOCX, συνοψίζοντας πληροφορίες που είναι διάσπαρτες στο Διαδίκτυο. Αυτό το άρθρο είναι ένας ενδιάμεσος μεταξύ της τεράστιας, περίπλοκης προδιαγραφής ECMA και των απλών διαδικτυακών σεμιναρίων που διατίθενται σήμερα. Μπορείτε να βρείτε τα αρχεία που συνοδεύουν αυτό το άρθρο στο toptal-docx
έργο στο δικό μου λογαριασμός github .
Ένα αρχείο DOCX είναι ένα αρχείο ZIP των αρχείων XML. Εάν δημιουργήσετε ένα νέο, κενό έγγραφο του Microsoft Word, γράψτε μια λέξη «Δοκιμή» μέσα και αποσυμπιέστε το περιεχόμενο, θα δείτε την ακόλουθη δομή αρχείων:
Παρόλο που έχουμε δημιουργήσει ένα απλό έγγραφο, η διαδικασία αποθήκευσης στο Microsoft Word έχει δημιουργήσει προεπιλεγμένα θέματα, ιδιότητες εγγράφου, πίνακες γραμματοσειρών και ούτω καθεξής, σε μορφή XML.
Όλα τα αρχεία σε ένα DOCX είναι αρχεία XML, ακόμη και αυτά με την επέκταση «.rels». ΤιτίβισμαΓια να ξεκινήσουμε, ας αφαιρέσουμε το αχρησιμοποίητο υλικό και να εστιάσουμε στο document.xml
, το οποίο περιέχει τα κύρια στοιχεία κειμένου. Όταν διαγράφετε ένα αρχείο, βεβαιωθείτε ότι έχετε διαγράψει όλες τις αναφορές σχέσεων σε αυτό από άλλα αρχεία xml. Εδώ είναι ένα παράδειγμα κωδικού-διαφοράς σχετικά με τον τρόπο με τον οποίο έχω εκκαθαρίσει τις εξαρτήσεις από το app.xml και το core.xml. Εάν έχετε ανεπίλυτες / λείπουν αναφορές, το MSWord θα θεωρήσει το αρχείο σπασμένο.
Ακολουθεί η δομή του απλουστευμένου, ελάχιστου εγγράφου DOCX (και εδώ είναι το έργο στο github ):
Ας το αναλύσουμε ανά αρχείο από εδώ, από την κορυφή:
Αυτό καθορίζει την αναφορά που λέει στο MS Word πού να ψάξει το περιεχόμενο του εγγράφου. Σε αυτήν την περίπτωση, αναφέρεται word/document.xml
:
[Content_Types].xml
Αυτό το αρχείο καθορίζει αναφορές σε πόρους, όπως εικόνες, ενσωματωμένες στο περιεχόμενο του εγγράφου. Το απλό έγγραφό μας δεν έχει ενσωματωμένους πόρους, επομένως η ετικέτα σχέσης είναι κενή:
Test
/word/styles.xml
περιέχει πληροφορίες σχετικά με τους τύπους μέσων μέσα στο έγγραφο. Εφόσον έχουμε μόνο περιεχόμενο κειμένου, είναι πολύ απλό:
My heading 1
Τέλος, εδώ είναι το κύριο XML με το περιεχόμενο κειμένου του εγγράφου. Έχω καταργήσει ορισμένες από τις δηλώσεις του χώρου ονομάτων για λόγους σαφήνειας, αλλά μπορείτε να βρείτε την πλήρη έκδοση του αρχείου στο έργο github. Σε αυτό το αρχείο θα διαπιστώσετε ότι ορισμένες από τις αναφορές χώρου ονομάτων στο έγγραφο δεν χρησιμοποιούνται, αλλά δεν πρέπει να τις διαγράψετε, επειδή το MS Word τις χρειάζεται.
Ακολουθεί το απλοποιημένο μας παράδειγμα:
styles.xml
Το κύριο nodere αντιπροσωπεύει το ίδιο το έγγραφο, περιέχει παραγράφους και τοποθετείται μέσα σε διαστάσεις σελίδας που ορίζονται από.
πόσα χρήματα βγάζει η μουσική βιομηχανία
είναι ένα χαρακτηριστικό που μπορείτε να αγνοήσετε. χρησιμοποιείται από εσωτερικά του MS Word.
Ας ρίξουμε μια ματιά σε ένα πιο περίπλοκο έγγραφο με τρεις παραγράφους. Έχω επισημάνει το XML με τα ίδια χρώματα στο στιγμιότυπο οθόνης από το Microsoft Word, ώστε να μπορείτε να δείτε τη συσχέτιση:
w:p/w:r/w:rPr/*
Ένα απλό έγγραφο αποτελείται από παραγράφους, μια παράγραφος αποτελείται από εκτελέσεις (μια σειρά κειμένου με την ίδια γραμματοσειρά, χρώμα κ.λπ.) και οι εκτελέσεις αποτελούνται από χαρακτήρες (όπως). Οι ετικέτες μπορεί να έχουν αρκετούς χαρακτήρες μέσα και μπορεί να υπάρχουν μερικοί στην ίδια πορεία.
Και πάλι, μπορούμε να αγνοήσουμε.
Οι βασικές ιδιότητες κειμένου είναι γραμματοσειρά, μέγεθος, χρώμα, στυλ και ούτω καθεξής. Υπάρχουν περίπου 40 ετικέτες που καθορίζουν την εμφάνιση κειμένου. Όπως μπορείτε να δείτε στο παράδειγμα τριών παραγράφων μας, κάθε εκτέλεση έχει τις δικές της ιδιότητες μέσα, προσδιορίζοντας και τολμηρή.
Ένα σημαντικό πράγμα που πρέπει να σημειωθεί είναι ότι οι ιδιότητες κάνουν διάκριση μεταξύ των δύο ομάδων χαρακτήρων, του κανονικού και του σύνθετου σεναρίου (αραβικά, για παράδειγμα) και ότι οι ιδιότητες έχουν διαφορετική ετικέτα ανάλογα με τον τύπο του χαρακτήρα που επηρεάζει.
Οι περισσότερες κανονικές ετικέτες ιδιοτήτων σεναρίου έχουν μια αντίστοιχη σύνθετη ετικέτα σεναρίου με ένα πρόσθετο 'C' που ορίζει ότι η ιδιότητα είναι για σύνθετα σενάρια. Για παράδειγμα: (πλάγια) γίνεται, και η έντονη ετικέτα για κανονικό σενάριο ,, γίνεται για σύνθετο σενάριο.
Υπάρχει μια ολόκληρη γραμμή εργαλείων στο Microsoft Word αφιερωμένη σε στυλ: κανονική, χωρίς διαστήματα, επικεφαλίδα 1, επικεφαλίδα 2, τίτλος και ούτω καθεξής. Αυτά τα στυλ αποθηκεύονται σε w:r/w:pPr/*
(σημείωση: στο πρώτο βήμα στο απλό μας παράδειγμα, καταργήσαμε αυτό το XML από το DOCX. Δημιουργήστε ένα νέο DOCX για να το δείτε).
Μόλις ορίσετε κείμενο ως στυλ, θα βρείτε αναφορά σε αυτό το στυλ μέσα στην ετικέτα ιδιοτήτων παραγράφου. Ακολουθεί ένα παράδειγμα όπου έχω ορίσει το κείμενό μου με το στυλ Επικεφαλίδα 1:
/word/styles.xml
και εδώ είναι το ίδιο το στυλ από w:styles/w:docDefaults/w:rPrDefault/*
:
w:styles/w:docDefaults/w:pPrDefault/*
Το Thexpath καθορίζει ότι η γραμματοσειρά είναι έντονη και υποδεικνύει το χρώμα της γραμματοσειράς. Καθοδηγεί το MSWord να χρησιμοποιήσει το στυλ 'Κανονικό' για τυχόν ιδιότητες που λείπουν.
Οι ιδιότητες κειμένου κληρονομούνται. Μια εκτέλεση έχει τις δικές της ιδιότητες (w:type='paragraph'
), αλλά κληρονομεί επίσης ιδιότητες από την παράγραφο (w:default='1'
) και και οι δύο μπορούν να αναφέρουν ιδιότητες στυλ από το word/_rels/document.xml.rels
.
word/theme/themes1.xml
Οι παράγραφοι και οι εκτελέσεις ξεκινούν με τις προεπιλεγμένες ιδιότητες: a:themeElements/a:fontScheme/a:majorFont
και a:minorFont
. Για να λάβετε το τελικό αποτέλεσμα των ιδιοτήτων ενός χαρακτήρα, πρέπει:
Όταν λέω 'προσάρτηση' Β στο Α, εννοώ να επαναλάβω όλες τις ιδιότητες Β και να παρακάμψω όλες τις ιδιότητες του Α, αφήνοντας όλες τις μη τεμνόμενες ιδιότητες ως έχουν.
Ένα ακόμη μέρος όπου μπορεί να βρίσκονται οι προεπιλεγμένες ιδιότητες βρίσκεται στην ετικέτα με w:docDefaults/w:rPrDefault
και w:val
. Σημειώστε, ότι οι ίδιοι οι χαρακτήρες μέσα σε ένα τρέξιμο δεν έχουν ποτέ ένα προεπιλεγμένο στυλ, τα sodoes δεν επηρεάζουν πραγματικά κανένα κείμενο.
1554402290400-dbb29eef3ba6035df7ad726dfc99b2af.png)
Οι χαρακτήρες σε μια εκτέλεση μπορούν να κληρονομηθούν από την παράγραφο και και οι δύο μπορούν να κληρονομήσουν από το Styles.xml.Ορισμένες από τις ιδιότητες είναι ιδιότητες 'εναλλαγής', όπως (έντονη γραφή) ή (πλάγια). αυτά τα χαρακτηριστικά συμπεριφέρονται σαν χειριστής XOR.
Αυτό σημαίνει ότι εάν το γονικό στυλ είναι έντονο και ένα παιδικό τρέξιμο είναι έντονο, το αποτέλεσμα θα είναι κανονικό, μη έντονο κείμενο.
Πρέπει να κάνετε πολλές δοκιμές και αντίστροφη μηχανική για να χειριστείτε σωστά τα χαρακτηριστικά εναλλαγής. Ρίξτε μια ματιά στην παράγραφο 17.7.3 του ECMA-376 Open XML προδιαγραφή για να λάβετε τους επίσημους, λεπτομερείς κανόνες για εναλλαγή ιδιοτήτων /
Οι ιδιότητες εναλλαγής είναι οι πιο περίπλοκες για τον σωστό χειρισμό ενός layouter. ΤιτίβισμαΟι γραμματοσειρές ακολουθούν τους ίδιους κοινούς κανόνες με άλλα χαρακτηριστικά κειμένου, αλλά οι προεπιλεγμένες τιμές της ιδιότητας γραμματοσειράς καθορίζονται σε ξεχωριστό αρχείο θέματος, με αναφορά στο 'left'
σαν αυτό:
'center'
Με βάση την παραπάνω αναφορά, το προεπιλεγμένο όνομα γραμματοσειράς θα βρεθεί στο 'right'
, στο εσωτερικό atag, 'both'
ή 'left'
ετικέτα.
Το προεπιλεγμένο μέγεθος γραμματοσειράς είναι 10 εκτός αν το 'center'
λείπει ετικέτα, τότε έχει μέγεθος 11.
Η ευθυγράμμιση κειμένου καθορίζεται από το atag με τέσσερα 'right'
διαθέσιμες λειτουργίες: 'both'
, w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:blip/@r:embed
, word/_rels/document.xml.rels
και word/_rels/document.xml.rels
.
left right
είναι η προεπιλεγμένη λειτουργία. Το κείμενο ξεκινά στα αριστερά του ορθογωνίου παραγράφου (συνήθως το πλάτος της σελίδας). (Αυτή η παράγραφος είναι ευθυγραμμισμένη προς τα αριστερά, η οποία είναι τυπική.)
w:spacing
λειτουργία, προβλέψιμα, κεντράρει όλους τους χαρακτήρες μέσα στο πλάτος της σελίδας. (Και πάλι, αυτή η παράγραφος αποτελεί κεντρική στοίχιση.)
Σε w:after
λειτουργία, το κείμενο της παραγράφου ευθυγραμμίζεται με το δεξί περιθώριο. (Παρατηρήστε πώς ευθυγραμμίζεται αυτό το κείμενο στη δεξιά πλευρά.)
w:before
Η λειτουργία βάζει επιπλέον απόσταση μεταξύ των λέξεων, έτσι ώστε οι γραμμές να είναι ευρύτερες και να καταλαμβάνουν το πλήρες πλάτος της παραγράφου, με εξαίρεση την τελευταία γραμμή που είναι αριστερή στοίχιση. (Αυτή η παράγραφος είναι μια απόδειξη αυτού.)
Το DOCX υποστηρίζει δύο είδη εικόνων: ενσωματωμένο και αιωρούμενο.
Οι ενσωματωμένες εικόνες εμφανίζονται μέσα σε μια παράγραφο μαζί με τους άλλους χαρακτήρες, χρησιμοποιούνται αντί να χρησιμοποιούνται (κείμενο). Μπορείτε να βρείτε το αναγνωριστικό εικόνας με την ακόλουθη σύνταξη xpath:
w:line
Το αναγνωριστικό εικόνας χρησιμοποιείται για την αναζήτηση του ονόματος αρχείου στο w:line
αρχείο και θα πρέπει να δείχνει το αρχείο gif / jpeg μέσα στον υποφάκελο word / media. (Δείτε το αρχείο 1.docx
του έργου github, όπου μπορείτε να δείτε το αναγνωριστικό εικόνας.)
Οι κινούμενες εικόνες τοποθετούνται σε σχέση με παραγράφους με κείμενο που ρέει γύρω τους. (Εδώ είναι το έργο github δείγμα εγγράφου με αιωρούμενη εικόνα.)
Οι αιωρούμενες εικόνες χρησιμοποιούν αντί για, οπότε αν διαγράψετε οποιοδήποτε κείμενο μέσα, προσέξτε τις άγκυρες αν δεν θέλετε να αφαιρεθούν οι εικόνες.
Οι ετικέτες XML για πίνακες είναι παρόμοιες με τη σήμανση πίνακα HTML - είναι η ίδια με
ΚΟΙΝΕΣ ΜΕΤΑΒΟΛΕΣ ΜΟΝΑΔΩΝ DOCX XML | ||||||
20ο σημείο | Βαθμοί dxa / 20 | Ίντσες σημ. / 72 | Εκατοστά σε * 2,54 | Μισό μέγεθος γραμματοσειράς σημ. / 144 | ΕΙΔΟΣ ΣΤΡΟΥΘΟΚΑΜΗΛΟΥ σε * 914400 | |
Παράδειγμα | 11906 | 595.3 | 8.27 ... | 21.00086 ... | 4.135 | 7562088 |
Ετικέτες που χρησιμοποιούν αυτό | pgSz / pgMar / w: απόσταση | σε: sz | wp: έκταση, a: ext |
Εάν θέλετε να μετατρέψετε ένα αρχείο DOCX (για παράδειγμα σε PDF), να το σχεδιάσετε σε καμβά ή να μετρήσετε τον αριθμό των σελίδων, θα πρέπει να εφαρμόσετε ένα layouter. Ένα layouter είναι ένας αλγόριθμος για τον υπολογισμό των θέσεων χαρακτήρων από ένα αρχείο DOCX.
Αυτή είναι μια πολύπλοκη εργασία αν χρειάζεστε απόδοση πιστότητας 100 τοις εκατό. Ο χρόνος που απαιτείται για την εφαρμογή ενός καλού layouter μετράται σε ανθρωποέτη, αλλά εάν χρειάζεστε μόνο ένα απλό, περιορισμένο, μπορεί να γίνει σχετικά γρήγορα.
Ένα layouter γεμίζει ένα γονικό ορθογώνιο, το οποίο είναι συνήθως ένα ορθογώνιο της σελίδας. Προσθέτει λέξεις από ένα τρέξιμο ένα προς ένα. Όταν η τρέχουσα γραμμή ξεχειλίζει, ξεκινά μια νέα. Εάν η παράγραφος είναι πολύ υψηλή για το γονικό ορθογώνιο, τυλίγεται στην επόμενη σελίδα.
Εδώ είναι μερικά σημαντικά πράγματα που πρέπει να θυμάστε εάν αποφασίσετε να εφαρμόσετε ένα layouter:
|_+_|, αλλά αυτό δεν είναι το μέγεθος της γραμμής όπως μπορεί να περιμένει κανείς. Για να λάβετε το μέγεθος της γραμμής, πάρτε το τρέχον ύψος γραμματοσειράς, πολλαπλασιάστε επί
This is our example first paragraph. It's default is left aligned, and now I'd like to introduce some bold text , and also change the font style to 'Impact'. This is new paragraph. This is one more paragraph, a bit longer.και διαιρέστε με 12.
Όταν δεν είναι προφανές πώς λειτουργεί αυτή η ετικέτα XML μέσα στο MS Word, υπάρχουν δύο βασικές προσεγγίσεις για να το καταλάβουμε:
Δημιουργήστε το επιθυμητό περιεχόμενο βήμα προς βήμα. Ξεκινήστε με ένα απλό αρχείο docx. Αποθηκεύστε κάθε βήμα στο δικό του αρχείο, όπως στο
|_+_|, , για παράδειγμα. Αποσυμπιέστε καθένα από αυτά και χρησιμοποιήστε ένα οπτικό εργαλείο diff για σύγκριση φακέλων για να δείτε ποιες ετικέτες εμφανίζονται μετά τις αλλαγές σας. (Για μια εμπορική επιλογή, δοκιμάστε το Araxis Merge ή για μια δωρεάν επιλογή, WinMerge.)
Εάν δημιουργήσετε ένα αρχείο DOCX που δεν του αρέσει το MS Word, εργαστείτε προς τα πίσω. Απλοποιήστε το XML σας βήμα προς βήμα. Σε κάποιο σημείο θα μάθετε ποια αλλαγή βρέθηκε λανθασμένη από το MS Word.
Είναι περίπλοκο και η άδεια της Microsoft απαγορεύει τη χρήση του MS Word από την πλευρά του διακομιστή για την επεξεργασία DOCX - αυτό είναι αρκετά τυπικό για εμπορικά προϊόντα. Η Microsoft, ωστόσο, παρείχε το Αρχείο XSLT για να χειριστείτε τις περισσότερες ετικέτες DOCX, αλλά δεν θα σας δώσει 100 τοις εκατό ή ακόμη και 99 τοις εκατό πιστότητα. Δεν υποστηρίζονται διαδικασίες όπως η αναδίπλωση κειμένου σε εικόνες, αλλά θα μπορείτε να υποστηρίζετε την πλειονότητα των εγγράφων. (Εάν δεν χρειάζεστε πολυπλοκότητα, σκεφτείτε να το χρησιμοποιήσετε Χαμήλωση τιμής ως εναλλακτική.)
Εάν έχετε επαρκή προϋπολογισμό (δεν υπάρχει δωρεάν μηχανή απόδοσης DOCX), ίσως θελήσετε να χρησιμοποιήσετε εμπορικά προϊόντα όπως το Aspose ή το docx4j. Η πιο δημοφιλής δωρεάν λύση είναι το LibreOffice για μετατροπή μεταξύ DOCX και άλλων μορφών, συμπεριλαμβανομένου του PDF. Δυστυχώς, το LibreOffice περιέχει πολλά μικρά σφάλματα κατά τη μετατροπή και επειδή είναι ένα εκλεπτυσμένο προϊόν ανοιχτού κώδικα C ++, είναι αργό και δύσκολο να διορθώσετε προβλήματα πιστότητας.
Εναλλακτικά, εάν βρείτε τη διάταξη DOCX πολύ περίπλοκη για την εφαρμογή σας, μπορείτε επίσης να τη μετατρέψετε σε HTML και να χρησιμοποιήσετε ένα πρόγραμμα περιήγησης για να την αποδώσετε. Μπορείτε επίσης να εξετάσετε ένα από αυτά Οι ανεξάρτητοι προγραμματιστές XML του ApeeScape .