使用 C# Microsoft.Word.Interop 添加水印过程太慢了。我可以让它更快吗?

问题描述 投票:0回答:1

我的app首先打开word文档如下:

Application wordApp = new Application();
                wordApp.Visible = false;
                wordApp.ScreenUpdating = false;
                Microsoft.Office.Interop.Word.Document wordDoc = null;
                wordDoc = wordApp.Documents.Open(datei.pfad, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o);
                wordDoc.Activate();

然后它为所有选定的文档添加水印:

                foreach (Microsoft.Office.Interop.Word.Section section in wordDoc.Sections)
                {

                    Microsoft.Office.Interop.Word.Shape wordShapeFirstPage = section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage].Shapes.AddTextEffect
                     (Microsoft.Office.Core.MsoPresetTextEffect.msoTextEffect1, "© aQua-Institut GmbH", "Calibri", (float)30, Microsoft.Office.Core.MsoTriState.msoTrue,
                     Microsoft.Office.Core.MsoTriState.msoFalse, 150, 350, o);

                    Microsoft.Office.Interop.Word.Shape wordShapePrimary = section.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Shapes.AddTextEffect
                    (Microsoft.Office.Core.MsoPresetTextEffect.msoTextEffect1, "© aQua-Institut GmbH", "Calibri", (float)30, Microsoft.Office.Core.MsoTriState.msoTrue,
                    Microsoft.Office.Core.MsoTriState.msoFalse, 150, 350, o);

                    Microsoft.Office.Interop.Word.Shape wordShapeEvenPages = section.Headers[WdHeaderFooterIndex.wdHeaderFooterEvenPages].Shapes.AddTextEffect
                   (Microsoft.Office.Core.MsoPresetTextEffect.msoTextEffect1, "© aQua-Institut GmbH", "Calibri", (float)30, Microsoft.Office.Core.MsoTriState.msoTrue,
                   Microsoft.Office.Core.MsoTriState.msoFalse, 150, 350, o);

                    List<Microsoft.Office.Interop.Word.Shape> wordShapeList = new List<Microsoft.Office.Interop.Word.Shape>();

                    wordShapeList.Add(wordShapePrimary);
                    wordShapeList.Add(wordShapeFirstPage);
                    wordShapeList.Add(wordShapeEvenPages);

                    foreach (Shape wordShape in wordShapeList)
                    {
                        wordShape.Fill.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
                        wordShape.Fill.Solid();
                        wordShape.Fill.ForeColor.RGB = (Int32)Microsoft.Office.Interop.Word.WdColor.wdColorGray15;
                        wordShape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoFalse;
                        wordShape.WrapFormat.AllowOverlap = -1;
                        wordShape.WrapFormat.Type = Microsoft.Office.Interop.Word.WdWrapType.wdWrapBehind;
                        wordShape.Rotation = -45;
                        wordShape.RelativeHorizontalPosition = Microsoft.Office.Interop.Word.WdRelativeHorizontalPosition.wdRelativeHorizontalPositionMargin;
                        wordShape.RelativeVerticalPosition = Microsoft.Office.Interop.Word.WdRelativeVerticalPosition.wdRelativeVerticalPositionMargin;
                       
                    }
                }        

最后,所有文档都保存好了:

wordDoc.SaveAs2(datei.neuesDateiverzeichnis + "\\" + datei.neuerDateiname + ".docx", ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o, ref o);
            wordDoc.Close();
            wordApp.Quit(); 

它确实有效,但是如果文档的大小很大或者文档的格式很复杂,比如标题部分的图像,它会花费太多时间。我想让它更快。有谁能够帮助我?提前致谢。

c# ms-word interop
1个回答
0
投票

原来我的应用程序在所有部分都添加了水印,而不是页面是问题,因为有些文档在一页上有两个以上的部分,所以它循环了所有部分的代码。这是新代码:

foreach (Microsoft.Office.Interop.Word.Section section in wordDoc.Sections)
        {
            Microsoft.Office.Interop.Word.HeaderFooter firstPageHeader = section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage];

            List<Microsoft.Office.Interop.Word.Shape> wordShapeList = new List<Microsoft.Office.Interop.Word.Shape>();

            if (firstPageHeader.LinkToPrevious == false)
            {
                Microsoft.Office.Interop.Word.Shape wordShapeFirstPage = firstPageHeader.Shapes.AddTextEffect
             (Microsoft.Office.Core.MsoPresetTextEffect.msoTextEffect1, "WATERMARK", "Calibri", (float)30, Microsoft.Office.Core.MsoTriState.msoTrue,
             Microsoft.Office.Core.MsoTriState.msoFalse, 0, 0, o);
                wordShapeList.Add(wordShapeFirstPage); 

            }

            Microsoft.Office.Interop.Word.HeaderFooter primaryHeader = section.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary];

            if (primaryHeader.LinkToPrevious == false)
            {
                Microsoft.Office.Interop.Word.Shape wordShapePrimary = primaryHeader.Shapes.AddTextEffect
          (Microsoft.Office.Core.MsoPresetTextEffect.msoTextEffect1, "WATERMARK", "Calibri", (float)30, Microsoft.Office.Core.MsoTriState.msoTrue,
          Microsoft.Office.Core.MsoTriState.msoFalse, 0, 0, o);
                wordShapeList.Add(wordShapePrimary); 
            }

            Microsoft.Office.Interop.Word.HeaderFooter evenHeader = section.Headers[WdHeaderFooterIndex.wdHeaderFooterEvenPages];

            if (evenHeader.LinkToPrevious == false)
            {
                Microsoft.Office.Interop.Word.Shape wordShapeEvenPages = evenHeader.Shapes.AddTextEffect
           (Microsoft.Office.Core.MsoPresetTextEffect.msoTextEffect1, "WATERMARK", "Calibri", (float)30, Microsoft.Office.Core.MsoTriState.msoTrue,
           Microsoft.Office.Core.MsoTriState.msoFalse, 0, 0, o);
                wordShapeList.Add(wordShapeEvenPages);
            }

            foreach (Shape wordShape in wordShapeList)

            {
                wordShape.Fill.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
                wordShape.Fill.Solid();
                wordShape.Fill.ForeColor.RGB = (Int32)Microsoft.Office.Interop.Word.WdColor.wdColorGray15;
                wordShape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoFalse;
                wordShape.WrapFormat.AllowOverlap = -1;
                wordShape.WrapFormat.Type = Microsoft.Office.Interop.Word.WdWrapType.wdWrapBehind;
                wordShape.Rotation = -45;
                wordShape.RelativeHorizontalPosition = Microsoft.Office.Interop.Word.WdRelativeHorizontalPosition.wdRelativeHorizontalPositionMargin;
                wordShape.RelativeVerticalPosition = Microsoft.Office.Interop.Word.WdRelativeVerticalPosition.wdRelativeVerticalPositionMargin;
                wordShape.Left = (float)Microsoft.Office.Interop.Word.WdShapePosition.wdShapeCenter;
                wordShape.Top = (float)Microsoft.Office.Interop.Word.WdShapePosition.wdShapeCenter;
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.