Use DocumentBuilder para Inserir Elementos do documento

O DocumentBuilder é utilizado para modificar documentos. Este artigo explica e descreve como executar uma série de Tarefas.

Inserir uma sequência de texto

Basta passar a sequência de texto que você precisa inserir no documento para o método DocumentBuilder.write. A formatação do texto é determinada pela propriedade Font. Este objeto contém diferentes atributos de fonte (Nome da fonte, tamanho da fonte, cor e assim por diante). Alguns atributos de fonte importantes também são representados por propriedades DocumentBuilder para permitir que você os acesse diretamente. Estas são propriedades booleanas Font.getBold, Font.getItalic e Font.getUnderline.

O exemplo de código a seguir insere texto formatado usando DocumentBuilder.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Font font = builder.getFont();
font.setSize(16);
font.setColor(Color.blue);
font.setBold(true);
font.setName("Algerian");
font.setUnderline(Underline.DOUBLE);
builder.write("aspose......... aspose_words_java");

Inserir um parágrafo

DocumentBuilder.o writeln também insere uma sequência de texto no documento, mas, além disso, adiciona uma quebra de parágrafo. A formatação da fonte atual também é especificada pelo DocumentBuilder.A propriedade getFont e a formatação do parágrafo atual são determinadas pelo DocumentBuilder.getParagraphFormat propriedade.

O exemplo de código a seguir mostra como inserir um parágrafo no documento.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Font font = builder.getFont();
font.setSize(16);
font.setColor(Color.DARK_GRAY);
font.setBold(true);
font.setName("Algerian");
font.setUnderline(2);
ParagraphFormat paragraphFormat = builder.getParagraphFormat();
paragraphFormat.setFirstLineIndent(12);
paragraphFormat.setAlignment(1);
paragraphFormat.setKeepTogether(true);
builder.write("This is a sample Paragraph");
doc.save(dataDir + "InsertParagraph_out.doc");

Inserir uma tabela

O algoritmo básico para criar uma tabela usando DocumentBuilder é simples:

  1. Inicie a tabela utilizando DocumentBuilder.startTable.
  2. Insira uma célula usando DocumentBuilder.insertCell. Isso inicia automaticamente uma nova linha. Se necessário, use a propriedade DocumentBuilder.getCellFormat para especificar a formatação da célula.
  3. Insira o conteúdo da célula usando os métodos DocumentBuilder.
  4. Repita as etapas 2 e 3 até que a linha esteja completa.
  5. Chame DocumentBuilder.endRow para terminar a linha atual. Se necessário, use a propriedade DocumentBuilder.RowFormat para especificar a formatação da linha.
  6. Repita os passos 2 - 5 até que a tabela esteja completa.
  7. Chame DocumentBuilder.endTable para terminar a construção da tabela. Os métodos apropriados de criação de tabelas DocumentBuilder são descritos abaixo.

Iniciar uma mesa

Chamando DocumentBuilder.startTable é o primeiro passo na construção de uma tabela. Também pode ser chamado dentro de uma célula, neste caso, inicia uma tabela aninhada. O próximo método a chamar é DocumentBuilder.insertCell.

Inserir uma célula

Depois de chamar DocumentBuilder.insertCell, uma nova célula é criada e qualquer conteúdo que você adicionar usando outros métodos da classe DocumentBuilder será adicionado à célula atual. Para iniciar uma nova célula na mesma linha, chame DocumentBuilder.insertCell outra vez. Use o DocumentBuilder.getCellFormat Propriedade para especificar a formatação da célula. Ele retorna um objeto getCellFormat que representa toda a formatação de uma célula da tabela.

Terminar uma linha

Chamada DocumentBuilder.endRow para terminar a linha actual. Se você chamar DocumentBuilder.insertCell imediatamente depois disso, a tabela continua em uma nova linha. Use a propriedade DocumentBuilder.RowFormat para especificar a formatação da linha. Ele retorna um objeto RowFormat que representa toda a formatação de uma linha de tabela.

Terminar uma mesa

Chamada DocumentBuilder.endTable para terminar a tabela actual. Este método deve ser chamado apenas uma vez após DocumentBuilder.endRow foi chamado. Quando chamado, DocumentBuilder.endTable move o cursor para fora da célula actual para uma posição logo após a tabela. O exemplo a seguir demonstra como construir uma tabela formatada que contém 2 linhas e 2 colunas.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(DocumentBuilderBuildTable.class);
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Table table = builder.startTable();
builder.insertCell();
table.autoFit(AutoFitBehavior.FIXED_COLUMN_WIDTHS);
builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
builder.write("This is Row 1 Cell 1");
builder.insertCell();
builder.write("This is Row 1 Cell 2");
builder.endRow();
builder.getRowFormat().setHeight(100);
builder.getRowFormat().setHeightRule(HeightRule.EXACTLY);
builder.getCellFormat().setOrientation(TextOrientation.UPWARD);
builder.write("This is Row 2 Cell 1");
builder.insertCell();
builder.getCellFormat().setOrientation(TextOrientation.DOWNWARD);
builder.write("This is Row 2 Cell 2");
builder.endRow();
builder.endTable();
doc.save(dataDir + "output.doc");

Inserir uma pausa

Se pretender iniciar explicitamente uma nova linha, parágrafo, coluna, secção ou página, ligue para DocumentBuilder.insertBreak. Passe para este método o tipo de quebra que você precisa inserir Que é representado pela enumeração BreakType. O exemplo de código a seguir mostra como inserir quebras de página em um documento.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(DocumentBuilderInsertBreak.class);
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.write("This is Page 1");
builder.insertBreak(BreakType.PAGE_BREAK);
builder.write("This is Page 2");
builder.insertBreak(BreakType.PAGE_BREAK);
builder.write("This is Page 3");
doc.save(dataDir + "output.doc");

Inserir uma imagem

DocumentBuilder fornece várias sobrecargas do método DocumentBuilder.insertImage que permite inserir uma imagem embutida ou flutuante. Se a imagem for um metarquivo EMF ou WMF, será inserida no documento em formato metarquivo. Todas as outras imagens serão armazenadas no formato PNG. O DocumentBuilder.insertImage método pode usar imagens de diferentes fontes:

  • De um arquivo ou URL passando um parâmetro de string
  • De um fluxo passando um parâmetro Stream
  • De um objeto de imagem passando um parâmetro de imagem
  • De uma matriz de bytes passando um parâmetro de matriz de bytes
  • E outros

Para cada um dos DocumentBuilder.insertImage métodos, existem outras sobrecargas que permitem inserir uma imagem com as seguintes opções:

  • Em linha ou flutuante numa posição específica
  • Escala percentual ou tamanho personalizado

Além disso, o DocumentBuilder.insertImage método retorna um objeto Shape que acabou de ser criado e inserido para que você possa modificar ainda mais as propriedades da forma.

Inserir uma imagem embutida

Passe uma única string representando um arquivo que contém a imagem para DocumentBuilder.insertImage para inserir a imagem no documento como um gráfico embutido. O exemplo de código a seguir mostra como inserir uma imagem embutida na posição do cursor em um documento.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(DocumentBuilderInsertInlineImage.class);
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertImage(dataDir + "test.jpg");
doc.save(dataDir + "output.doc");

Inserir uma imagem flutuante (absolutamente posicionada)

Este exemplo insere uma imagem flutuante de um arquivo ou URL em uma posição e tamanho especificados.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(DocumentBuilderInsertFloatingImage.class);
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertImage(dataDir + "test.jpg",
RelativeHorizontalPosition.MARGIN,
100,
RelativeVerticalPosition.MARGIN,
100,
200,
100,
WrapType.SQUARE);
doc.save(dataDir + "output.doc");

Inserir um marcador

Para inserir um marcador no documento, você deve fazer o seguinte:

  1. Chame DocumentBuilder.startBookmark passando - lhe o nome desejado do marcador.
  2. Insira o texto do marcador utilizando os métodos DocumentBuilder.
  3. Chame DocumentBuilder.endBookmark passando o mesmo nome que você usou com DocumentBuilder.startBookmark.

Os marcadores podem sobrepor-se e abranger qualquer intervalo. Para criar um marcador válido, Você precisa chamar ambos DocumentBuilder.startBookmark e DocumentBuilder.endBookmark com o mesmo nome de marcador.

Marcadores mal formados ou marcadores com nomes duplicados serão ignorados quando o documento for salvo.

O exemplo de código a seguir mostra como inserir um marcador em um documento usando um construtor de documentos.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(DocumentBuilderInsertBookmark.class);
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.startBookmark("FineBookMark");
builder.write("This is just a fine bookmark.");
builder.endBookmark("FineBookmark");
doc.save(dataDir + "output.doc");//

Inserir um campo

Os Campos dos documentos Microsoft Word consistem num código de campo e num resultado de campo. O código do campo é como uma fórmula e o resultado do campo é o valor que a fórmula produz. O código de campo também pode conter comutadores de campo que são instruções adicionais para executar uma ação específica. Você pode alternar entre a exibição de códigos de campo e resultados em seu documento em Microsoft Word usando o atalho de teclado Alt+F9. Os códigos de campo aparecem entre chaves ({ }).Use DocumentBuilder.insertField para criar campos no documento. Você precisa especificar um tipo de campo, Código de campo e valor de campo. Se você não tiver certeza sobre a sintaxe do código de campo específico, crie o campo em Microsoft Word Primeiro e alterne para ver seu código de campo. O exemplo de código a seguir insere um campo de mesclagem em um documento usando DocumentBuilder.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(DocumentBuilderInsertField.class);
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.getFont().setLocaleId(1031);
builder.insertField("MERGEFIELD Date1 \\@ \"dddd, d MMMM yyyy\"");
builder.write(" - ");
builder.insertField("MERGEFIELD Date2 \\@ \"dddd, d MMMM yyyy\"");
doc.save(dataDir + "output.doc");

Inserir um campo Form

Os campos de formulário são um caso particular de campos de palavras que permitem “interacção” com o utilizador. Os campos de formulário em Microsoft Word incluem textbox, Combobox e checkbox.DocumentBuilder fornece métodos especiais para inserir cada tipo de campo de formulário no documento: DocumentBuilder.insertTextInput, DocumentBuilder.insertCheckBox e DocumentBuilder.insertComboBox. Observe que, se você especificar um nome para o campo do formulário, um marcador será criado automaticamente com o mesmo nome.

Inserir uma entrada de texto

DocumentBuilder.insertTextInput para inserir uma caixa de texto no documento. O exemplo de código a seguir mostra como inserir um campo de formulário de entrada de texto em um documento.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(DocumentBuilderInsertTextInputFormField.class);
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertTextInput("TextInput", TextFormFieldType.REGULAR, "", "Hello", 0);
doc.save(dataDir + "output.doc");

Inserir um CheckBox

Chamada DocumentBuilder.insertCheckBox para inserir um checkbox no documento. O exemplo de código a seguir mostra como inserir um campo de formulário checkbox em um documento.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(DocumentBuilderInsertCheckBoxFormField.class);
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertCheckBox("CheckBox", true, true, 0);
doc.save(dataDir + "output.doc");

Inserir uma caixa de combinação

Chamada DocumentBuilder.insertComboBox para inserir uma caixa de combinação no documento. O exemplo de código a seguir mostra como inserir um campo de formulário de caixa de combinação em um documento.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(DocumentBuilderInsertComboBoxFormField.class);
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
String[] items = {"One", "Two", "Three"};
builder.insertComboBox("DropDown", items, 0);
doc.save(dataDir + "output.doc");

Inserir localidade ao nível do campo

Os clientes podem agora especificar a localidade ao nível do campo e obter um melhor controlo. Os Ids de localidade podem ser associados a cada campo dentro do DocumentBuilder. Os exemplos abaixo ilustram como utilizar esta opção.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
DocumentBuilder builder = new DocumentBuilder();
Field field = builder.insertField(FieldType.FIELD_DATE, true);
field.setLocaleId(1049);
builder.getDocument().save(getArtifactsDir() + "WorkingWithFields.SpecifylocaleAtFieldlevel.docx");

Inserir HTML

Você pode inserir facilmente uma string HTML que contenha um fragmento HTML ou um documento HTML inteiro no documento do Word. Basta passar esta string para o DocumentBuilder.insertHtml Método. Uma das implementações úteis do método é armazenar uma string HTML em um banco de dados e inseri-la no documento durante Mail Merge para obter o conteúdo formatado adicionado em vez de construí-lo usando vários métodos do construtor de documentos. O exemplo de código a seguir mostra inserções HTML em um documento usando DocumentBuilder.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(DocumentBuilderInsertHtml.class);
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertHtml(
"<P align='right'>Paragraph right</P>" +
"<b>Implicit paragraph left</b>" +
"<div align='center'>Div center</div>" +
"<h1 align='left'>Heading 1 left.</h1>");
doc.save(dataDir + "output.doc");

Inserir uma hiperligação

Use DocumentBuilder.insertHyperlink para inserir uma hiperligação no documento. Este método Aceita três parâmetros: texto do link a ser exibido no documento, destino do link (URL ou o nome de um marcador dentro do documento) e um parâmetro booleano que deve ser verdadeiro se URL for o nome de um marcador dentro do documento.DocumentBuilder.insertHyperlink chama internamente DocumentBuilder.insertField. O método sempre adiciona apóstrofos no início e no final do URL. Observe que você precisa especificar a formatação da fonte para o texto de exibição do hiperlink explicitamente usando a propriedade Font. O exemplo de código a seguir insere um hiperlink em um documento usando DocumentBuilder.

Inserir um índice

Você pode inserir um campo TOC (índice) no documento na posição atual chamando o método DocumentBuilder.insertTableOfContents. O DocumentBuilder.insertTableOfContents método só irá inserir um campo TOC no documento. Para construir o índice e exibi-lo de acordo com os números das páginas, o método both Document.UpdateFieldsdeve ser chamado após a inserção do campo. O exemplo de código a seguir mostra como inserir um campo sumário em um documento.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
String dataDir = Utils.getDataDir(DocumentBuilderInsertTableOfContents.class);
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertTableOfContents("\\o \"1-3\" \\h \\z \\u");
builder.insertBreak(BreakType.PAGE_BREAK);
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
builder.writeln("Heading 1");
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_2);
builder.writeln("Heading 1.1");
builder.writeln("Heading 1.2");
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
builder.writeln("Heading 2");
builder.writeln("Heading 3");
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_2);
builder.writeln("Heading 3.1");
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_3);
builder.writeln("Heading 3.1.1");
builder.writeln("Heading 3.1.2");
builder.writeln("Heading 3.1.3");
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_2);
builder.writeln("Heading 3.2");
builder.writeln("Heading 3.3");
doc.updateFields();
doc.save(dataDir + "output.doc");

Inserir Ole Objecto

Se você quiser Ole Chamada de objeto DocumentBuilder.insertOleObjectAsIcon.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertOleObject("http://www.aspose.com", "htmlfile", true, true, null);
doc.save(getArtifactsDir() + "WorkingWithOleObjectsAndActiveX.InsertOleObject.docx");

Definir o nome e a extensão do ficheiro ao inserir o objecto Ole

O pacote OLE é uma maneira legada e" não documentada " de armazenar objetos incorporados se o manipulador OLE for desconhecido. As primeiras Windows versões como Windows 3.1, 95 e 98 tinham uma aplicação Packager.exe que podia ser utilizada para incorporar qualquer tipo de dados no documento. Agora, este aplicativo é excluído de Windows mas MS Word e outros aplicativos ainda o usam para incorporar dados se o manipulador OLE estiver ausente ou desconhecido. OlePackage classe permite aceder a OLE Package Propriedades.O exemplo de código a seguir mostra como definir o nome do arquivo, a extensão e o nome de exibição para OLE Package.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
byte[] bs = FileUtils.readFileToByteArray(new File(getMyDir() + "Zip file.zip"));
try (ByteArrayInputStream stream = new ByteArrayInputStream(bs))
{
Shape shape = builder.insertOleObject(stream, "Package", true, null);
OlePackage olePackage = shape.getOleFormat().getOlePackage();
olePackage.setFileName("filename.zip");
olePackage.setDisplayName("displayname.zip");
doc.save(getArtifactsDir() + "WorkingWithOleObjectsAndActiveX.InsertOleObjectWithOlePackage.docx");
}

Obter acesso aos dados brutos do objecto OLE

O exemplo de código a seguir demonstra como obter dados brutos do objeto OLE usando o método OleFormat.GetRawData ().

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Shape oleShape = (Shape) doc.getChild(NodeType.SHAPE, 0, true);
byte[] oleRawData = oleShape.getOleFormat().getRawData();

Inserir Regra Horizontal no documento

O exemplo de código a seguir mostra como inserir a forma de regra horizontal em um documento usando o método DocumentBuilder.InsertHorizontalRule.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Initialize document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.writeln("Insert a horizontal rule shape into the document.");
builder.insertHorizontalRule();
dataDir = dataDir + "DocumentBuilder.InsertHorizontalRule_out.doc";
doc.save(dataDir);

Trabalhar com formas

Inserção de formas Inline e de flutuação livre

Você pode inserir uma forma embutida com um tipo e tamanho especificados e uma forma flutuante com a posição, tamanho e tipo de quebra de texto especificados em um documento usando o método DocumentBuilder.InsertShape. O método DocumentBuilder.InsertShape permite inserir a forma DML no modelo do documento. O documento deve ser salvo no formato, que suporta formas DML, caso contrário, esses nós serão convertidos em forma VML, enquanto o documento é salvo. O exemplo de código a seguir mostra como inserir esses tipos de formas no documento.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
//Free-floating shape insertion.
Shape shape = builder.insertShape(ShapeType.TEXT_BOX,
RelativeHorizontalPosition.PAGE, 100,
RelativeVerticalPosition.PAGE, 100,
50, 50,
WrapType.NONE);
shape.setRotation(30.0);
builder.writeln();
//Inline shape insertion.
shape = builder.insertShape(ShapeType.TEXT_BOX, 50, 50);
shape.setRotation(30.0);
OoxmlSaveOptions so = new OoxmlSaveOptions(SaveFormat.DOCX);
// "Strict" or "Transitional" compliance allows to save shape as DML.
so.setCompliance(OoxmlCompliance.ISO_29500_2008_TRANSITIONAL);
dataDir = dataDir + "Shape_InsertShapeUsingDocumentBuilder_out.docx";
// Save the document to disk.
doc.save(dataDir, so);

Criar Retângulo De Canto De Recorte

Você pode criar um retângulo de Canto de recorte usando Aspose.Words. Os tipos de formas são SingleCornerSnipped, TopCornersSnipped, DiagonalCornersSnipped, TopCornersOneRoundedOneSnipped, SingleCornerRounded, TopCornersRounded, e DiagonalCornersRounded. A forma DML é criada usando o método DocumentBuilder.InsertShape com esses tipos de forma. Esses tipos não podem ser usados para criar formas VML. A tentativa de criar uma forma usando o construtor público da classe" Shape “gera a exceção” NotSupportedException". O exemplo de código a seguir mostra como inserir esses tipos de formas no documento.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Shape shape = builder.insertShape(ShapeType.TOP_CORNERS_SNIPPED, 50, 50);
OoxmlSaveOptions so = new OoxmlSaveOptions(SaveFormat.DOCX);
so.setCompliance(OoxmlCompliance.ISO_29500_2008_TRANSITIONAL);
dataDir = dataDir + "AddCornersSnipped_out.docx";
//Save the document to disk.
doc.save(dataDir, so);

Importar formas com Matemática XML como formas para DOM

Você pode usar a propriedade LoadOptions.ConvertShapeToOfficeMath para converter as formas com EquationXML em objetos do Office Math. O valor predefinido desta propriedade corresponde ao comportamento da palavra MS, ou seja, as formas com a equação XML não são convertidas em objectos do Office math.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
LoadOptions lo = new LoadOptions();
lo.setConvertShapeToOfficeMath(true);
// Specify load option to use previous default behaviour i.e. convert math
// shapes to office math ojects on loading stage.
Document doc = new Document(dataDir + "OfficeMath.docx", lo);
// Save the document into DOCX
doc.save(dataDir + "ConvertShapeToOfficeMath_out.docx", SaveFormat.DOCX);