2011-08-09 3 views
11

기존 문서를 가져 가고 헤더가 존재하지 않는 경우 헤더를 만들고 "DRAFT"라고 표시된 헤더에 대각선으로 워터 마크를 추가하십시오. . 나는 here 게시 된 예제를 따라했습니다 및 헤더가 이미 존재하는 경우 워터 마크를 추가 할 지점 코드를 얻었습니다.Open XML - docx 문서에 워터 마크를 추가하는 방법

는 현재의 문제는 내가 새로운 헤더를 추가 할 때, 문서에 대한 참조를 추가 한 다음 헤더에 워터 마크를 추가입니다

문서가 손상된 더 이상 개방 Word에서 2010

것은 테스트하기 위해 수 나는 다음과 같은 일을 해왔다. 페이지의 주요 부분에 "TestDoc"텍스트가있는 단어 자체에서 새 단어 문서를 작성한다. "TestDoc.docx"로 내 바탕 화면에 저장하고 파일을 닫습니다. 그런 다음 Visual Studio에서 앱을 실행합니다. 아래 코드는 항상 손상시킬 것입니다. 파일에 텍스트가없는 헤더를 추가 한 다음 저장을 누르면 워터 마크가 올바르게 표시됩니다. 여기

는 내가 지금까지 무엇을 가지고 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using DocumentFormat.OpenXml; 
using DocumentFormat.OpenXml.Packaging; 
using DocumentFormat.OpenXml.Vml; 
using DocumentFormat.OpenXml.Vml.Office; 
using DocumentFormat.OpenXml.Vml.Wordprocessing; 
using DocumentFormat.OpenXml.Wordprocessing; 
using HorizontalAnchorValues = DocumentFormat.OpenXml.Vml.Wordprocessing.HorizontalAnchorValues; 
using Lock = DocumentFormat.OpenXml.Vml.Office.Lock; 
using VerticalAnchorValues = DocumentFormat.OpenXml.Vml.Wordprocessing.VerticalAnchorValues; 

namespace DocumentWatermarkTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var doc = WordprocessingDocument.Open(@"C:\Users\loggedinuser\Desktop\TestDoc.docx", true); 
      AddWatermark(doc); 
      doc.MainDocumentPart.Document.Save(); 
     } 

     static Header MakeHeader() 
     { 
      var header = new Header(); 
      var paragraph = new Paragraph(); 
      var run = new Run(); 
      var text = new Text(); 
      text.Text = ""; 
      run.Append(text); 
      paragraph.Append(run); 
      header.Append(paragraph); 
      return header; 
     } 

     static void AddWatermark(WordprocessingDocument doc) 
     { 
      if (doc.MainDocumentPart.HeaderParts.Count() == 0) 
      { 
       doc.MainDocumentPart.DeleteParts(doc.MainDocumentPart.HeaderParts); 
       var newHeaderPart = doc.MainDocumentPart.AddNewPart<HeaderPart>(); 
       var rId = doc.MainDocumentPart.GetIdOfPart(newHeaderPart); 
       var headerRef = new HeaderReference(); 
       headerRef.Id = rId; 
       var sectionProps = doc.MainDocumentPart.Document.Body.Elements<SectionProperties>().LastOrDefault(); 
       if (sectionProps == null) 
       { 
        sectionProps = new SectionProperties(); 
        doc.MainDocumentPart.Document.Body.Append(sectionProps); 
       } 
       sectionProps.RemoveAllChildren<HeaderReference>(); 
       sectionProps.Append(headerRef); 

       newHeaderPart.Header = MakeHeader(); 
       newHeaderPart.Header.Save(); 
      } 

      foreach (HeaderPart headerPart in doc.MainDocumentPart.HeaderParts) 
      { 
       var sdtBlock1 = new SdtBlock(); 
       var sdtProperties1 = new SdtProperties(); 
       var sdtId1 = new SdtId() { Val = 87908844 }; 
       var sdtContentDocPartObject1 = new DocPartObjectSdt(); 
       var docPartGallery1 = new DocPartGallery() { Val = "Watermarks" }; 
       var docPartUnique1 = new DocPartUnique(); 
       sdtContentDocPartObject1.Append(docPartGallery1); 
       sdtContentDocPartObject1.Append(docPartUnique1); 
       sdtProperties1.Append(sdtId1); 
       sdtProperties1.Append(sdtContentDocPartObject1); 

       var sdtContentBlock1 = new SdtContentBlock(); 
       var paragraph2 = new Paragraph() 
            { 
             RsidParagraphAddition = "00656E18", 
             RsidRunAdditionDefault = "00656E18" 
            }; 
       var paragraphProperties2 = new ParagraphProperties(); 
       var paragraphStyleId2 = new ParagraphStyleId() { Val = "Header" }; 
       paragraphProperties2.Append(paragraphStyleId2); 
       var run1 = new Run(); 
       var runProperties1 = new RunProperties(); 
       var noProof1 = new NoProof(); 
       var languages1 = new Languages() { EastAsia = "zh-TW" }; 
       runProperties1.Append(noProof1); 
       runProperties1.Append(languages1); 
       var picture1 = new Picture(); 
       var shapetype1 = new Shapetype() 
            { 
             Id = "_x0000_t136", 
             CoordinateSize = "21600,21600", 
             OptionalNumber = 136, 
             Adjustment = "10800", 
             EdgePath = "[email protected],[email protected],[email protected],[email protected],21600e" 
            }; 
       var formulas1 = new Formulas(); 
       var formula1 = new Formula() { Equation = "sum #0 0 10800" }; 
       var formula2 = new Formula() { Equation = "prod #0 2 1" }; 
       var formula3 = new Formula() { Equation = "sum 21600 0 @1" }; 
       var formula4 = new Formula() { Equation = "sum 0 0 @2" }; 
       var formula5 = new Formula() { Equation = "sum 21600 0 @3" }; 
       var formula6 = new Formula() { Equation = "if @0 @3 0" }; 
       var formula7 = new Formula() { Equation = "if @0 21600 @1" }; 
       var formula8 = new Formula() { Equation = "if @0 0 @2" }; 
       var formula9 = new Formula() { Equation = "if @0 @4 21600" }; 
       var formula10 = new Formula() { Equation = "mid @5 @6" }; 
       var formula11 = new Formula() { Equation = "mid @8 @5" }; 
       var formula12 = new Formula() { Equation = "mid @7 @8" }; 
       var formula13 = new Formula() { Equation = "mid @6 @7" }; 
       var formula14 = new Formula() { Equation = "sum @6 0 @5" }; 

       formulas1.Append(formula1); 
       formulas1.Append(formula2); 
       formulas1.Append(formula3); 
       formulas1.Append(formula4); 
       formulas1.Append(formula5); 
       formulas1.Append(formula6); 
       formulas1.Append(formula7); 
       formulas1.Append(formula8); 
       formulas1.Append(formula9); 
       formulas1.Append(formula10); 
       formulas1.Append(formula11); 
       formulas1.Append(formula12); 
       formulas1.Append(formula13); 
       formulas1.Append(formula14); 
       var path1 = new Path() 
       { 
        AllowTextPath = DocumentFormat.OpenXml.Vml.BooleanValues.True, 
        ConnectionPointType = ConnectValues.Custom, 
        ConnectionPoints = "@9,0;@10,10800;@11,21600;@12,10800", 
        ConnectAngles = "270,180,90,0" 
       }; 
       var textPath1 = new TextPath() 
       { 
        On = DocumentFormat.OpenXml.Vml.BooleanValues.True, 
        FitShape = DocumentFormat.OpenXml.Vml.BooleanValues.True 
       }; 
       var shapeHandles1 = new Handles(); 

       var shapeHandle1 = new Handle() 
             { 
              Position = "#0,bottomRight", 
              XRange = "6629,14971" 
             }; 

       shapeHandles1.Append(shapeHandle1); 

       var lock1 = new Lock 
       { 
        Extension = ExtensionHandlingBehaviorValues.Edit, 
        TextLock = DocumentFormat.OpenXml.Vml.Office.BooleanValues.True, 
        ShapeType = DocumentFormat.OpenXml.Vml.Office.BooleanValues.True 
       }; 

       shapetype1.Append(formulas1); 
       shapetype1.Append(path1); 
       shapetype1.Append(textPath1); 
       shapetype1.Append(shapeHandles1); 
       shapetype1.Append(lock1); 
       var shape1 = new Shape() 
           { 
            Id = "PowerPlusWaterMarkObject357476642", 
            Style = "position:absolute;left:0;text-align:left;margin-left:0;margin-top:0;width:527.85pt;height:131.95pt;rotation:315;z-index:-251656192;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-position-vertical:center;mso-position-vertical-relative:margin", 
            OptionalString = "_x0000_s2049", 
            AllowInCell = DocumentFormat.OpenXml.Vml.BooleanValues.False, 
            FillColor = "silver", 
            Stroked = DocumentFormat.OpenXml.Vml.BooleanValues.False, 
            Type = "#_x0000_t136" 
           }; 


       var fill1 = new Fill() { Opacity = ".5" }; 
       TextPath textPath2 = new TextPath() 
             { 
              Style = "font-family:\"Calibri\";font-size:1pt", 
              String = "DRAFT" 
             }; 

       var textWrap1 = new TextWrap() 
            { 
             AnchorX = HorizontalAnchorValues.Margin, 
             AnchorY = VerticalAnchorValues.Margin 
            }; 

       shape1.Append(fill1); 
       shape1.Append(textPath2); 
       shape1.Append(textWrap1); 
       picture1.Append(shapetype1); 
       picture1.Append(shape1); 
       run1.Append(runProperties1); 
       run1.Append(picture1); 
       paragraph2.Append(paragraphProperties2); 
       paragraph2.Append(run1); 
       sdtContentBlock1.Append(paragraph2); 
       sdtBlock1.Append(sdtProperties1); 
       sdtBlock1.Append(sdtContentBlock1); 
       headerPart.Header.Append(sdtBlock1); 
       headerPart.Header.Save(); 
       //break; 
      } 
     } 
    } 
} 

UPDATE :

이 지금 파일이 개방되는 방식을 변경하여 해결됩니다. 주 기능을 다음과 같이 변경하면 :

static void Main(string[] args) 
     { 
      //var doc = WordprocessingDocument.Open(@"C:\Users\loggedinuser\Desktop\TestDoc.docx", true); 
      //AddWatermark(doc); 
      //doc.MainDocumentPart.Document.Save(); 
      byte[] sourceBytes = File.ReadAllBytes(@"C:\Users\loggedinuser\Desktop\TestDoc.docx"); 

      MemoryStream inMemoryStream = new MemoryStream(); 
      inMemoryStream.Write(sourceBytes, 0, (int)sourceBytes.Length); 

      var doc = WordprocessingDocument.Open(inMemoryStream, true); 
      AddWatermark(doc); 
      doc.MainDocumentPart.Document.Save(); 

      doc.Close(); 
      doc.Dispose(); 
      doc = null; 

      using (FileStream fileStream = new FileStream(@"C:\Users\loggedinuser\Desktop\TestDoc.docx", System.IO.FileMode.Create)) 
      { 
       inMemoryStream.WriteTo(fileStream); 
      } 

      inMemoryStream.Close(); 
      inMemoryStream.Dispose(); 
      inMemoryStream = null; 
     } 

이제 문서가 올바르게 열립니다. Brad에게 감사드립니다!

답변

5

이제 파일을 여는 방식을 변경하여이 문제를 해결할 수 있습니다. 주 기능을 다음과 같이 변경하면 :

static void Main(string[] args) 
{ 
    //var doc = WordprocessingDocument.Open(@"C:\Users\loggedinuser\Desktop\TestDoc.docx", true); 
    //AddWatermark(doc); 
    //doc.MainDocumentPart.Document.Save(); 
    byte[] sourceBytes = File.ReadAllBytes(@"C:\Users\loggedinuser\Desktop\TestDoc.docx"); 
    MemoryStream inMemoryStream = new MemoryStream(); 
    inMemoryStream.Write(sourceBytes, 0, (int)sourceBytes.Length); 

    var doc = WordprocessingDocument.Open(inMemoryStream, true); 
    AddWatermark(doc); 
    doc.MainDocumentPart.Document.Save(); 

    doc.Close(); 
    doc.Dispose(); 
    doc = null; 

    using (FileStream fileStream = new FileStream(@"C:\Users\loggedinuser\Desktop\TestDoc.docx", System.IO.FileMode.Create)) 
    { 
     inMemoryStream.WriteTo(fileStream); 
    } 

    inMemoryStream.Close(); 
    inMemoryStream.Dispose(); 
    inMemoryStream = null; 
} 

이제 문서가 올바르게 열립니다. Sonoma Partners의 동료 인 Brad B.에게 감사드립니다!

1

라인

doc.MainDocumentPart.DeleteParts(doc.MainDocumentPart.HeaderParts); 

를 제거하고 비슷한 뭔가 sectionproperties에 대한 검사를 대체

if (doc.MainDocumentPart.Document.Body.Elements<SectionProperties>().Count == 0) 

편집 :

전체 .. 같을 것이다 다음 경우 :

var sectionProps = null; 

if (doc.MainDocumentPart.Document.Body.Elements<SectionProperties>().Count == 0) 
{ 
sectionProps = new SectionProperties(); 
doc.MainDocumentPart.Document.Body.Append(sectionProps); 
} 
else 
{ 
sectionProps = doc.MainDocumentPart.Document.Body.Elements<SectionProperties>().Last(); 
} 
+0

내가 변경하면 위에 제안한 if 문을 건너 뛰고 다음 오류가 표시됩니다. 내용에 문제가있어 TestDoc.docx 파일을 열 수 없습니다. 세부 정보 : 일부 파일이 없거나 잘못 되었기 때문에 Microsoft Office에서이 파일을 열 수 없습니다. 위치 : 파트 : /word/document.xml, 줄 : 1, 열 : 0 – Rob

+0

위의 편집을 참조하십시오. – Yahia

+0

변경을 했는데도 여전히 오류가 발생합니다. 제안 된 변경 사항을 포함하도록 위의 코드를 편집해야합니까? – Rob

관련 문제