Εργασία με Έγγραφα
Εργασία με Έγγραφα
Aspose.Words FOSS for .NET αντιπροσωπεύει κάθε αρχείο Word ως ένα μοντέλο αντικειμένων στη μνήμη με ρίζα την κλάση Document, ενώ το DocumentBuilder παρέχει ένα υψηλού επιπέδου, βασισμένο σε κέρσορα API για τη σύνταξη περιεχομένου. Αυτός ο οδηγός καλύπτει τη δημιουργία και τη φόρτωση εγγράφων, τη σύνταξη με DocumentBuilder, τη δομή ενότητας/σώματος, την περιήγηση στο δέντρο κόμβων, τον συνδυασμό εγγράφων και την προστασία τους.
Δημιουργία και Φόρτωση Εγγράφων
Δημιουργήστε ένα κενό έγγραφο με new Document(), ή ανοίξτε ένα υπάρχον αρχείο περνώντας μια διαδρομή ή Stream στον κατασκευαστή Document(fileName) ή Document(stream). Οι υπερφορτώσεις που δέχονται ένα όρισμα LoadOptions σας επιτρέπουν να ελέγχετε τη συμπεριφορά φόρτωσης, όπως η παροχή κωδικού πρόσβασης για ένα κρυπτογραφημένο αρχείο.
Πριν τη φόρτωση ενός αρχείου από άγνωστη ή μη αξιόπιστη πηγή, το FileFormatUtil.DetectFileFormat(fileName) (ή η υπερφόρτωση Stream) επιστρέφει ένα FileFormatInfo που περιγράφει το ανιχνευμένο LoadFormat, και αν το αρχείο IsEncrypted, HasDigitalSignature, ή HasMacros.
Σύνταξη με DocumentBuilder
DocumentBuilder τυλίγει ένα Document και εκθέτει έναν κέρσορα που κινείτε μέσα στο έγγραφο ενώ εισάγετε περιεχόμενο. Τα Write(text) και Writeln(text) εισάγουν κείμενο στον κέρσορα· το InsertParagraph() ξεκινά μια νέα παράγραφο. Οι ιδιότητες μορφοποίησης στον builder — Font, ParagraphFormat, ListFormat, PageSetup — εφαρμόζονται σε ό,τι γράφεται επόμενα.
Μετακινήστε τον δρομέα με MoveToDocumentStart(), MoveToDocumentEnd(), MoveToSection(sectionIndex), MoveToBookmark(bookmarkName) ή MoveToParagraph(paragraphIndex, characterIndex). Οι ιδιότητες CurrentNode, CurrentParagraph και CurrentSection του δημιουργού αναφέρουν τη τρέχουσα θέση του στο δέντρο.
Δομή Εγγράφου: Ενότητες και Σώμα
Ένα Document περιέχει ένα SectionCollection (Document.Sections, συν FirstSection / LastSection); κάθε Section έχει ένα Body, μια προαιρετική συλλογή κεφαλίδων/υποσέλιδων, και το δικό του PageSetup. Τα Section.AppendContent(sourceSection) και PrependContent(sourceSection) αντιγράφουν περιεχόμενο μεταξύ ενοτήτων, και το ClearContent() επαναφέρει μια ενότητα χωρίς να την αφαιρέσει από το έγγραφο.
Μέσα σε ένα Body, το περιεχόμενο εκτίθεται μέσω του Body.Paragraphs (ένα ParagraphCollection) και του Body.Tables. Ένα Range — διαθέσιμο από τα Document, Section, Paragraph και άλλους κόμβους — αντιπροσωπεύει μια συνεχόμενη περιοχή του δέντρου· το Range.Text διαβάζει το ακατέργαστο κείμενό του και το Range.Replace(pattern, replacement) εκτελεί μια λειτουργία εύρεσης-αντικατάστασης μόνο σε αυτήν την περιοχή.
Περιήγηση στο Δέντρο Κόμβων με DocumentVisitor
Κάθε μέρος ενός εγγράφου — ενότητες, παράγραφοι, runs, πίνακες, πεδία, σχήματα, σχόλια, υποσημειώσεις — είναι ένα Node σε ένα σύνθετο δέντρο με ρίζα το Document. Για να επεξεργαστείτε κάθε κόμβο ενός συγκεκριμένου τύπου χωρίς να κάνετε χειροκίνητη επανάκληση, κληρονομήστε την αφηρημένη DocumentVisitor και παρακάμψτε τις κλήσεις επιστροφής Visit*Start/Visit*End που χρειάζεστε, όπως το VisitParagraphStart(paragraph) ή το VisitRun(run), στη συνέχεια καλέστε το document.Accept(visitor). Κάθε κλήση επιστροφής μπορεί να επιστρέψει ένα VisitorAction (Continue, SkipThisNode ή Stop) για να ελέγξει τον τρόπο με τον οποίο προχωρά η διάσχιση.
Κλωνοποίηση, Εισαγωγή και Προσάρτηση Περιεχομένου
Document.Clone() δημιουργεί ένα βαθύ αντίγραφο ολόκληρου ενός εγγράφου. Για να μετακινήσετε περιεχόμενο μεταξύ δύο διαφορετικών στιγμιοτύπων Document, καλέστε το ImportNode(srcNode, isImportChildren) στο έγγραφο προορισμού για να φέρετε έναν κόμβο από ξένο δέντρο, ή καλέστε το Document.AppendDocument(srcDoc, importFormatMode) για να προσαρτήσετε τις ενότητες ενός εγγράφου σε άλλο χρησιμοποιώντας ένα επιλεγμένο ImportFormatMode — KeepSourceFormatting, UseDestinationStyles ή KeepDifferentStyles. Το DocumentBuilder.InsertDocument(srcDoc, importFormatMode) εισάγει το περιεχόμενο του πηγαίου εγγράφου στον δρομέα του δημιουργού αντί στο τέλος του προορισμού.
Προστασία Εγγράφων
Document.Protect(type, password) περιορίζει την επεξεργασία σύμφωνα με μια τιμή ProtectionType — ReadOnly, AllowOnlyComments, AllowOnlyRevisions, AllowOnlyFormFields ή NoProtection για να αφαιρεθεί η προστασία. Unprotect() (με ή χωρίς κωδικό) την αντιστρέφει. Αυτό είναι περιορισμός επεξεργασίας που επιβάλλει το Word, ξεχωριστά από την κρυπτογράφηση κωδικού πρόσβασης OOXML που εφαρμόζει το OoxmlSaveOptions.Password κατά την αποθήκευση ενός αρχείου.
Συμβουλές και Καλές Πρακτικές
- Προτιμήστε το
DocumentBuilderγια τη δημιουργία νέου περιεχομένου· μεταβείτε σε άμεση διαχείριση κόμβων (AppendChild,InsertAfter,Clone) όταν χρειάζεστε ακριβή έλεγχο πάνω σε ένα υπάρχον δέντρο. - Καλέστε το
FileFormatUtil.DetectFileFormatπριν φορτώσετε ένα αρχείο από μη αξιόπιστη ή παρεχόμενη από χρήστη πηγή, ώστε να ελέγξετε τοLoadFormatκαι να απορρίψετε νωρίς μη υποστηριζόμενη ή κρυπτογραφημένη είσοδο. - Κατά τη συνένωση εγγράφων με
AppendDocumentήInsertDocument, επιλέξτε τοImportFormatModeσκόπιμα — τοKeepSourceFormattingδιατηρεί την εμφάνιση της πηγής, τοUseDestinationStylesταιριάζει με το σύνολο στυλ του εγγράφου-στόχου. - Χρησιμοποιήστε μια υποκατηγορία
DocumentVisitorαντί για χειροκίνητη αναδρομική περάτωση του δένδρου όταν χρειάζεται να επεξεργαστείτε συνεπώς κάθε εμφάνιση ενός τύπου κόμβου. - Το
Document.Protectείναι περιορισμός επεξεργασίας, όχι κρυπτογράφηση — συνδυάστε το με τοOoxmlSaveOptions.Passwordεάν το αποθηκευμένο αρχείο πρέπει να απαιτεί κωδικό πρόσβασης για το άνοιγμά του.
Κοινά προβλήματα
| Πρόβλημα | Αιτία | Διόρθωση |
|---|---|---|
Document(fileName) προκαλεί εξαίρεση για ένα αρχείο που ανοίγει κανονικά στο Word | Η μορφή του αρχείου δεν είναι μια που αυτή η έκδοση υποστηρίζει για φόρτωση | Καλέστε πρώτα το FileFormatUtil.DetectFileFormat και ελέγξτε το επιστρεφόμενο LoadFormat πριν τη φόρτωση |
| Το προσαρτημένο περιεχόμενο υιοθετεί λανθασμένες γραμματοσειρές ή στυλ | Αναντιστοιχία ImportFormatMode μεταξύ των συνόλων στυλ πηγής και προορισμού | Περνάτε KeepSourceFormatting ή UseDestinationStyles ρητά αντί να βασίζεστε σε προεπιλογή |
Η διέλευση του DocumentVisitor σταματά νωρίς ή παραλείπει περιεχόμενο | Μια παράκαμψη Visit*Start / Visit*End επιστρέφει το SkipThisNode ή το Stop αθέλητα | Επιστρέψτε το VisitorAction.Continue από κάθε παράκαμψη, εκτός εάν σκοπεύετε συγκεκριμένα να παραλείψετε ή να σταματήσετε |
Το Unprotect() δεν έχει καμία επίδραση | Το έγγραφο δεν προστατεύτηκε με κωδικό πρόσβασης ή δόθηκε λανθασμένος κωδικός | Καλέστε το Unprotect() χωρίς ορίσματα εάν το Protect κλήθηκε χωρίς κωδικό πρόσβασης, διαφορετικά περάστε τον αντίστοιχο κωδικό |
FAQ
Ποια είναι η διαφορά μεταξύ Document.Clone() και ImportNode;
Clone() αντιγράφει ολόκληρο το έγγραφο σε μια νέα παρουσία Document. ImportNode(srcNode, isImportChildren) φέρνει έναν μοναδικό κόμβο (και προαιρετικά τα παιδιά του) από το δέντρο ενός εγγράφου σε ένα άλλο, κάτι που χρησιμοποιείται όταν συνδυάζετε συγκεκριμένο περιεχόμενο αντί ολόκληρων εγγράφων.
Ποια μορφές αρχείων μπορεί να φορτώσει το Document(fileName);
Document(fileName) φορτώνει DOCX, DOCM, DOTX, DOTM, Flat OPC (συμπεριλαμβανομένων των εκδόσεων με μακροεντολές και προτύπων), Markdown και απλό κείμενο. Παλιά μορφές επεξεργασίας κειμένου και διαδικτυακά φορμά εξαιρούνται από τους φορτωτές αυτής της έκδοσης.
Πώς μπορώ να βρω πού βρίσκεται αυτήν τη στιγμή ένα DocumentBuilder;
Διαβάστε CurrentNode, CurrentParagraph ή CurrentSection στην παρουσία του builder.
Το Document.Protect κρυπτογραφεί το αποθηκευμένο αρχείο;
Όχι — πρόκειται για περιορισμό επεξεργασίας που επιβάλλει το Word όταν ανοίγεται το αρχείο. Για να απαιτείται κωδικός πρόσβασης μόνο για το άνοιγμα του αρχείου, ορίστε OoxmlSaveOptions.Password κατά την αποθήκευση.
Πώς μπορώ να διαβάσω μόνο τις παραγράφους στο σώμα ενός εγγράφου;
Χρησιμοποιήστε τη συλλογή Body.Paragraphs, ή το Body.GetChildNodes(nodeType, isDeep) για άλλους τύπους κόμβων.
API Reference Περίληψη
| Κλάση/Μέθοδος | Περιγραφή |
|---|---|
Document | Ρίζα του μοντέλου αντικειμένου εγγράφου· οι κατασκευαστές φορτώνουν από αρχείο ή ροή, ή δημιουργούν ένα κενό έγγραφο. |
Document.Save | Γράφει το έγγραφο σε αρχείο, ροή ή HTTP απόκριση σε επιλεγμένη μορφή. |
Document.Clone() | Δημιουργεί ένα βαθύ αντίγραφο ολόκληρου του εγγράφου. |
Document.Protect(type, password) / Unprotect() | Εφαρμόζει ή αφαιρεί περιορισμό επεξεργασίας. |
Document.AppendDocument(srcDoc, importFormatMode) | Προσθέτει τις ενότητες ενός άλλου εγγράφου σε αυτό. |
DocumentBuilder | Βασισμένο σε κέρσορα API για τη συγγραφή κειμένου και την εισαγωγή περιεχομένου σε ένα έγγραφο. |
DocumentBuilder.InsertDocument(srcDoc, importFormatMode) | Εισάγει το περιεχόμενο ενός πηγαίου εγγράφου στον κέρσορα. |
Section / SectionCollection | Μία ενότητα ενός εγγράφου και η συλλογή όλων των ενοτήτων. |
Body | Container για το κύριο κείμενο (παράγραφοι και πίνακες) μιας ενότητας. |
Range | Μία συνεχόμενη περιοχή του δέντρου του εγγράφου· υποστηρίζει τα Text και Replace. |
DocumentVisitor | Αφηρημένη βασική κλάση για την περιήγηση σε κάθε κόμβο του δέντρου εγγράφου. |
ProtectionType | Απαρίθμηση περιορισμών επεξεργασίας σε επίπεδο εγγράφου. |
FileFormatUtil.DetectFileFormat | Ανιχνεύει τη μορφή ενός αρχείου ή ροής πριν το φορτώσει. |