TextFrames.vb
C# VB
'''' This code is part of Document Solutions for Word demos.'' Copyright (c) MESCIUS inc. All rights reserved.''Imports System.IOImports System.DrawingImports System.Collections.GenericImports System.LinqImports GrapeCity.Documents.Word
'' This sample demonstrates how to add linked text frames to a DOCX,'' with text spanning the frames.Public Class TextFrames Public Function CreateDocx() As GcWordDocument Dim doc = New GcWordDocument()
doc.Load(Path.Combine("Resources", "WordDocs", "SampleParagraphs.docx"))
'' Locate the paragraphs for inserting text frames: Const p1start = "This is the first paragraph of the original document" Const p2start = "This is the second paragraph of the original document" Const p3start = "This is the third paragraph of the original document" Const p4start = "This is the fourth paragraph of the original document"
'' Find individual paragraphs inside the document: Dim p1 = Nothing, p2 = Nothing, p3 = Nothing, p4 = Nothing For Each p In doc.Body.Paragraphs Dim t = p.GetRange().Text If (t.StartsWith(p1start)) Then p1 = p ElseIf (t.StartsWith(p2start)) Then p2 = p ElseIf (t.StartsWith(p3start)) Then p3 = p ElseIf (t.StartsWith(p4start)) Then p4 = p End If Next If p1 Is Nothing OrElse p2 Is Nothing OrElse p3 Is Nothing OrElse p4 Is Nothing Then Throw New Exception("Unexpected: could not find paragraphs.") End If
'' Add new style for text in frames: Dim style = doc.Styles.Add("FrameTextStyle", StyleType.Character) style.Font.Color.RGB = Color.DarkBlue style.Font.Bold = True
'' Generate a long text that we will put into linked text frames: Dim ts = "" For i = 0 To 11 ts += $"Text frame content {i}. " Next
'' NOTE: shapes (including text frames) can be added to text runs only '' (e.g. we cannot add a shape directly to a paragraph).
'' Add a text run at the end of the first paragraph: Dim r1 = p1.GetRange().Runs.Add(" Text run added to paragraph 1. The first shape is inserted inline after this. ")
'' Add a shape to the new text run: Dim s1 = r1.GetRange().Shapes.Add(96, 72)
'' Add a text frame with the generated text to the new shape: Dim tf1 = s1.AddTextFrame(CType(ts, String)) tf1.Format.Margin.AllEdges = 4
For Each r In tf1.GetRange().Runs If r1 IsNot r Then r.Style = style End If Next
'' The text in the frame is rather long, and will not fit inside s1. '' Text frames can be linked so that a long text can span several frames. '' We add two linked frames, one to 2nd paragraph, and one to the first '' paragraph on the page: Dim r2 = p2.GetRange().Runs.Add(" Text run added to paragraph 2. The second shape is inserted inline after this. ") Dim shapes = r2.GetRange().Shapes
Dim s2 = r2.GetRange().Shapes.Add(192, 72) Dim ltf2 = s2.AddLinkedTextFrame(tf1)
'' Default wrap format type for new shapes is inline. '' Here we change the 3rd shape's wrap to square with absolute position '' relative to the very first paragraph in the document: Dim s3 = doc.Body.Paragraphs.First.GetRange().Runs.First.GetRange().Shapes.Add(144, 96) Dim ltf3 = s3.AddLinkedTextFrame(tf1)
s3.WrapFormat.Type = WrapType.Square s3.Position.Vertical.Type = ShapePositionType.Points s3.Position.Vertical.Offset = 0 s3.Position.Horizontal.Type = ShapePositionType.Points s3.Position.Horizontal.Offset = doc.Body.Sections.First.PageSetup.ClientWidth - 144
Return doc End FunctionEnd Class