Inserir e anexar documentos
Às vezes é necessário combinar vários documentos em um. Você pode fazer isso manualmente ou usar o recurso de inserção ou acréscimo de Aspose.Words.
A operação de inserção permite inserir o conteúdo de documentos criados anteriormente em um documento novo ou existente.
Por sua vez, o recurso anexar permite adicionar um documento apenas no final de outro documento.
Este artigo explica como inserir ou anexar um documento a outro de diferentes maneiras e descreve as propriedades comuns que você pode aplicar ao inserir ou anexar documentos.
Insira um documento
Conforme mencionado acima, no Aspose.Words um documento é representado como uma árvore de nós, e a operação de inserir um documento em outro é copiar os nós da primeira árvore de documentos para a segunda.
Você pode inserir documentos em vários locais de diferentes maneiras. Por exemplo, você pode inserir um documento por meio de uma operação de substituição, de um campo de mesclagem durante uma operação de mesclagem ou de um marcador.
Você também pode usar o método insert_document ou insert_document_inline, que é semelhante à inserção de um documento em Microsoft Word, para inserir um documento inteiro na posição atual do cursor sem qualquer importação prévia.
O exemplo de código a seguir mostra como inserir um documento usando o método inserir_documento:
# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git. | |
src_doc = aw.Document(MY_DIR + "Document source.docx") | |
dst_doc = aw.Document(MY_DIR + "Northwind traders.docx") | |
builder = aw.DocumentBuilder(dst_doc) | |
builder.move_to_document_end() | |
builder.insert_break(aw.BreakType.PAGE_BREAK) | |
builder.insert_document(src_doc, aw.ImportFormatMode.KEEP_SOURCE_FORMATTING) | |
builder.document.save(ARTIFACTS_DIR + "JoinAndAppendDocuments.insert_document.docx") |
O exemplo de código a seguir mostra como inserir um documento usando o método insert_document_inline:
# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git. | |
src_doc = aw.DocumentBuilder() | |
src_doc.write("[src content]") | |
# Create destination document. | |
dst_doc = aw.DocumentBuilder() | |
dst_doc.write("Before ") | |
dst_doc.insert_node(aw.BookmarkStart(dst_doc.document, "src_place")) | |
dst_doc.insert_node(aw.BookmarkEnd(dst_doc.document, "src_place")) | |
dst_doc.write(" after") | |
self.assertEqual("Before after", dst_doc.document.get_text().strip()) | |
# Insert source document into destination inline. | |
dst_doc.move_to_bookmark("src_place") | |
dst_doc.insert_document_inline(src_doc.document, aw.ImportFormatMode.USE_DESTINATION_STYLES, aw.ImportFormatOptions()) | |
self.assertEqual("Before [src content] after", dst_doc.document.get_text().strip()) |
As subseções a seguir descrevem as opções durante as quais você pode inserir um documento em outro.
Insira um documento no marcador
Você pode importar um arquivo de texto para um documento e inseri-lo logo após um marcador definido no documento. Para fazer isso, crie um parágrafo marcado onde deseja que o documento seja inserido.
O exemplo de codificação a seguir mostra como inserir o conteúdo de um documento em um marcador de outro documento:
# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git. | |
main_doc = aw.Document(MY_DIR + "Document insertion 1.docx") | |
sub_doc = aw.Document(MY_DIR + "Document insertion 2.docx") | |
bookmark = main_doc.range.bookmarks.get_by_name("insertionPlace") | |
self.insert_document(bookmark.bookmark_start.parent_node, sub_doc) | |
main_doc.save(ARTIFACTS_DIR + "CloneAndCombineDocuments.insert_document_at_bookmark.docx") |
Anexar um documento
Você pode ter um caso de uso em que precise incluir páginas adicionais de um documento no final de um documento existente. Para fazer isso, basta chamar o método append_document para adicionar um documento ao final de outro.
O exemplo de código a seguir mostra como anexar um documento ao final de outro documento:
# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git. | |
dst_doc = aw.Document() | |
dst_doc.first_section.body.append_paragraph("Destination document text. ") | |
src_doc = aw.Document() | |
src_doc.first_section.body.append_paragraph("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. | |
dst_doc.append_document(src_doc, aw.ImportFormatMode.KEEP_SOURCE_FORMATTING) | |
dst_doc.save(ARTIFACTS_DIR + "JoinAndAppendDocuments.keep_source_formatting.docx") |
Importar e inserir nós manualmente
Aspose.Words permite inserir e anexar documentos automaticamente sem quaisquer requisitos de importação prévios. No entanto, se você precisar inserir ou anexar um nó específico do seu documento, como uma seção ou um parágrafo, primeiro será necessário importar esse nó manualmente.
Quando você precisa inserir ou anexar uma seção ou parágrafo a outro, você basicamente precisa importar os nós da primeira árvore de nós do documento para a segunda usando o método import_node. Após importar seus nós, você precisa usar o método insert_after/insert_before para inserir um novo nó antes/depois do nó de referência. Isso permite personalizar o processo de inserção importando nós de um documento e inserindo-os em determinadas posições.
Você também pode usar o método append_child para adicionar um novo nó especificado ao final da lista de nós filhos, por exemplo, se desejar acrescentar conteúdo no nível do parágrafo em vez de no nível da seção.
O exemplo de código a seguir mostra como importar nós manualmente e inseri-los após um nó específico usando o método insert_after:
# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git. | |
@staticmethod | |
def insert_document(insertion_destination: aw.Node, doc_to_insert: aw.Document): | |
"""Inserts content of the external document after the specified node. | |
Section breaks and section formatting of the inserted document are ignored. | |
:param insertion_destination: Node in the destination document after which the content | |
Should be inserted. This node should be a block level node (paragraph or table). | |
:param doc_to_insert: The document to insert. | |
""" | |
if insertion_destination.node_type not in (aw.NodeType.PARAGRAPH, aw.NodeType.TABLE): | |
raise ValueError("The destination node should be either a paragraph or table.") | |
destination_parent = insertion_destination.parent_node | |
importer = aw.NodeImporter(doc_to_insert, insertion_destination.document, aw.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 src_section in doc_to_insert.sections: | |
for src_node in src_section.as_section().body.get_child_nodes(aw.NodeType.ANY, False): | |
if src_node.node_type == aw.NodeType.PARAGRAPH: | |
para = src_node.as_paragraph() | |
if para.is_end_of_section and not para.has_child_nodes: | |
continue | |
new_node = importer.import_node(src_node, True) | |
destination_parent.insert_after(new_node, insertion_destination) | |
insertion_destination = new_node |
O conteúdo é importado para o documento de destino seção por seção, o que significa que as configurações, como configuração de página e cabeçalhos ou rodapés, são preservadas durante a importação. Também é útil observar que você pode definir configurações de formatação ao inserir ou anexar um documento para especificar como dois documentos serão unidos.
Propriedades comuns para inserir e anexar documentos
Os métodos insert_document e append_document aceitam ImportFormatMode e ImportFormatOptions como parâmetros de entrada. O ImportFormatMode permite controlar como a formatação do documento é mesclada ao importar conteúdo de um documento para outro, selecionando diferentes modos de formato, como USE_DESTINATION_STYLES, KEEP_SOURCE_FORMATTING e KEEP_DIFFERENT_STYLES. O ImportFormatOptions permite selecionar diferentes opções de importação, como ignore_header_footer, ignore_text_boxes, keep_source_numbering, merge_pasted_lists e smart_style_behavior.
Aspose.Words permite ajustar a visualização de um documento resultante quando dois documentos são adicionados em uma operação de inserção ou acréscimo usando Section e PageSetup. A propriedade page_setup contém todos os atributos de uma seção como section_start, restart_page_numbering, page_starting_number, orientation e outros. O caso de uso mais comum é definir a propriedade section_start para definir se o conteúdo adicionado aparecerá na mesma página ou será dividido em uma nova.
O exemplo de código a seguir mostra como anexar um documento a outro evitando que o conteúdo se divida em duas páginas:
# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git. | |
src_doc = aw.Document(MY_DIR + "Document source.docx") | |
dst_doc = aw.Document(MY_DIR + "Northwind traders.docx") | |
# Set the source document to continue straight after the end of the destination document. | |
src_doc.first_section.page_setup.section_start = aw.SectionStart.CONTINUOUS | |
# Restart the page numbering on the start of the source document. | |
src_doc.first_section.page_setup.restart_page_numbering = True | |
src_doc.first_section.page_setup.page_starting_number = 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. | |
src_doc.first_section.page_setup.page_width = dst_doc.last_section.page_setup.page_width | |
src_doc.first_section.page_setup.page_height = dst_doc.last_section.page_setup.page_height | |
src_doc.first_section.page_setup.orientation = dst_doc.last_section.page_setup.orientation | |
# Iterate through all sections in the source document. | |
for para in src_doc.get_child_nodes(aw.NodeType.PARAGRAPH, True): | |
para = para.as_paragraph() | |
para.paragraph_format.keep_with_next = True | |
dst_doc.append_document(src_doc, aw.ImportFormatMode.KEEP_SOURCE_FORMATTING) | |
dst_doc.save(ARTIFACTS_DIR + "JoinAndAppendDocuments.different_page_setup.docx") |