使用DocumentBuilder插入文档元素
DocumentBuilder
用于修改文档。 本文解释并描述了如何执行许多任务:
插入文本字符串
只需将需要插入到文档中的文本字符串传递给DocumentBuilder.Write
方法即可。 文本格式由Font
属性决定。 此对象包含不同的字体属性(字体名称、字体大小、颜色等)。 一些重要的字体属性也由DocumentBuilder属性表示,以允许您直接访问它们。 这些是布尔属性Font.Bold
,Font.Italic
和Font.Underline
。
请注意,您设置的字符格式将应用于从文档当前位置开始插入的所有文本。
下面的示例使用DocumentBuilder插入格式化文本。
// The path to the documents directory. | |
System::String outputDataDir = GetOutputDataDir_WorkingWithDocument(); | |
// Initialize document. | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
// Specify font formatting before adding text. | |
System::SharedPtr<Font> font = builder->get_Font(); | |
font->set_Size(16); | |
font->set_Bold(true); | |
font->set_Color(System::Drawing::Color::get_Blue()); | |
font->set_Name(u"Arial"); | |
font->set_Underline(Underline::Dash); | |
builder->Write(u"Sample text."); | |
System::String outputPath = outputDataDir + u"WriteAndFont.doc"; | |
doc->Save(outputPath); |
插入段落
DocumentBuilder.Writeln
也将文本字符串插入到文档中,但此外,它还添加了一个段落中断。 当前字体格式也由DocumentBuilder.Font
属性指定,当前段落格式由DocumentBuilder.ParagraphFormat
属性确定。 下面的示例演示如何在文档中插入段落。
// The path to the documents directory. | |
System::String outputDataDir = GetOutputDataDir_WorkingWithDocument(); | |
// Initialize document. | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
// Specify font formatting | |
System::SharedPtr<Font> font = builder->get_Font(); | |
font->set_Size(16); | |
font->set_Bold(true); | |
font->set_Color(System::Drawing::Color::get_Blue()); | |
font->set_Name(u"Arial"); | |
font->set_Underline(Underline::Dash); | |
// Specify paragraph formatting | |
System::SharedPtr<ParagraphFormat> paragraphFormat = builder->get_ParagraphFormat(); | |
paragraphFormat->set_FirstLineIndent(8); | |
paragraphFormat->set_Alignment(ParagraphAlignment::Justify); | |
paragraphFormat->set_KeepTogether(true); | |
builder->Writeln(u"A whole paragraph."); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertParagraph.doc"; | |
doc->Save(outputPath); |
插入表
使用DocumentBuilder创建表的基本算法很简单:
- 使用
DocumentBuilder.StartTable
启动表。 - 使用
DocumentBuilder.InsertCell
插入单元格。 这会自动启动一个新行。 如果需要,请使用DocumentBuilder.CellFormat
属性指定单元格格式。 - 使用
DocumentBuilder
方法插入单元格内容。 - 重复步骤2和3,直到行完成。
- 调用
DocumentBuilder.EndRow
结束当前行。 如果需要,请使用DocumentBuilder.RowFormat
属性指定行格式。 - 重复步骤2-5,直到表格完成。
- 调用
DocumentBuilder.EndTable
完成表构建。 下面描述了适当的DocumentBuilder表创建方法。
开始一张桌子
调用DocumentBuilder.StartTable
是构建表的第一步。 它也可以在单元格内部调用,在这种情况下,它会启动一个嵌套表。 下一个要调用的方法是DocumentBuilder.InsertCell
。
插入单元格
调用DocumentBuilder->InsertCell
后,将创建一个新单元格,并且使用DocumentBuilder
类的其他方法添加的任何内容都将添加到当前单元格中。 要在同一行中启动新单元格,请再次调用DocumentBuilder->InsertCell
。 使用DocumentBuilder.CellFormat
属性指定单元格格式。 它返回一个CellFormat
对象,表示表格单元格的所有格式。
结束一行
调用DocumentBuilder.EndRow
完成当前行。 如果在那之后立即调用DocumentBuilder->InsertCell
,则表将继续在新行上。
使用DocumentBuilder.RowFormat
属性指定行格式。 它返回一个RowFormat
对象,表示表行的所有格式。
结束表
调用DocumentBuilder.EndTable
完成当前表。 此方法应在调用DocumentBuilder->EndRow
后仅调用一次。 调用时,DocumentBuilder.EndTable
将光标移出当前单元格到表格后面的位置。 下面的示例演示如何构建包含2行和2列的格式化表。
// The path to the documents directory. | |
System::String outputDataDir = GetOutputDataDir_WorkingWithDocument(); | |
// Initialize document. | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
System::SharedPtr<Table> table = builder->StartTable(); | |
// Insert a cell | |
builder->InsertCell(); | |
// Use fixed column widths. | |
table->AutoFit(AutoFitBehavior::FixedColumnWidths); | |
builder->get_CellFormat()->set_VerticalAlignment(CellVerticalAlignment::Center); | |
builder->Write(u"This is row 1 cell 1"); | |
// Insert a cell | |
builder->InsertCell(); | |
builder->Write(u"This is row 1 cell 2"); | |
builder->EndRow(); | |
// Insert a cell | |
builder->InsertCell(); | |
// Apply new row formatting | |
builder->get_RowFormat()->set_Height(100); | |
builder->get_RowFormat()->set_HeightRule(HeightRule::Exactly); | |
builder->get_CellFormat()->set_Orientation(TextOrientation::Upward); | |
builder->Writeln(u"This is row 2 cell 1"); | |
// Insert a cell | |
builder->InsertCell(); | |
builder->get_CellFormat()->set_Orientation(TextOrientation::Downward); | |
builder->Writeln(u"This is row 2 cell 2"); | |
builder->EndRow(); | |
builder->EndTable(); | |
System::String outputPath = outputDataDir + u"DocumentBuilderBuildTable.doc"; | |
doc->Save(outputPath); |
插入中断
如果要显式开始新行、段落、列、节或页,请调用DocumentBuilder.InsertBreak
。 将需要插入的由BreakType
枚举表示的中断类型传递给此方法。 下面的示例演示如何在文档中插入分页符。
// The path to the documents directory. | |
System::String outputDataDir = GetOutputDataDir_WorkingWithDocument(); | |
// Initialize document. | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->Writeln(u"This is page 1."); | |
builder->InsertBreak(BreakType::PageBreak); | |
builder->Writeln(u"This is page 2."); | |
builder->InsertBreak(BreakType::PageBreak); | |
builder->Writeln(u"This is page 3."); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertBreak.doc"; | |
doc->Save(outputPath); |
插入图像
DocumentBuilder提供DocumentBuilder->InsertImage
方法的多个重载,允许您插入内联或浮动图像。 如果图像是EMF或WMF元文件,它将以元文件格式插入到文档中。 所有其他图像将以PNG格式存储。 DocumentBuilder->InsertImage
方法可以使用来自不同来源的图像:
- 通过传递字符串参数
DocumentBuilder->InsertImage
从文件或URL
。 - 通过传递
Stream
参数DocumentBuilder->InsertImage
来自流。 - 通过传递图像参数
DocumentBuilder->InsertImage
从图像对象。 - 通过传递字节数组参数
DocumentBuilder.InsertImage
从字节数组。对于每个DocumentBuilder->InsertImage
方法,还有更多重载,允许您使用以下选项插入图像: - 在特定位置内联或浮动,例如
DocumentBuilder->InsertImage
。 - 百分比比例或自定义大小,例如
DocumentBuilder.InsertImage
。 此外,DocumentBuilder->InsertImage
方法返回刚刚创建和插入的Shape
对象,以便您可以进一步修改形状的属性。
插入内联图像
将表示包含图像的文件的单个字符串传递到DocumentBuilder->InsertImage
,以将图像作为内联图形插入到文档中。 下面的示例演示如何在光标位置插入内联图像到文档中。
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->InsertImage(inputDataDir + u"Watermark.png"); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertImage.InsertInlineImage.doc"; | |
doc->Save(outputPath); |
插入浮动(绝对定位)图像
此示例在指定的位置和大小插入文件或URL
中的浮动图像。
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->InsertImage(inputDataDir + u"Watermark.png", RelativeHorizontalPosition::Margin, 100, RelativeVerticalPosition::Margin, 100, 200, 100, WrapType::Square); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertImage.InsertFloatingImage.doc"; | |
doc->Save(outputPath); |
插入书签
要在文档中插入书签,您应该执行以下操作:
- 调用
DocumentBuilder->StartBookmark
,将所需的书签名称传递给它。 - 使用DocumentBuilder方法插入书签文本。
- 调用
DocumentBuilder.EndBookmark
传递与DocumentBuilder->StartBookmark相同的名称。 - 书签可以重叠并跨越任何范围。 要创建有效的书签,您需要使用相同的书签名称调用
DocumentBuilder->StartBookmark
和DocumentBuilder->EndBookmark
。
下面的示例演示如何使用文档生成器将书签插入文档。
// The path to the documents directory. | |
System::String outputDataDir = GetOutputDataDir_WorkingWithDocument(); | |
// Initialize document. | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->StartBookmark(u"FineBookmark"); | |
builder->Writeln(u"This is just a fine bookmark."); | |
builder->EndBookmark(u"FineBookmark"); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertBookmark.doc"; | |
doc->Save(outputPath); |
插入Form
字段
表单字段是允许与用户"交互"的Word字段的特定情况。 Microsoft Word中的表单字段包括文本框,组合框和复选框。DocumentBuilder提供了将每种类型的表单字段插入文档的特殊方法:DocumentBuilder.InsertTextInput
、DocumentBuilder->InsertCheckBox
和DocumentBuilder.InsertComboBox
。 请注意,如果为表单字段指定名称,则会自动创建具有相同名称的书签。
插入文本输入
DocumentBuilder.InsertTextInput
将文本框插入到文档中。 下面的示例演示如何将文本输入表单字段插入到文档中。
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->InsertTextInput(u"TextInput", TextFormFieldType::Regular, u"", u"Hello", 0); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertElements.InsertTextInputFormField.doc"; | |
doc->Save(outputPath); |
插入复选框
调用DocumentBuilder.InsertCheckBox
将复选框插入到文档中。 下面的示例演示如何将复选框表单字段插入到文档中。
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->InsertCheckBox(u"CheckBox", true, true, 0); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertElements.InsertCheckBoxFormField.doc"; | |
doc->Save(outputPath); |
插入组合框
调用DocumentBuilder.InsertComboBox
将组合框插入到文档中。 下面的示例演示如何将组合框表单字段插入到文档中。
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
System::ArrayPtr<System::String> items = System::MakeArray<System::String>({u"One", u"Two", u"Three"}); | |
builder->InsertComboBox(u"DropDown", items, 0); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertElements.InsertComboBoxFormField.doc"; | |
doc->Save(outputPath); |
在字段级别插入区域设置
客户现在可以在字段级别指定区域设置,并且可以实现更好的控制。 区域设置Id可以与DocumentBuilder内的每个字段相关联。 下面的示例说明了如何使用此选项。
System::String outputDataDir = GetOutputDataDir_WorkingWithFields(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(); | |
System::SharedPtr<Field> field = builder->InsertField(FieldType::FieldDate, true); | |
field->set_LocaleId(1049); | |
builder->get_Document()->Save(outputDataDir + u"SpecifylocaleAtFieldlevel.docx"); |
插入超链接
使用DocumentBuilder.InsertHyperlink
将超链接插入到文档中。 此方法接受三个参数:要在文档中显示的链接的文本、链接目标(URL或文档内书签的名称)以及如果URL
是文档内书签的名称,则应为true的布尔参数。DocumentBuilder.InsertHyperlink内部调用DocumentBuilder.InsertField
。该方法始终在URL的开头和结尾添加撇号。 请注意,您需要使用Font
属性显式指定超链接显示文本的字体格式。 下面的示例使用DocumentBuilder将超链接插入到文档中。
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->Write(u"Please make sure to visit "); | |
// Specify font formatting for the hyperlink. | |
builder->get_Font()->set_Color(System::Drawing::Color::get_Blue()); | |
builder->get_Font()->set_Underline(Underline::Single); | |
// Insert the link. | |
builder->InsertHyperlink(u"Aspose Website", u"http://www.aspose.com", false); | |
// Revert to default formatting. | |
builder->get_Font()->ClearFormatting(); | |
builder->Write(u" for more information."); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertElements.InsertHyperlink.doc"; | |
doc->Save(outputPath); |
插入Ole对象
如果你想Ole对象调用DocumentBuilder.InsertOleObject
。 将ProgId
与其他参数显式传递给此方法。 下面的示例演示如何将Ole对象插入到文档中。
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->InsertOleObject(u"http://www.aspose.com", u"htmlfile", true, true, nullptr); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertElements.InsertOleObject.doc"; | |
doc->Save(outputPath); |
插入Ole对象时设置文件名和扩展名
如果OLE处理程序未知,OLE包是存储嵌入对象的传统和"未记录"方式。 早期的Windows版本,如Windows3.1,95和98有Packager。exe应用程序,可用于将任何类型的数据嵌入到文档中。 现在,这个应用程序被排除在Windows之外,但是MSWord和其他应用程序仍然使用它来嵌入数据,如果OLE处理程序丢失或未知。 OlePackage类允许访问OLE包属性。 下面的示例演示如何为OLE包设置文件名、扩展名和显示名.
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
System::ArrayPtr<uint8_t> bs = System::IO::File::ReadAllBytes(inputDataDir + u"input.zip"); | |
System::SharedPtr<System::IO::Stream> stream = System::MakeObject<System::IO::MemoryStream>(bs); | |
System::SharedPtr<Shape> shape = builder->InsertOleObject(stream, u"Package", true, nullptr); | |
System::SharedPtr<OlePackage> olePackage = shape->get_OleFormat()->get_OlePackage(); | |
olePackage->set_FileName(u"filename.zip"); | |
olePackage->set_DisplayName(u"displayname.zip"); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertElements.InsertOleObjectwithOlePackage.doc"; | |
doc->Save(outputPath); |
插入HTML
您可以轻松地将包含HTML片段或整个HTML文档的HTML字符串插入到Word文档中。 只需将此字符串传递给DocumentBuilder->InsertHtml
方法即可。 该方法的有用实现之一是将HTML字符串存储在数据库中,并在mail merge期间将其插入文档中,以获取添加的格式化内容,而不是使用文档构建器的各种方法构建 下面的示例显示使用DocumentBuilder在文档中插入HTML。
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->InsertHtml(u"<P align='right'>Paragraph right</P><b>Implicit paragraph left</b><div align='center'>Div center</div><h1 align='left'>Heading 1 left.</h1>"); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertElements.InsertHtml.doc"; | |
doc->Save(outputPath); |
在文档中插入水平规则
Below code示例演示如何使用DocumentBuilder->InsertHorizontalRule
方法将水平规则形状插入文档。
// Initialize document. | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(); | |
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->Writeln(u"Insert a horizontal rule shape into the document."); | |
builder->InsertHorizontalRule(); | |
System::String outputPath = outputDataDir + u"DocumentBuilderInsertHorizontalRule.doc"; | |
doc->Save(outputPath); |