如何在 Aspose.Words 中将形状发送到前面
How to send a shape to front in Aspose.Words
我在文档上放置水印,但有时水印会出现在某些图像的后面,而我无法将其置于前面。我尝试将 ZOrderPosition 和 ZOrder 属性 设置为像 99 这样的高值,但它仍然不在其他所有内容之前。
出现此问题是因为水印形状位于 Word 文档的页眉页脚文章内,而主要内容位于正文文章内(请参阅 Story class)。如果您使用 Microsoft Word 2016 插入水印,您将观察到相同的行为。文档的所有内容 header/footer 总是在文档的主要内容之后。
不过,您可以通过在每个页面中手动插入水印来解决这个问题。您可以通过将光标移动到文档每个页面的第一个 运行,然后将这些 运行 作为水印的锚点来实现。例如,请看下面的代码:
Document doc = new Document(MyDir + @"input.doc");
Node[] runs = doc.GetChildNodes(NodeType.Run, true).ToArray();
for (int i = 0; i < runs.Length; i++)
{
Run run = (Run)runs[i];
int length = run.Text.Length;
Run currentNode = run;
for (int x = 1; x < length; x++)
{
currentNode = SplitRun(currentNode, 1);
}
}
DocumentBuilder builder = new DocumentBuilder(doc);
PageSetup ps = builder.PageSetup;
NodeCollection smallRuns = doc.GetChildNodes(NodeType.Run, true);
LayoutCollector collector = new LayoutCollector(doc);
int pageIndex = 1;
foreach (Run run in smallRuns)
{
if (collector.GetStartPageIndex(run) == pageIndex)
{
Shape watermark = new Shape(doc, Aspose.Words.Drawing.ShapeType.TextPlainText);
watermark.RelativeHorizontalPosition = RelativeHorizontalPosition.Page;
watermark.RelativeVerticalPosition = RelativeVerticalPosition.Page;
watermark.Width = 300;
watermark.Height = 70;
watermark.HorizontalAlignment = HorizontalAlignment.Center;
watermark.VerticalAlignment = VerticalAlignment.Center;
watermark.Rotation = -40;
watermark.Fill.Color = Color.Gray;
watermark.StrokeColor = Color.Gray;
watermark.TextPath.Text = "watermarkText";
watermark.TextPath.FontFamily = "Arial";
watermark.Name = string.Format("WaterMark_{0}", Guid.NewGuid());
watermark.WrapType = WrapType.None;
builder.MoveTo(run);
builder.InsertNode(watermark);
pageIndex++;
}
}
doc.Save(MyDir + @"output.3.doc");
///////////////////////////////////////
private static Run SplitRun(Run run, int position)
{
Run afterRun = (Run)run.Clone(true);
afterRun.Text = run.Text.Substring(position);
run.Text = run.Text.Substring((0), (0) + (position));
run.ParentNode.InsertAfter(afterRun, run);
return afterRun;
}
希望这对您有所帮助。我在 Aspose 工作,担任开发人员布道师。
我在文档上放置水印,但有时水印会出现在某些图像的后面,而我无法将其置于前面。我尝试将 ZOrderPosition 和 ZOrder 属性 设置为像 99 这样的高值,但它仍然不在其他所有内容之前。
出现此问题是因为水印形状位于 Word 文档的页眉页脚文章内,而主要内容位于正文文章内(请参阅 Story class)。如果您使用 Microsoft Word 2016 插入水印,您将观察到相同的行为。文档的所有内容 header/footer 总是在文档的主要内容之后。
不过,您可以通过在每个页面中手动插入水印来解决这个问题。您可以通过将光标移动到文档每个页面的第一个 运行,然后将这些 运行 作为水印的锚点来实现。例如,请看下面的代码:
Document doc = new Document(MyDir + @"input.doc");
Node[] runs = doc.GetChildNodes(NodeType.Run, true).ToArray();
for (int i = 0; i < runs.Length; i++)
{
Run run = (Run)runs[i];
int length = run.Text.Length;
Run currentNode = run;
for (int x = 1; x < length; x++)
{
currentNode = SplitRun(currentNode, 1);
}
}
DocumentBuilder builder = new DocumentBuilder(doc);
PageSetup ps = builder.PageSetup;
NodeCollection smallRuns = doc.GetChildNodes(NodeType.Run, true);
LayoutCollector collector = new LayoutCollector(doc);
int pageIndex = 1;
foreach (Run run in smallRuns)
{
if (collector.GetStartPageIndex(run) == pageIndex)
{
Shape watermark = new Shape(doc, Aspose.Words.Drawing.ShapeType.TextPlainText);
watermark.RelativeHorizontalPosition = RelativeHorizontalPosition.Page;
watermark.RelativeVerticalPosition = RelativeVerticalPosition.Page;
watermark.Width = 300;
watermark.Height = 70;
watermark.HorizontalAlignment = HorizontalAlignment.Center;
watermark.VerticalAlignment = VerticalAlignment.Center;
watermark.Rotation = -40;
watermark.Fill.Color = Color.Gray;
watermark.StrokeColor = Color.Gray;
watermark.TextPath.Text = "watermarkText";
watermark.TextPath.FontFamily = "Arial";
watermark.Name = string.Format("WaterMark_{0}", Guid.NewGuid());
watermark.WrapType = WrapType.None;
builder.MoveTo(run);
builder.InsertNode(watermark);
pageIndex++;
}
}
doc.Save(MyDir + @"output.3.doc");
///////////////////////////////////////
private static Run SplitRun(Run run, int position)
{
Run afterRun = (Run)run.Clone(true);
afterRun.Text = run.Text.Substring(position);
run.Text = run.Text.Substring((0), (0) + (position));
run.ParentNode.InsertAfter(afterRun, run);
return afterRun;
}
希望这对您有所帮助。我在 Aspose 工作,担任开发人员布道师。