Vložit a doplnit dokumenty

Někdy je nutné kombinovat několik dokumentů do jednoho. Můžete to udělat ručně nebo můžete použít Aspose.Words vložit nebo připojit funkci.

Operace vložení umožňuje vložit obsah dříve vytvořených dokumentů do nového nebo stávajícího dokumentu.

Funkce Append vám pak umožní přidat dokument pouze na konci jiného dokumentu.

Tento článek vysvětluje, jak vložit nebo přidat dokument do jiného dokumentu různými způsoby a popisuje společné vlastnosti, které můžete použít při vkládání nebo zadávání dokumentů.

Vložit dokument

Jak bylo uvedeno výše, Aspose.Words dokument je reprezentován jako strom uzlů a operace vložení jednoho dokumentu do druhého je kopírování uzlů od prvního stromu dokumentu do druhého.

Dokumenty můžete vkládat do různých míst různými způsoby. Můžete například vložit dokument prostřednictvím náhradní operace, pole sloučení během operace sloučení nebo prostřednictvím záložky.

Můžete také použít InsertDocument nebo InsertDocumentInline metoda, která je podobná vložení dokumentu do Microsoft Word, vložit celý dokument do aktuální polohy kurzoru bez předchozího dovozu.

Následující příklad kódu ukazuje, jak vložit dokument pomocí InsertDocument metoda:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document srcDoc = new Document(getMyDir() + "Document source.docx");
Document dstDoc = new Document(getMyDir() + "Northwind traders.docx");
DocumentBuilder builder = new DocumentBuilder(dstDoc);
builder.moveToDocumentEnd();
builder.insertBreak(BreakType.PAGE_BREAK);
builder.insertDocument(srcDoc, ImportFormatMode.KEEP_SOURCE_FORMATTING);
builder.getDocument().save(getArtifactsDir() + "JoinAndAppendDocuments.insertDocument.docx");

Následující příklad kódu ukazuje, jak vložit dokument pomocí InsertDocumentInline metoda:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
DocumentBuilder srcDoc = new DocumentBuilder();
srcDoc.write("[src content]");
// Create destination document.
DocumentBuilder dstDoc = new DocumentBuilder();
dstDoc.write("Before ");
dstDoc.insertNode(new BookmarkStart(dstDoc.getDocument(), "src_place"));
dstDoc.insertNode(new BookmarkEnd(dstDoc.getDocument(), "src_place"));
dstDoc.write(" after");
Assert.assertEquals("Before after", dstDoc.getDocument().getText().trim());
// Insert source document into destination inline.
dstDoc.moveToBookmark("src_place");
dstDoc.insertDocumentInline(srcDoc.getDocument(), ImportFormatMode.USE_DESTINATION_STYLES, new ImportFormatOptions());
Assert.assertEquals("Before [src content] after", dstDoc.getDocument().getText().trim());

Následující pododdíly popisují možnosti, během kterých můžete vložit jeden dokument do druhého.

Vložit dokument během hledání a nahrazení operace

Můžete vložit dokumenty při provádění hledání a nahrazení operací. Například dokument může obsahovat odstavce s textem [PRODUKCE] a [CONCLUZE]. Ale v závěrečném dokumentu musíte tyto odstavce nahradit obsahem získaným z jiného vnějšího dokumentu. Abyste toho dosáhli, budete muset vytvořit spojku pro výměnu událostí.

Následující příklad kódu ukazuje, jak vytvořit manipulátor pro výměnu události použít později v procesu vložení:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
private static class InsertDocumentAtReplaceHandler implements IReplacingCallback
{
public /*ReplaceAction*/int /*IReplacingCallback.*/replacing(ReplacingArgs args) throws Exception
{
Document subDoc = new Document(getMyDir() + "Document insertion 2.docx");
// Insert a document after the paragraph, containing the match text.
Paragraph para = (Paragraph)args.getMatchNode().getParentNode();
insertDocument(para, subDoc);
// Remove the paragraph with the match text.
para.remove();
return ReplaceAction.SKIP;
}
}

Následující příklad kódu ukazuje, jak při hledání a nahrazení operace vložit obsah jednoho dokumentu do druhého:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document mainDoc = new Document(getMyDir() + "Document insertion 1.docx");
// Set find and replace options.
FindReplaceOptions options = new FindReplaceOptions();
{
options.setDirection(FindReplaceDirection.BACKWARD);
options.setReplacingCallback(new InsertDocumentAtReplaceHandler());
}
// Call the replace method.
mainDoc.getRange().replace(Pattern.compile("\\[MY_DOCUMENT\\]"), "", options);
mainDoc.save(getArtifactsDir() + "CloneAndCombineDocuments.InsertDocumentAtReplace.docx");

Vložit dokument během Mail Merge Činnost

Můžete vložit dokument do pole sloučení během Mail Merge operace. Například: Mail Merge šablona může obsahovat pole sloučení jako např. [Summary]. Ale v konečném dokumentu musíte vložit obsah získaný z jiného externího dokumentu do tohoto pole sloučení. K dosažení tohoto cíle budete muset vytvořit spojku pro událost sloučení.

Následující příklad kódu ukazuje, jak vytvořit manipulátor pro fúzující událost k jeho použití později v procesu vložení:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
private static class InsertDocumentAtMailMergeHandler implements 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.
public void /*IFieldMergingCallback.*/fieldMerging(FieldMergingArgs args) throws Exception
{
if ("Document_1".equals(args.getDocumentFieldName()))
{
// Use document builder to navigate to the merge field with the specified name.
DocumentBuilder builder = new DocumentBuilder(args.getDocument());
builder.moveToMergeField(args.getDocumentFieldName());
// The name of the document to load and insert is stored in the field value.
Document subDoc = new Document((String)args.getFieldValue());
insertDocument(builder.getCurrentParagraph(), subDoc);
// The paragraph that contained the merge field might be empty now, and you probably want to delete it.
if (!builder.getCurrentParagraph().hasChildNodes())
builder.getCurrentParagraph().remove();
// Indicate to the mail merge engine that we have inserted what we wanted.
args.setText(null);
}
}
public void /*IFieldMergingCallback.*/imageFieldMerging(ImageFieldMergingArgs args)
{
// Do nothing.
}
}

Následující příklad kódu ukazuje, jak vložit dokument do pole sloučení pomocí vytvořeného správce:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document mainDoc = new Document(getMyDir() + "Document insertion 1.docx");
mainDoc.getMailMerge().setFieldMergingCallback(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.getMailMerge().execute(new String[] { "Document_1" }, new Object[] { getMyDir() + "Document insertion 2.docx" });
mainDoc.save(getArtifactsDir() + "CloneAndCombineDocuments.InsertDocumentAtMailMerge.doc");

Vložit dokument do záložky

Můžete importovat textový soubor do dokumentu a vložit jej hned po záložce, kterou jste definovali v dokumentu. Chcete-li to udělat, vytvořte záložek odstavec, kde chcete dokument vložit.

Následující kódovací příklad ukazuje, jak vložit obsah jednoho dokumentu do záložky do jiného dokumentu:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document mainDoc = new Document(getMyDir() + "Document insertion 1.docx");
Document subDoc = new Document(getMyDir() + "Document insertion 2.docx");
Bookmark bookmark = mainDoc.getRange().getBookmarks().get("insertionPlace");
insertDocument(bookmark.getBookmarkStart().getParentNode(), subDoc);
mainDoc.save(getArtifactsDir() + "CloneAndCombineDocuments.InsertDocumentAtBookmark.docx");

Přidání dokumentu

Můžete mít případ použití, kde potřebujete zahrnout další stránky z dokumentu do konce stávajícího dokumentu. K tomuhle stačí zavolat AppendDocument způsob přidání dokumentu na konec jiného.

Následující příklad kódu ukazuje, jak připojit dokument na konec jiného dokumentu:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document dstDoc = new Document();
dstDoc.getFirstSection().getBody().appendParagraph("Destination document text. ");
Document srcDoc = new Document();
srcDoc.getFirstSection().getBody().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.KEEP_SOURCE_FORMATTING);
dstDoc.save(getArtifactsDir() + "JoinAndAppendDocuments.KeepSourceFormatting.docx");

Importovat a vložit uzly ručně

Aspose.Words umožňuje automaticky vkládat a přidávat dokumenty bez předchozích dovozních požadavků. Pokud však potřebujete vložit nebo přidat konkrétní uzel vašeho dokumentu, jako je sekce nebo odstavec, pak nejprve musíte importovat tento uzel ručně.

Pokud potřebujete vložit nebo připojit jeden oddíl nebo odstavec k druhému, musíte v podstatě importovat uzly prvního uzel dokumentu do druhého stromu pomocí ImportNode metoda. Po importu uzlů musíte použít InsertAfter metoda vložení nového uzlu po / před referenčním uzlem. To vám umožní přizpůsobit proces vkládání importem uzlů z dokumentu a vložením na dané pozice.

Můžete také použít AppendChild způsob, jak přidat nový zadaný uzel na konec seznamu dětských uzlů, například, pokud chcete přidat obsah na úrovni odstavce místo na úrovni sekce.

Následující příklad kódu ukazuje, jak ručně importovat uzly a vložit je po konkrétním uzlu pomocí InsertAfter metoda:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.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.getNodeType() == NodeType.PARAGRAPH || insertionDestination.getNodeType() == NodeType.TABLE)
{
CompositeNode destinationParent = insertionDestination.getParentNode();
NodeImporter importer =
new NodeImporter(docToInsert, insertionDestination.getDocument(), ImportFormatMode.KEEP_SOURCE_FORMATTING);
// 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.
for (Section srcSection : docToInsert.getSections())
for (Node srcNode : srcSection.getBody())
{
if (srcNode.getNodeType() == 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 IllegalArgumentException("The destination node should be either a paragraph or table.");
}
}

Obsah se do sekce cílového dokumentu importuje podle oddílu, což znamená, že nastavení, jako je nastavení stránek a hlavičky nebo zápatí, jsou zachována během importu. Je také užitečné poznamenat, že můžete definovat nastavení formátování, když vložíte nebo připojíte dokument pro upřesnění, jak jsou dva dokumenty spojeny dohromady.

Společné vlastnosti pro vložení a doplnění dokumentů

Oba InsertDocument a AppendDocument metody akceptují ImportFormatMode a ImportFormatOptions jako vstupní parametry. The ImportFormatMode umožňuje ovládat, jak je formátování dokumentů sloučeno, když importujete obsah z jednoho dokumentu do druhého výběrem různých formátů, jako jsou UseDestinationStyles, KeepSourceFormatting, a KeepDifferentStyles. The ImportFormatOptions umožňuje vybrat různé možnosti importu, jako je IgnoreHeaderFooter, IgnoreTextBoxes, KeepSourceNumbering, MergePastedLists, a SmartStyleBehavior.

Aspose.Words umožňuje upravit vizualizaci výsledného dokumentu, pokud jsou dva dokumenty přidány společně v insertu nebo do přílohy operací pomocí Section a PageSetup vlastnosti. The PageSetup vlastnost obsahuje všechny atributy oddílu jako např. SectionStart, RestartPageNumbering, PageStartingNumber, Orientation, a další. Nejčastějším případem použití je nastavení SectionStart vlastnost definovat, zda se přidaný obsah objeví na stejné stránce nebo se rozdělí na nový.

Následující příklad kódu ukazuje, jak připojit jeden dokument k druhému a zároveň udržet obsah od rozdělení na dvě stránky:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document srcDoc = new Document(getMyDir() + "Document source.docx");
Document dstDoc = new Document(getMyDir() + "Northwind traders.docx");
// Set the source document to continue straight after the end of the destination document.
srcDoc.getFirstSection().getPageSetup().setSectionStart(SectionStart.CONTINUOUS);
// Restart the page numbering on the start of the source document.
srcDoc.getFirstSection().getPageSetup().setRestartPageNumbering(true);
srcDoc.getFirstSection().getPageSetup().setPageStartingNumber(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.getFirstSection().getPageSetup().setPageWidth(dstDoc.getLastSection().getPageSetup().getPageWidth());
srcDoc.getFirstSection().getPageSetup().setPageHeight(dstDoc.getLastSection().getPageSetup().getPageHeight());
srcDoc.getFirstSection().getPageSetup().setOrientation(dstDoc.getLastSection().getPageSetup().getOrientation());
// Iterate through all sections in the source document.
for (Paragraph para : (Iterable<Paragraph>) srcDoc.getChildNodes(NodeType.PARAGRAPH, true))
{
para.getParagraphFormat().setKeepWithNext(true);
}
dstDoc.appendDocument(srcDoc, ImportFormatMode.KEEP_SOURCE_FORMATTING);
dstDoc.save(getArtifactsDir() + "JoinAndAppendDocuments.DifferentPageSetup.docx");