Inserare și Anexare Documente

Uneori este necesar să combinați mai multe documente într-unul singur. Poţi să faci asta manual sau poţi folosi caracteristica Aspose.Words inserare sau apendere.

Operația de inserare îți permite să introduci conținutul documentelor anterior create într-unul nou sau existent.

În schimb, caracteristica de atașare îți permite să adaugi un document numai la sfârșitul unui alt document.

Acest articol explica cum să inserați sau să adăugați un document la altul în diferite moduri și descrie proprietățile comune pe care le puteți aplica atunci când introduceți sau adăugați documente.

Inseraţi un document

După cum am menționat mai sus, în Aspose.Words un document este reprezentat ca un copac de noduri și operația de inserare a unui document într-altul este copierea nodurilor din primul copac de documente către cel de-al doilea.

Puteți insera documente într-o varietate de locații în diferite moduri. “De exemplu, poți insera un document printr-o operație de înlocuire, un câmp de fuziune în timpul unei operații de fuziune sau prin intermediul unui semn de carte”.

“De asemenea, poți folosi metoda InsertDocument sau metoda InsertDocumentInline, care este asemănătoare cu inserarea unui document în Microsoft Word, pentru a insera întreg un document la poziția cursorului curent fără vreun import anterior.”

Exemplul următor de cod arată cum să inserezi un document folosind metoda InsertDocument:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document srcDoc = new Document(MyDir + "Document source.docx");
Document dstDoc = new Document(MyDir + "Northwind traders.docx");
DocumentBuilder builder = new DocumentBuilder(dstDoc);
builder.MoveToDocumentEnd();
builder.InsertBreak(BreakType.PageBreak);
builder.InsertDocument(srcDoc, ImportFormatMode.KeepSourceFormatting);
builder.Document.Save(ArtifactsDir + "JoinAndAppendDocuments.InsertDocument.docx");

Exemplul de cod următor arată cum să inserați un document folosind metoda InsertDocumentInline:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
DocumentBuilder srcDoc = new DocumentBuilder();
srcDoc.Write("[src content]");
// Create destination document.
DocumentBuilder dstDoc = new DocumentBuilder();
dstDoc.Write("Before ");
dstDoc.InsertNode(new BookmarkStart(dstDoc.Document, "src_place"));
dstDoc.InsertNode(new BookmarkEnd(dstDoc.Document, "src_place"));
dstDoc.Write(" after");
Assert.AreEqual("Before after", dstDoc.Document.GetText().TrimEnd());
// Insert source document into destination inline.
dstDoc.MoveToBookmark("src_place");
dstDoc.InsertDocumentInline(srcDoc.Document, ImportFormatMode.UseDestinationStyles, new ImportFormatOptions());
Assert.AreEqual("Before [src content] after", dstDoc.Document.GetText().TrimEnd());

Subsecțiunile următoare descriu opțiunile prin care puteți insera un document în altul.

Inserează un document în timpul operaţiei de găsire şi înlocuire

Puteți insera documente în timp ce efectuați operațiuni de căutare și înlocuire. De exemplu, un document poate conține paragrafe cu textul [INTRODUCERE] și [CONCLUZIE]. Însă în documentul final trebuie să înlocuiţi acele paragrafe cu conţinutul obținut din alt document extern. Pentru asta, va trebui să creezi un manipulator pentru evenimentul “replace”.

Următorul exemplu de cod arată cum să creezi un gestionar pentru evenimentul înlocuirii pentru a-l utiliza mai târziu în procesul de inserare:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
private class InsertDocumentAtReplaceHandler : IReplacingCallback
{
ReplaceAction IReplacingCallback.Replacing(ReplacingArgs args)
{
Document subDoc = new Document(MyDir + "Document insertion 2.docx");
// Insert a document after the paragraph, containing the match text.
Paragraph para = (Paragraph)args.MatchNode.ParentNode;
InsertDocument(para, subDoc);
// Remove the paragraph with the match text.
para.Remove();
return ReplaceAction.Skip;
}
}

Exemplul următor de cod arată cum să inserezi conținutul unui document în altul în timpul unei operații de căutare și înlocuire:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document mainDoc = new Document(MyDir + "Document insertion 1.docx");
FindReplaceOptions options = new FindReplaceOptions
{
Direction = FindReplaceDirection.Backward,
ReplacingCallback = new InsertDocumentAtReplaceHandler()
};
mainDoc.Range.Replace(new Regex("\\[MY_DOCUMENT\\]"), "", options);
mainDoc.Save(ArtifactsDir + "CloneAndCombineDocuments.InsertDocumentAtReplace.docx");

Inserare document în timpul Mail Merge operațiune

Puteţi introduce un document într-un câmp de fuziune în timpul unei Mail Merge operaţii. De exemplu, un șablon Mail Merge poate conține un câmp de fuziune cum ar fi [Rezumat]. “Dar în documentul final, trebuie să inserați conținut obținut dintr-un alt document extern în acest câmp de fuziune.” Pentru asta, vei avea nevoie să creezi un mânuitor pentru evenimentul de fuziune.

Exemplul următor de cod arată cum să creezi un gestionar pentru evenimentul de fuziune pentru a-l utiliza mai târziu în procesul de inserare:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
private class InsertDocumentAtMailMergeHandler : IFieldMergingCallback
{
// This handler makes special processing for the "Document_1" field.
// The field value contains the path to load the document.
// We load the document and insert it into the current merge field.
void IFieldMergingCallback.FieldMerging(FieldMergingArgs args)
{
if (args.DocumentFieldName == "Document_1")
{
// Use document builder to navigate to the merge field with the specified name.
DocumentBuilder builder = new DocumentBuilder(args.Document);
builder.MoveToMergeField(args.DocumentFieldName);
// The name of the document to load and insert is stored in the field value.
Document subDoc = new Document((string)args.FieldValue);
InsertDocument(builder.CurrentParagraph, subDoc);
// The paragraph that contained the merge field might be empty now, and you probably want to delete it.
if (!builder.CurrentParagraph.HasChildNodes)
builder.CurrentParagraph.Remove();
// Indicate to the mail merge engine that we have inserted what we wanted.
args.Text = null;
}
}
void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs args)
{
// Do nothing.
}
}

Exemplul de cod următor arată cum se poate introduce un document în câmpul de fuziune folosind manipulatorul creat:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document mainDoc = new Document(MyDir + "Document insertion 1.docx");
mainDoc.MailMerge.FieldMergingCallback = new InsertDocumentAtMailMergeHandler();
// The main document has a merge field in it called "Document_1".
// The corresponding data for this field contains a fully qualified path to the document.
// That should be inserted to this field.
mainDoc.MailMerge.Execute(new[] { "Document_1" }, new object[] { MyDir + "Document insertion 2.docx" });
mainDoc.Save(ArtifactsDir + "CloneAndCombineDocuments.InsertDocumentAtMailMerge.doc");

Inseraţi un document la marcaj

Puteți importa un fișier text într-un document și să îl inserați imediat după un semn de carte pe care l-ați definit în document. Pentru asta, creați un paragraf marcat unde doriți ca documentul să fie inserat.

Exemplul de cod următor arată cum să inserezi conținutul unui document într-un semn de carte în alt document:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document mainDoc = new Document(MyDir + "Document insertion 1.docx");
Document subDoc = new Document(MyDir + "Document insertion 2.docx");
Bookmark bookmark = mainDoc.Range.Bookmarks["insertionPlace"];
InsertDocument(bookmark.BookmarkStart.ParentNode, subDoc);
mainDoc.Save(ArtifactsDir + "CloneAndCombineDocuments.InsertDocumentAtBookmark.docx");

Adaugă un document

S-ar putea să aveți un caz de utilizare în care aveți nevoie să includeți pagini suplimentare dintr-un document la sfârșitul unui document existent. Pentru asta, trebuie doar să apelezi metoda AppendDocument pentru a adăuga un document la sfârșitul altuia.

Exemplul următor de cod arată cum să atașați un document la sfârșitul unui alt document:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document dstDoc = new Document();
dstDoc.FirstSection.Body.AppendParagraph("Destination document text. ");
Document srcDoc = new Document();
srcDoc.FirstSection.Body.AppendParagraph("Source document text. ");
// Append the source document to the destination document.
// Pass format mode to retain the original formatting of the source document when importing it.
dstDoc.AppendDocument(srcDoc, ImportFormatMode.KeepSourceFormatting);
dstDoc.Save(ArtifactsDir + "JoinAndAppendDocuments.KeepSourceFormatting.docx");

Import și Inserează Noduri Manual

Aspose.Words vă permite să inseraţi şi să lipiţi documente automat fără nici-un cerinţă de importare anterioară. Cu toate acestea, dacă aveți nevoie să inserați sau să atașați un anumit nod din documentul dvs., cum ar fi o secțiune sau un paragraf, atunci mai întâi trebuie să importați acest nod manual.

Când trebuie să inserezi sau să adaugi o secțiune sau un paragraf la altul, în esență ai nevoie să imporți nodurile din arborele de noduri al primului document în cel de-al doilea folosind metoda ImportNode. După importarea nodurilor tale, trebuie să folosești metoda InsertAfter / InsertBefore pentru a insera un nou nod după/înainte de nodul referință. Acest lucru îți permite să personalizezi procesul de inserare prin importul nodurilor dintr-un document și inserarea acestora în anumite poziții.

Poţi folosi, de asemenea, metoda AppendChild pentru a adăuga un nod nou specificat la sfârşitul listei de noduri secundare, de exemplu, dacă doreşti să adaugi conţinut la nivel de paragraf în loc de la nivel de secţiune.

Exemplul de cod următor arată cum se importă manual noduri și se introduc după un anumit nod folosind metoda InsertAfter:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
/// <summary>
/// Inserts content of the external document after the specified node.
/// Section breaks and section formatting of the inserted document are ignored.
/// </summary>
/// <param name="insertionDestination">Node in the destination document after which the content
/// Should be inserted. This node should be a block level node (paragraph or table).</param>
/// <param name="docToInsert">The document to insert.</param>
private static void InsertDocument(Node insertionDestination, Document docToInsert)
{
if (insertionDestination.NodeType == NodeType.Paragraph || insertionDestination.NodeType == NodeType.Table)
{
CompositeNode destinationParent = insertionDestination.ParentNode;
NodeImporter importer =
new NodeImporter(docToInsert, insertionDestination.Document, ImportFormatMode.KeepSourceFormatting);
// Loop through all block-level nodes in the section's body,
// then clone and insert every node that is not the last empty paragraph of a section.
foreach (Section srcSection in docToInsert.Sections.OfType<Section>())
foreach (Node srcNode in srcSection.Body)
{
if (srcNode.NodeType == NodeType.Paragraph)
{
Paragraph para = (Paragraph)srcNode;
if (para.IsEndOfSection && !para.HasChildNodes)
continue;
}
Node newNode = importer.ImportNode(srcNode, true);
destinationParent.InsertAfter(newNode, insertionDestination);
insertionDestination = newNode;
}
}
else
{
throw new ArgumentException("The destination node should be either a paragraph or table.");
}
}

Conținutul este importat în secțiunea documentului de destinație pe rânduri, ceea ce înseamnă că setările precum formatarea paginii și antetele sau subsolurile sunt păstrate în timpul importului. Este de asemenea util să observaţi că puteţi defini setările de formatare atunci când inseraţi sau adăugaţi un document pentru a specifica cum două documente sunt combinate.

Proprietăți comune pentru Inserare și Adăugare Documente

Ambele InsertDocument și AppendDocument metode acceptă ImportFormatMode și ImportFormatOptions ca parametri de intrare. Funcția ImportFormatMode vă permite să controlați cum se unifică formatarea documentului atunci când importați conținut dintr-un document în altul prin selectarea diferitelor moduri de formatare, cum ar fi UseDestinationStyles, KeepSourceFormatting și KeepDifferentStyles. The ImportFormatOptions vă permite să selectați diferite opțiuni de import, cum ar fi IgnoreHeaderFooter, IgnoreTextBoxes, KeepSourceNumbering, MergePastedLists și SmartStyleBehavior.

Aspose.Words îți permite să ajustezi vizualizarea unui document rezultat atunci când două documente sunt adăugate împreună într-o operație de inserare sau suprapunere folosind proprietățile Section și PageSetup. Proprietatea PageSetup conține toate atributele unei secțiuni, cum ar fi SectionStart, RestartPageNumbering, PageStartingNumber, Orientation, și altele. Cazul de utilizare cel mai comun este să setați SectionStart proprietatea pentru a defini dacă conținutul adăugat va apărea pe aceeași pagină sau se va despărți într-una nouă.

Exemplul următor de cod arată cum să atașați un document la altul, păstrând conținutul fără a se împărți pe două pagini:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git.
Document srcDoc = new Document(MyDir + "Document source.docx");
Document dstDoc = new Document(MyDir + "Northwind traders.docx");
// Set the source document to continue straight after the end of the destination document.
srcDoc.FirstSection.PageSetup.SectionStart = SectionStart.Continuous;
// Restart the page numbering on the start of the source document.
srcDoc.FirstSection.PageSetup.RestartPageNumbering = true;
srcDoc.FirstSection.PageSetup.PageStartingNumber = 1;
// To ensure this does not happen when the source document has different page setup settings, make sure the
// settings are identical between the last section of the destination document.
// If there are further continuous sections that follow on in the source document,
// this will need to be repeated for those sections.
srcDoc.FirstSection.PageSetup.PageWidth = dstDoc.LastSection.PageSetup.PageWidth;
srcDoc.FirstSection.PageSetup.PageHeight = dstDoc.LastSection.PageSetup.PageHeight;
srcDoc.FirstSection.PageSetup.Orientation = dstDoc.LastSection.PageSetup.Orientation;
// Iterate through all sections in the source document.
foreach (Paragraph para in srcDoc.GetChildNodes(NodeType.Paragraph, true))
{
para.ParagraphFormat.KeepWithNext = true;
}
dstDoc.AppendDocument(srcDoc, ImportFormatMode.KeepSourceFormatting);
dstDoc.Save(ArtifactsDir + "JoinAndAppendDocuments.DifferentPageSetup.docx");