.NET操作Word/WPS打造专业文档 - 页面设置与打印控制完全指南

本文将详细介绍如何使用MudTools.OfficeInterop.Word库来设置页面参数、管理页眉页脚以及控制文档打印。我们将深入探讨从基础的纸张设置到高级的分节页面控制,从简单的页眉页脚到复杂的多区域布局,以及如何精确控制文档的打印输出。最后,我们将通过一个实战示例,创建一个具有专业格式的文档模板,并演示如何进行打印设置,让你真正掌握Word自动化处理的精髓。

页面设置 (PageSetup Object)

页面设置是文档格式化的重要组成部分,它决定了文档在纸张上的布局方式。通过IWordPageSetup接口,我们可以控制页面的各个方面,包括纸张大小、方向、页边距等。

想要创建出专业、美观的文档,第一步就是要掌握页面设置。无论是制作商务报告、学术论文还是其他类型的文档,合适的页面布局都是成功的关键。

设置纸张大小、方向、页边距

在Word文档处理中,最常见的页面设置需求是调整纸张大小、方向和页边距。这些设置直接影响文档的外观和可读性。

csharp 复制代码
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Word;
using System;

// 创建或打开文档
using var wordApp = WordFactory.BlankWorkbook();
var document = wordApp.ActiveDocument;

// 获取页面设置对象
var pageSetup = document.Sections[1].PageSetup;

// 设置纸张大小为A4
pageSetup.PaperSize = WdPaperSize.wdPaperA4;

// 设置页面方向为横向
pageSetup.Orientation = WdOrientation.wdOrientLandscape;

// 设置页边距(单位:磅)
pageSetup.TopMargin = 72;     // 1英寸 = 72磅
pageSetup.BottomMargin = 72;
pageSetup.LeftMargin = 72;
pageSetup.RightMargin = 72;

// 或者使用页面宽度和高度直接设置(单位:磅)
pageSetup.PageWidth = 595;    // A4纸宽度
pageSetup.PageHeight = 842;   // A4纸高度

应用场景:创建标准化报告模板

在企业环境中,通常需要创建符合公司标准的报告模板。这些模板需要遵循特定的页面设置规范。

csharp 复制代码
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Word;
using System;

// 报告模板生成器
public class ReportTemplateGenerator
{
    /// <summary>
    /// 创建标准化报告模板
    /// </summary>
    /// <param name="templateName">模板名称</param>
    /// <param name="paperSize">纸张大小</param>
    /// <param name="isLandscape">是否横向</param>
    public void CreateStandardReportTemplate(string templateName, WdPaperSize paperSize, bool isLandscape = false)
    {
        try
        {
            // 创建新文档
            using var wordApp = WordFactory.BlankWorkbook();
            var document = wordApp.ActiveDocument;
            
            // 隐藏Word应用程序以提高性能
            wordApp.Visibility = WordAppVisibility.Hidden;
            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            
            // 遍历所有节并设置页面格式
            foreach (IWordSection section in document.Sections)
            {
                var pageSetup = section.PageSetup;
                
                // 设置纸张大小
                pageSetup.PaperSize = paperSize;
                
                // 设置页面方向
                pageSetup.Orientation = isLandscape ? 
                    WdOrientation.wdOrientLandscape : 
                    WdOrientation.wdOrientPortrait;
                
                // 设置标准页边距(上下1英寸,左右1.25英寸)
                pageSetup.TopMargin = 72;      // 1英寸
                pageSetup.BottomMargin = 72;
                pageSetup.LeftMargin = 90;     // 1.25英寸
                pageSetup.RightMargin = 90;
                
                // 设置装订线(如果需要)
                pageSetup.Gutter = 36;         // 0.5英寸装订线
                pageSetup.GutterPos = WdGutterStyle.wdGutterPosLeft;
            }
            
            // 保存为模板文件
            string outputPath = $@"C:\Templates\{templateName}.dotx";
            document.SaveAs(outputPath, WdSaveFormat.wdFormatXMLTemplate);
            document.Close();
            
            Console.WriteLine($"标准化报告模板已创建: {outputPath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"创建报告模板时发生错误: {ex.Message}");
        }
    }
    
    /// <summary>
    /// 为现有文档应用标准页面设置
    /// </summary>
    /// <param name="documentPath">文档路径</param>
    public void ApplyStandardPageSetup(string documentPath)
    {
        try
        {
            // 打开现有文档
            using var wordApp = WordFactory.Open(documentPath);
            var document = wordApp.ActiveDocument;
            
            // 隐藏Word应用程序以提高性能
            wordApp.Visibility = WordAppVisibility.Hidden;
            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            
            // 应用标准页面设置
            foreach (IWordSection section in document.Sections)
            {
                var pageSetup = section.PageSetup;
                
                // 设置为A4纸张
                pageSetup.PaperSize = WdPaperSize.wdPaperA4;
                
                // 设置纵向
                pageSetup.Orientation = WdOrientation.wdOrientPortrait;
                
                // 设置标准页边距
                pageSetup.TopMargin = 72;
                pageSetup.BottomMargin = 72;
                pageSetup.LeftMargin = 90;
                pageSetup.RightMargin = 90;
            }
            
            // 保存文档
            document.Save();
            document.Close();
            
            Console.WriteLine($"已为文档应用标准页面设置: {documentPath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"应用页面设置时发生错误: {ex.Message}");
        }
    }
}

高级页面设置选项

除了基本的页面设置外,IWordPageSetup还提供了更多高级选项,如文本列、行号、装订线等。

csharp 复制代码
// 获取页面设置对象
var pageSetup = document.Sections[1].PageSetup;

// 设置文本列
pageSetup.TextColumns.SetCount(2); // 设置为两列
pageSetup.TextColumns.Width = 200; // 设置列宽
pageSetup.TextColumns.Spacing = 30; // 设置列间距

// 设置行号
pageSetup.LineNumbering.Active = true; // 启用行号
pageSetup.LineNumbering.RestartMode = WdNumberingRule.wdRestartContinuous; // 连续编号
pageSetup.LineNumbering.DistanceFromText = 36; // 行号与文本距离

// 设置装订线
pageSetup.Gutter = 36; // 0.5英寸装订线
pageSetup.GutterStyle = WdGutterStyleOld.wdGutterStyleLatin; // 装订线样式
pageSetup.GutterPos = WdGutterStyle.wdGutterPosLeft; // 装订线位置

应用场景:创建学术论文模板

学术论文通常有特定的格式要求,包括多列布局、行号等。

csharp 复制代码
// 学术论文模板生成器
public class AcademicPaperTemplateGenerator
{
    /// <summary>
    /// 创建学术论文模板
    /// </summary>
    /// <param name="templatePath">模板保存路径</param>
    public void CreateAcademicPaperTemplate(string templatePath)
    {
        try
        {
            // 创建新文档
            using var wordApp = WordFactory.BlankWorkbook();
            var document = wordApp.ActiveDocument;
            
            // 隐藏Word应用程序以提高性能
            wordApp.Visibility = WordAppVisibility.Hidden;
            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            
            // 设置整体页面格式
            var pageSetup = document.Sections[1].PageSetup;
            
            // A4纸张,纵向
            pageSetup.PaperSize = WdPaperSize.wdPaperA4;
            pageSetup.Orientation = WdOrientation.wdOrientPortrait;
            
            // 设置页边距
            pageSetup.TopMargin = 72;      // 1英寸
            pageSetup.BottomMargin = 72;
            pageSetup.LeftMargin = 72;
            pageSetup.RightMargin = 72;
            
            // 为正文部分设置两列布局(通常用于摘要后的内容)
            // 这里我们为第二节设置两列(假设第一节是标题和摘要)
            if (document.Sections.Count > 1)
            {
                var bodyPageSetup = document.Sections[2].PageSetup;
                bodyPageSetup.TextColumns.SetCount(2); // 两列
                bodyPageSetup.TextColumns.EvenlySpaced = true;
                bodyPageSetup.TextColumns.LineBetween = true; // 显示分隔线
            }
            
            // 为特定节启用行号(如用于审稿的版本)
            var reviewPageSetup = document.Sections[1].PageSetup;
            reviewPageSetup.LineNumbering.Active = true;
            reviewPageSetup.LineNumbering.RestartMode = WdNumberingRule.wdRestartContinuous;
            reviewPageSetup.LineNumbering.DistanceFromText = 18; // 1/4英寸
            
            // 保存模板
            document.SaveAs(templatePath, WdSaveFormat.wdFormatXMLTemplate);
            document.Close();
            
            Console.WriteLine($"学术论文模板已创建: {templatePath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"创建学术论文模板时发生错误: {ex.Message}");
        }
    }
}

页眉与页脚 (HeadersFooters Collection)

页眉和页脚是文档中重要的组成部分,它们通常包含页码、文档标题、日期等信息。通过IWordHeadersFootersIWordHeaderFooter接口,我们可以灵活地控制每个节的页眉页脚。

专业的文档不仅内容要精彩,外观也要精致。页眉页脚就像文档的"名片",不仅提供导航信息,还能增强文档的专业性和一致性。通过巧妙地设计页眉页脚,你可以让文档在众多普通文档中脱颖而出。

为不同节设置不同的页眉页脚

在复杂文档中,可能需要为不同节设置不同的页眉页脚。这在章节结构复杂的文档中非常有用。

csharp 复制代码
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Word;
using System;

// 打开或创建文档
using var wordApp = WordFactory.BlankWorkbook();
var document = wordApp.ActiveDocument;

// 为第一节设置页眉页脚
var firstSection = document.Sections[1];

// 设置首页不同页眉页脚
firstSection.PageSetup.DifferentFirstPageHeaderFooter = 1; // 1表示启用

// 设置奇偶页不同页眉页脚
firstSection.PageSetup.OddAndEvenPagesHeaderFooter = 1; // 1表示启用

// 设置首页页眉
var firstHeader = firstSection.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage];
firstHeader.Range.Text = "这是首页页眉\n";

// 设置奇数页页眉
var oddHeader = firstSection.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary];
oddHeader.Range.Text = "这是奇数页页眉\n";

// 设置偶数页页眉
var evenHeader = firstSection.Headers[WdHeaderFooterIndex.wdHeaderFooterEvenPages];
evenHeader.Range.Text = "这是偶数页页眉\n";

// 设置页脚(所有页相同)
foreach (IWordSection section in document.Sections)
{
    var footer = section.Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary];
    footer.Range.Text = "这是页脚内容\n";
}

应用场景:创建多章节技术文档

技术文档通常包含多个章节,每个章节可能需要不同的页眉信息。

csharp 复制代码
// 技术文档页眉页脚管理器
public class TechnicalDocumentHeaderFooterManager
{
    /// <summary>
    /// 为技术文档设置页眉页脚
    /// </summary>
    /// <param name="document">Word文档</param>
    /// <param name="documentTitle">文档标题</param>
    public void SetupTechnicalDocumentHeadersFooters(IWordDocument document, string documentTitle)
    {
        try
        {
            // 为所有节设置首页不同
            foreach (IWordSection section in document.Sections)
            {
                section.PageSetup.DifferentFirstPageHeaderFooter = 1;
            }
            
            // 设置首页页眉(通常是文档标题)
            var firstSection = document.Sections[1];
            var firstHeader = firstSection.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage];
            firstHeader.Range.Text = documentTitle;
            firstHeader.Range.Font.Name = "微软雅黑";
            firstHeader.Range.Font.Size = 16;
            firstHeader.Range.Font.Bold = true;
            firstHeader.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
            
            // 为各节设置页眉(显示章节标题)
            for (int i = 1; i <= document.Sections.Count; i++)
            {
                var section = document.Sections[i];
                var header = section.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary];
                
                // 根据节号设置不同的页眉内容
                switch (i)
                {
                    case 1:
                        header.Range.Text = "引言";
                        break;
                    case 2:
                        header.Range.Text = "系统架构";
                        break;
                    case 3:
                        header.Range.Text = "详细设计";
                        break;
                    case 4:
                        header.Range.Text = "实施指南";
                        break;
                    default:
                        header.Range.Text = $"第{i}章";
                        break;
                }
                
                // 格式化页眉
                header.Range.Font.Name = "微软雅黑";
                header.Range.Font.Size = 10;
                header.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
            }
            
            // 设置页脚(显示页码)
            foreach (IWordSection section in document.Sections)
            {
                var footer = section.Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary];
                
                // 插入页码
                footer.Range.Text = "第 ";
                footer.Range.Font.Name = "微软雅黑";
                footer.Range.Font.Size = 9;
                
                // 添加页码域
                var pageNumRange = footer.Range.Duplicate;
                pageNumRange.Collapse(WdCollapseDirection.wdCollapseEnd);
                pageNumRange.Fields.Add(pageNumRange, WdFieldType.wdFieldPage);
                
                var totalPagesRange = footer.Range.Duplicate;
                totalPagesRange.Collapse(WdCollapseDirection.wdCollapseEnd);
                totalPagesRange.Text = " 页,共 ";
                totalPagesRange.Fields.Add(totalPagesRange, WdFieldType.wdFieldNumPages);
                totalPagesRange.Text += " 页";
                
                // 设置页脚居中对齐
                footer.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"设置页眉页脚时发生错误: {ex.Message}");
        }
    }
}

在页眉页脚中插入页码、日期、公司Logo等信息

页眉页脚中经常需要包含页码、日期、图片等元素。MudTools.OfficeInterop.Word提供了相应的方法来处理这些内容。

csharp 复制代码
// 为文档添加带有页码和日期的页脚
var footer = document.Sections[1].Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary];

// 插入日期
footer.Range.Text = "创建日期: ";
footer.Range.Fields.Add(footer.Range, WdFieldType.wdFieldDate);
footer.Range.Text += "     页面: ";

// 插入当前页码
var pageRange = footer.Range.Duplicate;
pageRange.Collapse(WdCollapseDirection.wdCollapseEnd);
pageRange.Fields.Add(pageRange, WdFieldType.wdFieldPage);

// 插入总页数
pageRange.Text += " / ";
pageRange.Fields.Add(pageRange, WdFieldType.wdFieldNumPages);

// 插入公司Logo
var logoRange = footer.Range.Duplicate;
logoRange.Collapse(WdCollapseDirection.wdCollapseEnd);
var logoShape = logoRange.InlineShapes.AddPicture(@"C:\Images\CompanyLogo.png");
logoShape.Width = 100;
logoShape.Height = 30;

应用场景:创建企业文档模板

企业文档通常需要包含公司标识、页码等信息。

csharp 复制代码
// 企业文档模板生成器
public class CorporateDocumentTemplateGenerator
{
    /// <summary>
    /// 创建企业文档模板
    /// </summary>
    /// <param name="templatePath">模板路径</param>
    /// <param name="companyLogoPath">公司Logo路径</param>
    public void CreateCorporateDocumentTemplate(string templatePath, string companyLogoPath)
    {
        try
        {
            // 创建新文档
            using var wordApp = WordFactory.BlankWorkbook();
            var document = wordApp.ActiveDocument;
            
            // 隐藏Word应用程序以提高性能
            wordApp.Visibility = WordAppVisibility.Hidden;
            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            
            // 为所有节设置首页不同页眉页脚
            foreach (IWordSection section in document.Sections)
            {
                section.PageSetup.DifferentFirstPageHeaderFooter = 1;
            }
            
            // 设置首页页眉(包含公司Logo和文档标题)
            var firstSection = document.Sections[1];
            var firstHeader = firstSection.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage];
            
            // 插入公司Logo
            if (System.IO.File.Exists(companyLogoPath))
            {
                var logoShape = firstHeader.Range.InlineShapes.AddPicture(companyLogoPath);
                logoShape.Width = 120;
                logoShape.Height = 40;
            }
            
            // 添加文档标题占位符
            var titleRange = firstHeader.Range.Duplicate;
            titleRange.Collapse(WdCollapseDirection.wdCollapseEnd);
            titleRange.Text = "\n[文档标题]\n";
            titleRange.Font.Name = "微软雅黑";
            titleRange.Font.Size = 18;
            titleRange.Font.Bold = true;
            titleRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
            
            // 设置普通页页眉(仅包含公司名称)
            foreach (IWordSection section in document.Sections)
            {
                var header = section.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary];
                header.Range.Text = "公司名称\n";
                header.Range.Font.Name = "微软雅黑";
                header.Range.Font.Size = 9;
                header.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight;
            }
            
            // 设置页脚(包含日期和页码)
            foreach (IWordSection section in document.Sections)
            {
                var footer = section.Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary];
                
                // 左侧显示公司信息
                footer.Range.Text = "公司名称 | 地址 | 电话\n";
                footer.Range.Font.Name = "微软雅黑";
                footer.Range.Font.Size = 8;
                
                // 右侧显示日期和页码
                var rightFooterRange = footer.Range.Duplicate;
                rightFooterRange.Collapse(WdCollapseDirection.wdCollapseEnd);
                rightFooterRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight;
                
                // 插入日期
                rightFooterRange.Text = "打印日期: ";
                rightFooterRange.Fields.Add(rightFooterRange, WdFieldType.wdFieldDate);
                rightFooterRange.Text += "     第 ";
                
                // 插入页码
                rightFooterRange.Fields.Add(rightFooterRange, WdFieldType.wdFieldPage);
                rightFooterRange.Text += " 页";
                
                // 设置边框
                footer.Range.Borders[WdBorderType.wdBorderTop].LineStyle = WdLineStyle.wdLineStyleSingle;
                footer.Range.Borders[WdBorderType.wdBorderTop].LineWidth = WdLineWidth.wdLineWidth050pt;
            }
            
            // 保存模板
            document.SaveAs(templatePath, WdSaveFormat.wdFormatXMLTemplate);
            document.Close();
            
            Console.WriteLine($"企业文档模板已创建: {templatePath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"创建企业文档模板时发生错误: {ex.Message}");
        }
    }
}

打印文档

文档打印是Word自动化处理的最后一步。通过PrintOut方法,我们可以控制文档的打印行为,包括打印份数、范围等。

当你花费大量时间精心制作了一份文档,最终的打印输出却出现问题,是不是很让人沮丧?通过掌握精确的打印控制技巧,你可以确保文档以最佳状态呈现给读者,避免因打印设置不当而导致的尴尬。

使用 Document.PrintOut 方法及其参数控制打印份数、范围等

MudTools.OfficeInterop.Word提供了简洁的PrintOut方法来控制文档打印。

csharp 复制代码
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Word;
using System;

// 打开文档
using var wordApp = WordFactory.Open(@"C:\Documents\MyDocument.docx");
var document = wordApp.ActiveDocument;

// 基本打印:打印一份完整文档
document.PrintOut();

// 打印两份完整文档
document.PrintOut(copies: 2);

// 打印指定页面(例如第3到第5页)
document.PrintOut(pages: "3-5");

// 打印多个不连续页面
document.PrintOut(pages: "1,3,5-7");

// 打印多份指定页面
document.PrintOut(copies: 3, pages: "1-2");

应用场景:批量打印文档

在企业环境中,经常需要批量打印文档,并可能需要不同的打印设置。

csharp 复制代码
// 批量文档打印管理器
public class BatchDocumentPrintManager
{
    /// <summary>
    /// 批量打印文档
    /// </summary>
    /// <param name="documentPaths">文档路径列表</param>
    /// <param name="copies">打印份数</param>
    /// <param name="pageRange">页码范围</param>
    public void BatchPrintDocuments(List<string> documentPaths, int copies = 1, string pageRange = "")
    {
        foreach (var documentPath in documentPaths)
        {
            try
            {
                // 打开文档
                using var wordApp = WordFactory.Open(documentPath);
                var document = wordApp.ActiveDocument;
                
                // 隐藏Word应用程序以提高性能
                wordApp.Visibility = WordAppVisibility.Hidden;
                wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
                
                // 打印文档
                document.PrintOut(copies: copies, pages: pageRange);
                
                // 关闭文档
                document.Close(false); // 不保存更改
                
                Console.WriteLine($"文档已打印: {documentPath}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"打印文档 {documentPath} 时发生错误: {ex.Message}");
            }
        }
    }
    
    /// <summary>
    /// 根据文档类型应用不同的打印设置
    /// </summary>
    /// <param name="documentPath">文档路径</param>
    /// <param name="documentType">文档类型</param>
    public void PrintDocumentByType(string documentPath, string documentType)
    {
        try
        {
            // 打开文档
            using var wordApp = WordFactory.Open(documentPath);
            var document = wordApp.ActiveDocument;
            
            // 隐藏Word应用程序以提高性能
            wordApp.Visibility = WordAppVisibility.Hidden;
            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            
            // 根据文档类型应用不同的打印设置
            switch (documentType.ToLower())
            {
                case "report":
                    // 报告类文档:打印所有页面,2份
                    document.PrintOut(copies: 2);
                    break;
                    
                case "contract":
                    // 合同类文档:打印所有页面,1份
                    document.PrintOut(copies: 1);
                    break;
                    
                case "invoice":
                    // 发票类文档:只打印第一页,2份
                    document.PrintOut(copies: 2, pages: "1");
                    break;
                    
                case "manual":
                    // 手册类文档:打印指定页面,1份
                    document.PrintOut(pages: "1-10");
                    break;
                    
                default:
                    // 默认打印所有页面,1份
                    document.PrintOut();
                    break;
            }
            
            // 关闭文档
            document.Close(false);
            
            Console.WriteLine($"文档已按{documentType}类型打印: {documentPath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"打印文档时发生错误: {ex.Message}");
        }
    }
}

高级打印控制

虽然MudTools.OfficeInterop.Word目前只提供了基本的打印参数,但在实际应用中,我们可以通过其他方式实现更精细的打印控制。

csharp 复制代码
// 文档打印配置器
public class DocumentPrintConfigurer
{
    /// <summary>
    /// 配置并打印文档
    /// </summary>
    /// <param name="documentPath">文档路径</param>
    /// <param name="printerName">打印机名称</param>
    /// <param name="copies">打印份数</param>
    /// <param name="isCollated">是否逐份打印</param>
    public void ConfigureAndPrintDocument(string documentPath, string printerName, int copies, bool isCollated)
    {
        try
        {
            // 打开文档
            using var wordApp = WordFactory.Open(documentPath);
            var document = wordApp.ActiveDocument;
            
            // 设置打印机(如果指定)
            if (!string.IsNullOrEmpty(printerName))
            {
                wordApp.ActivePrinter = printerName;
            }
            
            // 隐藏Word应用程序以提高性能
            wordApp.Visibility = WordAppVisibility.Hidden;
            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            
            // 注意:当前版本的MudTools.OfficeInterop.Word只支持基本的打印参数
            // 更高级的打印控制需要通过其他方式实现
            
            // 打印文档
            document.PrintOut(copies: copies);
            
            // 关闭文档
            document.Close(false);
            
            Console.WriteLine($"文档已打印: {documentPath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"打印文档时发生错误: {ex.Message}");
        }
    }
}

实战:创建一个具有专业格式的文档模板并演示打印设置

现在,让我们综合运用前面学到的知识,创建一个具有专业格式的文档模板,并演示如何进行页面设置和打印控制。

在实际工作中,我们经常需要创建符合公司标准的文档模板,并能够快速生成和打印文档。通过下面的完整示例,你将学会如何创建一个真正实用的专业文档模板,以及如何自动化整个文档生成和打印流程。

csharp 复制代码
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Word;
using System;
using System.Collections.Generic;

// 专业文档模板创建器
public class ProfessionalDocumentTemplateCreator
{
    /// <summary>
    /// 创建专业文档模板
    /// </summary>
    /// <param name="templatePath">模板保存路径</param>
    public void CreateProfessionalDocumentTemplate(string templatePath)
    {
        try
        {
            // 创建新文档
            using var wordApp = WordFactory.BlankWorkbook();
            var document = wordApp.ActiveDocument;
            
            // 隐藏Word应用程序以提高性能
            wordApp.Visibility = WordAppVisibility.Hidden;
            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            
            // 设置页面格式
            SetupPageFormat(document);
            
            // 设置页眉页脚
            SetupHeadersAndFooters(document);
            
            // 添加模板内容示例
            AddTemplateContent(document);
            
            // 保存为模板
            document.SaveAs(templatePath, WdSaveFormat.wdFormatXMLTemplate);
            document.Close();
            
            Console.WriteLine($"专业文档模板已创建: {templatePath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"创建专业文档模板时发生错误: {ex.Message}");
        }
    }
    
    /// <summary>
    /// 设置页面格式
    /// </summary>
    /// <param name="document">Word文档</param>
    private void SetupPageFormat(IWordDocument document)
    {
        // 为所有节设置页面格式
        foreach (IWordSection section in document.Sections)
        {
            var pageSetup = section.PageSetup;
            
            // 设置A4纸张,纵向
            pageSetup.PaperSize = WdPaperSize.wdPaperA4;
            pageSetup.Orientation = WdOrientation.wdOrientPortrait;
            
            // 设置页边距(标准商业文档)
            pageSetup.TopMargin = 72;      // 1英寸
            pageSetup.BottomMargin = 72;   // 1英寸
            pageSetup.LeftMargin = 90;     // 1.25英寸
            pageSetup.RightMargin = 90;    // 1.25英寸
            
            // 启用首页不同页眉页脚
            section.PageSetup.DifferentFirstPageHeaderFooter = 1;
        }
    }
    
    /// <summary>
    /// 设置页眉页脚
    /// </summary>
    /// <param name="document">Word文档</param>
    private void SetupHeadersAndFooters(IWordDocument document)
    {
        // 设置首页页眉
        var firstSection = document.Sections[1];
        var firstHeader = firstSection.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage];
        firstHeader.Range.Text = "专业文档模板\n";
        firstHeader.Range.Font.Name = "微软雅黑";
        firstHeader.Range.Font.Size = 20;
        firstHeader.Range.Font.Bold = true;
        firstHeader.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        
        // 设置普通页页眉
        foreach (IWordSection section in document.Sections)
        {
            var header = section.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary];
            header.Range.Text = "文档标题\n";
            header.Range.Font.Name = "微软雅黑";
            header.Range.Font.Size = 12;
            header.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        }
        
        // 设置页脚
        foreach (IWordSection section in document.Sections)
        {
            var footer = section.Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary];
            
            // 左侧显示文档信息
            footer.Range.Text = "保密等级: 内部使用\n";
            footer.Range.Font.Name = "微软雅黑";
            footer.Range.Font.Size = 8;
            
            // 右侧显示页码
            var pageNumRange = footer.Range.Duplicate;
            pageNumRange.Collapse(WdCollapseDirection.wdCollapseEnd);
            pageNumRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight;
            pageNumRange.Text = "第 ";
            pageNumRange.Fields.Add(pageNumRange, WdFieldType.wdFieldPage);
            pageNumRange.Text += " 页";
        }
    }
    
    /// <summary>
    /// 添加模板内容示例
    /// </summary>
    /// <param name="document">Word文档</param>
    private void AddTemplateContent(IWordDocument document)
    {
        // 获取文档内容范围
        var contentRange = document.Content;
        
        // 添加文档标题
        contentRange.Text = "文档标题\n";
        contentRange.Font.Name = "微软雅黑";
        contentRange.Font.Size = 16;
        contentRange.Font.Bold = true;
        contentRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        contentRange.ParagraphFormat.SpaceAfter = 12;
        
        // 添加文档信息
        var infoRange = contentRange.Duplicate;
        infoRange.Collapse(WdCollapseDirection.wdCollapseEnd);
        infoRange.Text = "文档编号: [编号]\n创建日期: [日期]\n版本: [版本号]\n\n";
        infoRange.Font.Name = "微软雅黑";
        infoRange.Font.Size = 10;
        infoRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;
        infoRange.ParagraphFormat.SpaceAfter = 6;
        
        // 添加目录占位符
        var tocRange = infoRange.Duplicate;
        tocRange.Collapse(WdCollapseDirection.wdCollapseEnd);
        tocRange.Text = "目录\n";
        tocRange.Font.Name = "微软雅黑";
        tocRange.Font.Size = 14;
        tocRange.Font.Bold = true;
        tocRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter;
        tocRange.ParagraphFormat.SpaceAfter = 12;
        
        tocRange.Text += "[目录内容]\n\n";
        tocRange.Font.Bold = false;
        tocRange.Font.Size = 12;
        tocRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;
        
        // 添加正文内容示例
        var bodyRange = tocRange.Duplicate;
        bodyRange.Collapse(WdCollapseDirection.wdCollapseEnd);
        bodyRange.Text = "1. 引言\n\n";
        bodyRange.Font.Name = "微软雅黑";
        bodyRange.Font.Size = 14;
        bodyRange.Font.Bold = true;
        bodyRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;
        bodyRange.ParagraphFormat.SpaceAfter = 12;
        
        bodyRange.Text += "这是文档正文内容的示例。在这里可以添加文档的主要内容。\n\n";
        bodyRange.Font.Bold = false;
        bodyRange.Font.Size = 12;
        bodyRange.ParagraphFormat.FirstLineIndent = 28; // 首行缩进2字符
        bodyRange.ParagraphFormat.LineSpacingRule = WdLineSpacing.wdLineSpace1pt5; // 1.5倍行距
    }
    
    /// <summary>
    /// 使用模板创建并打印文档
    /// </summary>
    /// <param name="templatePath">模板路径</param>
    /// <param name="outputPath">输出文档路径</param>
    /// <param name="printCopies">打印份数</param>
    public void CreateAndPrintDocument(string templatePath, string outputPath, int printCopies = 1)
    {
        try
        {
            // 基于模板创建新文档
            using var wordApp = WordFactory.CreateFrom(templatePath);
            var document = wordApp.ActiveDocument;
            
            // 隐藏Word应用程序以提高性能
            wordApp.Visibility = WordAppVisibility.Hidden;
            wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;
            
            // 替换模板中的占位符
            document.FindAndReplace("[编号]", "DOC-2023-001");
            document.FindAndReplace("[日期]", DateTime.Now.ToString("yyyy-MM-dd"));
            document.FindAndReplace("[版本号]", "1.0");
            document.FindAndReplace("[目录内容]", "1. 引言 .................... 1\n2. 主要内容 ................ 2\n3. 结论 .................... 3");
            document.FindAndReplace("文档标题", "2023年度技术报告");
            
            // 保存文档
            document.SaveAs(outputPath, WdSaveFormat.wdFormatXMLDocument);
            
            // 打印文档
            if (printCopies > 0)
            {
                document.PrintOut(copies: printCopies);
                Console.WriteLine($"文档已打印 {printCopies} 份");
            }
            
            // 关闭文档
            document.Close();
            
            Console.WriteLine($"文档已创建: {outputPath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"创建和打印文档时发生错误: {ex.Message}");
        }
    }
}

// 使用示例
class Program
{
    static void Main(string[] args)
    {
        var creator = new ProfessionalDocumentTemplateCreator();
        
        // 创建专业文档模板
        string templatePath = @"C:\Templates\ProfessionalDocumentTemplate.dotx";
        creator.CreateProfessionalDocumentTemplate(templatePath);
        
        // 使用模板创建并打印文档
        string documentPath = @"C:\Documents\TechnicalReport.docx";
        creator.CreateAndPrintDocument(templatePath, documentPath, printCopies: 2);
        
        Console.WriteLine("操作完成!");
    }
}
相关推荐
mr_LuoWei20097 小时前
用批处理文件实现Excel和word文件的重造
经验分享·word·excel
(❁´◡`❁)Jimmy(❁´◡`❁)11 小时前
【Trie】 UVA1401 Remember the Word
算法·word·图论
acaad14 小时前
采用libreoffice将word、excel等文件转换为pdf格式
pdf·word·libreoffice
热爱生活的五柒1 天前
插入mathtype/latex公式在word中行间距变高了
word
热爱生活的五柒1 天前
排版使用latex排版还是word排版更容易通过mdpi remote sensing的审稿?
word·latex
阿幸软件杂货间1 天前
使用Python一站式提取Word、Excel、PDF 和PPT文档内容v1.0
python·word·excel
2501_930707782 天前
使用C#代码自定义密码加密Word
开发语言·c#·word
念你那丝微笑2 天前
vue使用html-docx基于TinyMCE 导出Word 文档
vue.js·html·word
玩泥巴的10 天前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
word·二次开发·office·com互操作