2011-08-09 19 views
11

मैं एक मौजूदा दस्तावेज़ लेने की कोशिश कर रहा हूं और यदि कोई हेडर मौजूद नहीं है, तो एक बनाएं, और फिर शीर्षलेख पर वॉटरमार्क जोड़ें जो "ड्रैफ्ट" को तिरछे कहते हैं । मैंने here पोस्ट किए गए एक उदाहरण का पालन किया है और मुझे उस बिंदु पर कोड मिला है जहां हेडर पहले से मौजूद है तो वॉटरमार्क जोड़ देगा।ओपन एक्सएमएल - एक डॉक्स दस्तावेज़ में वॉटरमार्क कैसे जोड़ें

वर्तमान मुद्दा जब मैं एक नया शीर्षक जोड़, दस्तावेज़ के संदर्भ में जोड़ने के लिए, और फिर शीर्षक के वॉटरमार्क जोड़ने है, दस्तावेज़ भ्रष्ट हो जाता है और वर्ड में अब खुला 2010

परीक्षण करने के लिए कर सकते हैं मैं निम्नलिखित कर रहा हूं: पृष्ठ के मुख्य भाग में "टेस्टडॉक" के पाठ के साथ शब्द से स्वयं का एक नया शब्द दस्तावेज़ बनाएं। मेरे डेस्कटॉप पर "TestDoc.docx" के रूप में सहेजें और फ़ाइल बंद करें। फिर मैं विजुअल स्टूडियो से ऐप चलाता हूं। नीचे दिया गया कोड हमेशा इसे दूषित कर देगा। अगर मैं फ़ाइल में कोई टेक्स्ट नहीं डालता हूं और उसके बाद सहेजता हूं, तो वॉटरमार्क सही तरीके से प्रदर्शित होगा।

यहाँ मैं अब तक है:

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; 
      } 
     } 
    } 
} 

अद्यतन:

यह अब जिस तरह से फ़ाइल को खोल दिया है बदलकर हल हो गई है। जब हम मुख्य कार्य को बदलते हैं:

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; 
     } 

दस्तावेज़ अब शब्द में सही तरीके से खुलता है। धन्यवाद ब्रैड!

उत्तर

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; 
} 

दस्तावेज़ अब शब्द में सही तरीके से खुलता है। ब्रैड बी के लिए धन्यवाद, यह ढूंढने के लिए सोनोमा पार्टनर्स में एक सहकर्मी!

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

जब मैं परिवर्तन करता हूं, तो यह उपरोक्त प्रस्तावित कथन को छोड़ देता है और मुझे निम्न त्रुटि देता है: फ़ाइल TestDoc.docx को खोला नहीं जा सकता क्योंकि सामग्री में समस्याएं हैं। विवरण: माइक्रोसॉफ्ट ऑफिस इस फाइल को नहीं खोल सकता है क्योंकि कुछ हिस्सों में गायब या अमान्य हैं। स्थान: भाग: /word/document.xml, रेखा: 1, कॉलम: 0 – Rob

+0

कृपया मेरे संपादन को – Yahia

+0

से ऊपर देखें मैंने परिवर्तन किए हैं और मुझे अभी भी त्रुटि मिल रही है। क्या मुझे आपके सुझाए गए परिवर्तनों को शामिल करने के लिए ऊपर दिए गए कोड को संपादित करना चाहिए? – Rob

संबंधित मुद्दे