Arbeta med dokument
Arbeta med dokument
Aspose.Words FOSS för .NET representerar varje Word-fil som en minnes-objektmodell rotad vid Document-klassen, med DocumentBuilder som tillhandahåller ett hög-nivå, markör-baserat API för att skapa innehåll. Denna guide täcker skapande och inläsning av dokument, författande med DocumentBuilder, sektion/kropps-strukturen, traversering av nodträdet, sammanslagning av dokument och skydd av dem.
Skapa och läsa in dokument
Skapa ett tomt dokument med new Document(), eller öppna en befintlig fil genom att skicka en sökväg eller Stream till Document(fileName)- eller Document(stream)-konstruktorn. Överlagringar som accepterar ett LoadOptions-argument låter dig kontrollera inläsningsbeteendet, till exempel att ange ett lösenord för en krypterad fil.
Innan du läser in en fil från en okänd eller opålitlig källa, returnerar FileFormatUtil.DetectFileFormat(fileName) (eller Stream-överlagringen) ett FileFormatInfo som beskriver den upptäckta LoadFormat, och huruvida filen IsEncrypted, HasDigitalSignature eller HasMacros.
Författande med DocumentBuilder
DocumentBuilder omsluter en Document och exponerar en markör som du förflyttar genom dokumentet medan du infogar innehåll. Write(text) och Writeln(text) infogar text vid markören; InsertParagraph() startar ett nytt stycke. Formateringsegenskaper på byggaren — Font, ParagraphFormat, ListFormat, PageSetup — gäller för allt som skrivs härnäst.
Flytta markören med MoveToDocumentStart(), MoveToDocumentEnd(), MoveToSection(sectionIndex), MoveToBookmark(bookmarkName) eller MoveToParagraph(paragraphIndex, characterIndex). Builderns CurrentNode, CurrentParagraph och CurrentSection egenskaper rapporterar dess nuvarande position i trädet.
Dokumentstruktur: Sektioner och kropp
En Document innehåller en SectionCollection (Document.Sections, plus FirstSection / LastSection); varje Section har en Body, en valfri samling av sidhuvuden/sidfötter och sin egen PageSetup. Section.AppendContent(sourceSection) och PrependContent(sourceSection) kopierar innehåll mellan sektioner, och ClearContent() återställer en sektion utan att ta bort den från dokumentet.
Inom en Body exponeras innehållet via Body.Paragraphs (en ParagraphCollection) och Body.Tables. En Range — tillgänglig från Document, Section, Paragraph och andra noder — representerar ett sammanhängande område i trädet; Range.Text läser dess klartext och Range.Replace(pattern, replacement) utför en sök-och-ersätt enbart i det området.
Vandring i nodträdet med DocumentVisitor
Varje del av ett dokument — sektioner, stycken, körningar, tabeller, fält, former, kommentarer, fotnoter — är en Node i ett sammansatt träd rotat vid Document. För att bearbeta varje nod av en given typ utan att manuellt rekursivt gå igenom, subklassa den abstrakta DocumentVisitor och åsidosätt de Visit*Start / Visit*End återuppringningar du behöver, såsom VisitParagraphStart(paragraph) eller VisitRun(run), och anropa sedan document.Accept(visitor). Varje återuppringning kan returnera en VisitorAction (Continue, SkipThisNode eller Stop) för att styra hur traverseringen fortsätter.
Klona, importera och lägga till innehåll
Document.Clone() skapar en djup kopia av ett helt dokument. För att flytta innehåll mellan två olika Document-instanser, anropa ImportNode(srcNode, isImportChildren) på destinationsdokumentet för att hämta in en nod från ett främmande träd, eller anropa Document.AppendDocument(srcDoc, importFormatMode) för att bifoga ett dokuments sektioner till ett annat med ett valt ImportFormatMode — KeepSourceFormatting, UseDestinationStyles eller KeepDifferentStyles. DocumentBuilder.InsertDocument(srcDoc, importFormatMode) infogar ett källdokumentets innehåll vid builderns markör istället för i slutet av destinationen.
Skydda dokument
Document.Protect(type, password) begränsar redigering enligt ett ProtectionType-värde — ReadOnly, AllowOnlyComments, AllowOnlyRevisions, AllowOnlyFormFields eller NoProtection för att ta bort skyddet. Unprotect() (med eller utan lösenord) återställer det. Detta är en redigeringsbegränsning som verkställs av Word, separat från den OOXML-lösenordskryptering som OoxmlSaveOptions.Password tillämpar när en fil sparas.
Tips och bästa praxis
- Föredra
DocumentBuilderför att bygga nytt innehåll; gå över till direkt nodmanipulation (AppendChild,InsertAfter,Clone) när du behöver fin kontroll över ett befintligt träd. - Anropa
FileFormatUtil.DetectFileFormatinnan du laddar en fil från en opålitlig eller användargenererad källa så att du kan kontrolleraLoadFormatoch tidigt avvisa ej stödd eller krypterad indata. - När du kombinerar dokument med
AppendDocumentellerInsertDocument, väljImportFormatModemedvetet —KeepSourceFormattingbevarar källans utseende,UseDestinationStylesmatchar mål dokumentets stiluppsättning. - Använd en
DocumentVisitor-subklass istället för manuell rekursiv trädgenomgång när du behöver bearbeta varje instans av en nodtyp konsekvent. Document.Protectär en redigeringsbegränsning, inte kryptering — kombinera den medOoxmlSaveOptions.Passwordom den sparade filen själv måste kräva ett lösenord för att öppnas.
Vanliga problem
| Problem | Orsak | Åtgärd |
|---|---|---|
Document(fileName) kastar ett undantag för en fil som öppnas utan problem i Word | Filens format stöds inte av den här utgåvan för inläsning | Anropa FileFormatUtil.DetectFileFormat först och kontrollera det returnerade LoadFormat innan du laddar |
| Tillagt innehåll plockar upp fel teckensnitt eller stilar | ImportFormatMode felmatchning mellan käll- och destinationsstiluppsättningar | Skicka KeepSourceFormatting eller UseDestinationStyles explicit istället för att förlita dig på en standard |
DocumentVisitor traversering slutar tidigt eller hoppar över innehåll | En Visit*Start / Visit*End överskrivning returnerar SkipThisNode eller Stop oavsiktligt | Returnera VisitorAction.Continue från varje överskrivning om du inte uttryckligen avser att hoppa över eller stoppa |
Unprotect() har ingen effekt | Dokumentet var inte skyddat med ett lösenord, eller så angavs fel lösenord | Anropa Unprotect() utan argument om Protect anropades utan ett lösenord, annars skicka det matchande lösenordet |
FAQ
Vad är skillnaden mellan Document.Clone() och ImportNode?
Clone() kopierar ett helt dokument till en ny Document-instans. ImportNode(srcNode, isImportChildren) för in en enskild nod (och eventuellt dess barn) från ett dokuments träd i ett annat, vilket är vad du använder när du kombinerar specifikt innehåll snarare än hela dokument.
Vilka filformat kan Document(fileName) ladda?
Document(fileName) laddar DOCX, DOCM, DOTX, DOTM, Flat OPC (plus dess makroaktiverade och mallvarianter), Markdown och vanlig text. Äldre ordbehandlings- och webbformat är uteslutna från den här versionens laddare.
Hur hittar jag var en DocumentBuilder för närvarande är placerad?
Läs CurrentNode, CurrentParagraph eller CurrentSection på builder-instansen.
Krypterar Document.Protect den sparade filen?
Nej — det är en redigeringsrestriktion som verkställs av Word när filen öppnas. För att kräva ett lösenord bara för att öppna filen, ange OoxmlSaveOptions.Password vid sparande.
Hur läser jag bara styckena i dokumentets kropp?
Använd Body.Paragraphs-samlingen, eller Body.GetChildNodes(nodeType, isDeep) för andra nodtyper.
API Reference Sammanfattning
| Klass/Metod | Beskrivning |
|---|---|
Document | Roten av dokumentobjektmodellen; konstruktorer läser in från en fil eller ström, eller skapar ett tomt dokument. |
Document.Save | Skriver dokumentet till en fil, ström eller HTTP-respons i ett valt format. |
Document.Clone() | Skapar en djup kopia av hela dokumentet. |
Document.Protect(type, password) / Unprotect() | Tillämpar eller tar bort en redigeringsrestriktion. |
Document.AppendDocument(srcDoc, importFormatMode) | Lägger till sektioner från ett annat dokument till detta. |
DocumentBuilder | Markörbaserad API för att skriva text och infoga innehåll i ett dokument. |
DocumentBuilder.InsertDocument(srcDoc, importFormatMode) | Infogar ett källdokuments innehåll vid markören. |
Section / SectionCollection | En enskild sektion av ett dokument och samlingen av alla sektioner. |
Body | Behållare för huvudtexten (paragrafer och tabeller) i ett avsnitt. |
Range | Ett sammanhängande område av dokumentträdet; stödjer Text och Replace. |
DocumentVisitor | Abstrakt basklass för att gå igenom varje nod i dokumentträdet. |
ProtectionType | Enum för redigeringsrestriktioner på dokumentnivå. |
FileFormatUtil.DetectFileFormat | Detekterar formatet för en fil eller ström innan den laddas. |