首页 > 解决方案 > 使用 Aspose 在文档中设置不同的背景

问题描述

我想用以下条件在我的文档中设置不同的背景

  1. 文档的第一页应包含 first.png 作为背景。
  2. 文档的其余页面应包含 second.png 作为背景。

如果输入文档的第一页在标题中不包含图像,我可以按照我的期望设置背景。如果文档的第一页在页眉中包含图像,则仅在第一页上删除该页眉。

我正在使用以下代码片段来实现我的功能。

val headerPrimary = document.firstSection.headersFooters[HEADER_PRIMARY]
if (!document.firstSection.pageSetup.differentFirstPageHeaderFooter && headerPrimary != null) {
    // If so create first page header and copy content of the primary header into it.
    val headerFirst = HeaderFooter(document, HEADER_FIRST);
    headerPrimary.childNodes.forEach {
        headerFirst.appendChild(it.deepClone(true));
    }
    // Put the first page header into the document.
    document.firstSection.headersFooters.add(headerFirst);
}

val builder = DocumentBuilder(document)
document.firstSection.pageSetup.differentFirstPageHeaderFooter = true

builder.moveToHeaderFooter(HEADER_FIRST)
setImageInBackground(builder, firstImageDataString)

builder.moveToHeaderFooter(HEADER_PRIMARY)
setImageInBackground(builder, SecondImageDataString)

private fun setImageInBackground(builder: DocumentBuilder, imageString: String) {
    val background = builder.insertImage(imageString)
    background.wrapType = NONE
    background.behindText = true
    background.relativeHorizontalPosition = RelativeHorizontalPosition.PAGE
    background.relativeVerticalPosition = RelativeVerticalPosition.PAGE
    background.left = (builder.pageSetup.pageWidth - background.width) / 2
    background.top = (builder.pageSetup.pageHeight - background.height) / 2
}

对于输入文档/预期结果和图像,我在响应论坛Aspose 论坛链接中上传了附件

对于代码的输入输出:Files.zip

标签: javakotlinasposeaspose.words

解决方案


出现此问题是因为您的输入文档仅包含主标题。当您将 DocumentBuilder 的光标移动到首页页眉时,Aspose.Words 会创建新的空首页页眉。要将主标题的内容保留在首页上,您只需将主标题的内容复制到新创建的首页标题中即可。这是一个执行此操作的简单代码。

// Check whether there is only primary header.
HeaderFooter headerPrimary = (HeaderFooter)document.FirstSection.HeadersFooters[HeaderFooterType.HeaderPrimary];
if (!document.FirstSection.PageSetup.DifferentFirstPageHeaderFooter
    && headerPrimary != null)
{
    // If so create first page header and copy content of the primary header into it.
    HeaderFooter headerFirst = new HeaderFooter(document, HeaderFooterType.HeaderFirst);
    foreach (Node primaryHeaderChild in headerPrimary.ChildNodes)
        headerFirst.AppendChild(primaryHeaderChild.Clone(true));

    // Put the first page header into the document.
    document.FirstSection.HeadersFooters.Add(headerFirst);
}

// Your original code goes after.
DocumentBuilder builder = new DocumentBuilder(document);
document.FirstSection.PageSetup.DifferentFirstPageHeaderFooter = true;

builder.MoveToHeaderFooter(HeaderFooterType.HeaderFirst);
SetImageInBackground(builder, firstImageDataString);

builder.MoveToHeaderFooter(HeaderFooterType.HeaderPrimary);
SetImageInBackground(builder, secondImageDataString);

推荐阅读