2015-11-16 1 views
1

Je construis un addin de mot qui a deux cases à cocher pour swabbing entre la vue TEXT et la vue XML. Et dans le visionnement XML, je limite l'édition. Lorsque l'utilisateur revient à la visualisation TEXT, je supprime la restriction pour l'édition. Le code:Word addin essayant d'afficher à la fois XML et texte, mais si le texte a une image le fichier doc corrompu?

private void ShowDocBodyXML_Click(object sender, RibbonControlEventArgs e) 
    { 
     var doc = Globals.DLPAddIn.Application.ActiveDocument; 
     doc.Save(); 
     string fileName = doc.FullName; 
     doc.Close(); 
     using (WordprocessingDocument document = WordprocessingDocument.Open(fileName, true)) 
     { 
      MainDocumentPart mainPart = document.MainDocumentPart; 
      Body body = mainPart.Document.Body; 
      string text = body.InnerXml; 
      body.RemoveAllChildren(); 
      DocumentFormat.OpenXml.Wordprocessing.Paragraph para = body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph()); 
      Run run = para.AppendChild(new Run()); 
      run.AppendChild(new Text(text)); 
     } 
     Globals.DLPAddIn.Application.Documents.Open(fileName); 
     doc = Globals.DLPAddIn.Application.ActiveDocument; 
     object missing = System.Reflection.Missing.Value; 
     doc.Protect(Microsoft.Office.Interop.Word.WdProtectionType.wdAllowOnlyReading, 
     missing, missing, missing, missing); 
     doc.Save(); 
    } 
    private void ShowDocBodyText_Click(object sender, RibbonControlEventArgs e) 
    { 
     var doc = Globals.DLPAddIn.Application.ActiveDocument; 
     object missing = System.Reflection.Missing.Value; 
     if (doc.ProtectionType != WdProtectionType.wdNoProtection) 
      doc.Unprotect(missing); 
     doc.Save(); 
     string fileName = doc.FullName; 
     doc.Close(); 
     using (WordprocessingDocument document = WordprocessingDocument.Open(fileName, true)) 
     { 
      MainDocumentPart mainPart = document.MainDocumentPart; 
      Body body = mainPart.Document.Body; 
      string text = body.InnerText; 
      body.RemoveAllChildren(); 
      body.InnerXml = text; 
     } 
     Globals.DLPAddIn.Application.Documents.Open(fileName); 
    } 

Le code fonctionne avec tout problème, mais si la Parole Doc ont une image lorsque l'utilisateur essaie de revenir à l'affichage de texte de la l'exception de jet de code (Le fichier a été corrompu) dans ce code:

Globals.DLPAddIn.Application.Documents.Open(fileName); 

Je pense que quand je l'éditer limiterai supprimer le fichier image. Si c'est comme ça, comment puis-je résoudre ce problème.

+0

Il est pas vraiment possible d'être sûr de ce qui se passe à ce supprimer. Je soupçonne que le problème peut résider dans la façon dont le contenu du document est modifié, pas avec la protection ou la non-protection. Les images sont généralement enregistrées en tant que fichiers de ressources distincts dans le package zip. Les relations sont créées et maintenues pour lier le fichier graphique dans le texte principal. Word peut supprimer la relation (par exemple) lorsque le document est enregistré à nouveau. –

+0

La comparaison d'une copie du document original avec la version ronde peut révéler où le "déconnecter" se produit. Utilisez la fonctionnalité "Comparer les documents" de l'outil de productivité Open XML SDK pour inspecter où et comment les deux diffèrent. –

+0

Merci Cindy Meister vous avez raison. Le dossier multimédia du package zip a été supprimé avec la relation qui appartient à l'image dans le fichier document.xml.rels. Et cela arrive après doc.Protect (..). Si je supprime doc.Protect (..), il enregistre le document sans supprimer le dossier multimédia et la relation. Je veux dire que c'est un bon travail. Mais si je fais doc.Protect (..). Il enlève l'image. Alors, comment puis-je résoudre le problème? – hoss77

Répondre

1

Votre approche actuelle ne fonctionne pas lorsqu'il y a des images ou d'autres ressources dans le document car vous supprimez toutes les images lors de la création du document Word contenant uniquement le code XML du MainDocumentPart.

Une solution à ceci est d'afficher l'OpenXML dans ce que l'on appelle le format Flat OPC. Ce format décrit l'ensemble du paquet OpenXML (zip) dans un seul document XML (sans la structure hiérarchique du paquet OpenXML).

La meilleure façon d'obtenir le XML au format plat OPC est d'utiliser la propriété Document.WordOpenXML:

var doc = Globals.DLPAddIn.Application.ActiveDocument; 
var xml = doc.WordOpenXML; 

var newDoc = Globals.DLPAddIn.Application.Documents.Add(); 
newDoc.Range.Text = xml 
+0

Salut ** Dirk Vollmar ** vous avez raison. Merci pour votre aide. Je veux vous demander. Est-il possible de changer xml dans 'Document.WordOpenXML' que je veux dire changer xml du document en utilisant la bibliothèque' Microsoft.Office.Tools.Word' plutôt que d'utiliser la bibliothèque DocumentFormat.OpenXml? – hoss77

+0

Si vous souhaitez manipuler le fichier XML, vous utiliserez généralement OpenXML SDK ('DocumentFormat.OpenXml'). En utilisant Office Interop, vous pouvez directement modifier les documents Word en utilisant une approche similaire à DOM basée sur le modèle d'objet Word. –