Удаление управления содержимым из текстового документа, прочитанного из sharepoint

У меня есть контроль содержимого с черновиком текста в текстовом документе. В sharepoint есть страница приложения для создания PDF-документов из текстовых документов, однако мне нужно удалить этот черновой текст. Черновой текст также находится внутри элемента управления содержимым, называемого черновиком. Я не могу использовать офисные API, он должен использовать OpenXML, я уже читал об OpenXMLHelper и методе RemoveContentCOntrolANdKeepContents, но этот код очень сбивает с толку, поэтому я не уверен, что именно делать.

У меня есть следующий код, который мне нужно заполнить,

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

person Luis Valencia    schedule 11.09.2012    source источник


Ответы (1)


Предполагая, что у вас есть один элемент управления содержимым, который имеет тип Sdt. Выполните образец кода, чтобы удалить элемент управления содержимым при сохранении текста.

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();
                }                    
            }
person Atul Verma    schedule 11.09.2012
comment
Я не вижу здесь ссылки на имя элемента управления содержимым? Как я могу удалить только один элемент управления контентом с определенным именем или ярлыком? - person Luis Valencia; 12.09.2012
comment
Если вы установили свойство Tag элемента управления содержимым, вы можете получить его с помощью SdtRun sdtRun = wordProcessingDocument.MainDocumentPart.Document.Body.Descendants ‹SdtRun› () .Where (sdt = ›sdt.SdtProperties.Elements ‹Tag› ​​() .FirstOrDefault () .Val.Value == TAG) .FirstOrDefault (); - person Atul Verma; 12.09.2012