2012-09-11 66 views
1

我對word文檔中的文本草稿有內容控制。 在sharepoint中有一個應用程序頁面來從Word文檔生成PDF文檔,但是我必須刪除該草稿文本。 草稿文本也位於稱爲草稿的內容控件中。我不能使用Office API,它必須使用OpenXML,我已經閱讀了關於OpenXMLHelper和RemoveContentCOntrolANdKeepContents方法的內容,但是代碼非常混亂,所以我不確定要做什麼。刪除從sharepoint讀取的word文檔的內容控制

我有下面的代碼,我需要完成,

protected void Page_Load(object sender, EventArgs e) 
     { 
      Logger.LogDebug("ConvertToPdf", "Page_Load(object sender, EventArgs e)", "BEGIN"); 

      string source = Request.QueryString["Source"]; 
      string messageSource = Request.Url.ToString(); 
      int id = Convert.ToInt32(Request.QueryString["ID"]); 
      string state = Request.GetQueryStringValue(MeetingsCommon.Constants.QUERYSTRINGPARAMETER_STATE_NAME); 
      string statusMessage = Request.GetQueryStringValue(MeetingsCommon.Constants.QUERYSTRINGPARAMETER_MESSAGE_NAME); 
      this.litMessage.Text = statusMessage; 

      if (!string.IsNullOrEmpty(state)) 
       return; 

      using (SPLongOperation operation = new SPLongOperation(this.Page)) 
      { 
       try 
       { 
        operation.Begin(); 
        SPWeb currentWeb = SPContext.Current.Web; 
        SPSite currentSite = currentWeb.Site; 
        SPSecurity.RunWithElevatedPrivileges(delegate() 
        { 
         using (SPSite elevatedSite = new SPSite(source)) 
         { 
          using (SPWeb elevatedWeb = elevatedSite.OpenWeb()) 
          { 
           elevatedWeb.AllowUnsafeUpdates = true; 
           SPList drafts = elevatedWeb.GetSafeListByName(MeetingsCommon.Constants.LISTS_HIDDENCONVERSION_NAME); 
           SPDocumentLibrary draftsDL = elevatedWeb.GetSafeDocumentLibraryByName(MeetingsCommon.Constants.LISTS_HIDDENCONVERSION_NAME); 

           SPListItem item = drafts.GetItemById(id); 

           ConversionJobSettings pdfConversionJobSettings = new ConversionJobSettings(); 
           pdfConversionJobSettings.OutputFormat = SaveFormat.PDF; 
           pdfConversionJobSettings.OutputSaveBehavior = SaveBehavior.AlwaysOverwrite; 

           string serviceName = "Word Automation Services"; 
           ConversionJob pdfConversionJob = new ConversionJob(serviceName, pdfConversionJobSettings); 
           pdfConversionJob.UserToken = elevatedWeb.CurrentUser.UserToken; 

           string docxFile = elevatedWeb.Url + "/" + item.Url; 
           string pdfFile = docxFile.Replace("docx", "pdf"); 
           SPList destinationList = null; 


           pdfConversionJob.AddFile(docxFile, pdfFile); 
           Stream document = draftsDL.GetDocumentTemplate(item.Name); 
           RemoveDraft(document); 




private void RemoveDraft(Stream wordFile) 
     { 
      Logger.LogDebug("GenerateRefuseLetter", "BuildDocument(Stream templateFile, RefuseLetter refuseLetter)", "BEGIN"); 
      Stream returnValue = null; 
      try 
      { 
       using (Package package = Package.Open(wordFile, FileMode.Open, FileAccess.ReadWrite)) 
       { 
        string relationshipType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"; 

        // Get the main document part (workbook.xml, document.xml, presentation.xml). 
        var relationShipCollection = package.GetRelationshipsByType(relationshipType); 
        if (relationShipCollection.Count() == 0) 
         throw new Exception(string.Format("Could not find a relationship with type:{0} in the package", relationshipType)); 

        // There should only be one document part in the package. 
        PackageRelationship relationship = relationShipCollection.First(); 

        Uri documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), relationship.TargetUri); 
        PackagePart documentPart = package.GetPart(documentUri); 

        Uri uriData = null; 

        List<Uri> lstPackageParts = new List<Uri>(); 
        foreach (PackagePart p in package.GetParts()) 
        { 
         XmlDocument doc = new XmlDocument(); 
         doc.Load(p.GetStream()); 


        } 

       } 
      } 
      catch(Exception ex) 
      { 
        throw ex; 
      }   
     } 

回答

2

假設你有單內容控制它的類型是SdtRun同時保持示例代碼刪除內容控制的文本可以是

using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(stream, true)) 
      { 
       SdtRun sdtRun = wordProcessingDocument.MainDocumentPart.Document.Body.Descendants<SdtRun>().FirstOrDefault(); 

       if (sdtRun != null) 
       { 
        foreach (var elem in sdtRun.SdtContentRun.Elements()) 
        { 
         sdtRun.Parent.InsertBefore(elem.CloneNode(true), sdtRun); 
        } 

        sdtRun.Remove(); 

        wordProcessingDocument.MainDocumentPart.Document.Save(); 
       }      
      } 
+0

我不在這裏看到對內容控制名稱的引用?我如何才能刪除一個具有特定名稱或標籤的內容控件? –

+1

如果已設置內容控件的Tag屬性,則可以通過SdtRun sdtRun = wordProcessingDocument.MainDocumentPart.Document.Body.Descendants ().Where(sdt => sdt.SdtProperties.Elements ().FirstOrDefault())來獲取它。 Val.Value ==「TAG」)。FirstOrDefault(); –