2010-07-28 3 views
10

In unserem alten MSWord-97-basierten System verwenden wir COM, um mit einer .doc-Datei zu interagieren und ein OLE-Objekt einzubetten, sodass das eingebettete Dokument im übergeordneten Element sichtbar ist (nicht als Symbol).Betten Sie den Inhalt einer RTF-Datei in eine DOCX-Datei mit OpenXML SDK ein

Wir ersetzen dies durch ein System mit OpenXML SDK, da Word auf unserem Server benötigt wird, der DOCX-Dateien generiert. Trotzdem müssen wir den Inhalt von RTF-Dateien in das generierte DOCX einbetten ... insbesondere ersetzen wir ein Lesezeichen durch den Inhalt der Datei.

Ich habe ein paar Beispiele online gefunden, aber alle unterscheiden sich. Wenn ich ein einfaches Beispiel in Word erstelle und das XML ansehe, gibt es ein Los von Sachen, um die visuelle Darstellung des eingebetteten Objekts zu positionieren/anzuzeigen, während die Einbettung selbst nicht zu schrecklich erscheint. Was ist der einfachste Weg, dies zu tun?

+0

Nun, ich pausierte bei dieser Aufgabe, aber habe es 3,5 Jahre später wieder geöffnet. Ich fing an, eine Frage über SO zu schreiben und es erinnerte mich daran, dass es schon existierte! –

+0

Möglicherweise verwandt, vielleicht kann es jemandem helfen: http://social.msdn.microsoft.com/Forums/office/en-US/7a729264-8747-4fc3-a604-d2f4443f3e84/insert-rtf-file-in-word- processing-document-using-office-open-xml? forum = oxmlsdk –

Antwort

11

herausgefunden zu haben, Sie könnten den Inhalt eines RTF Dokument in eine OpenXML DOCX Datei unter Verwendung des AltChunk Anker für fremde Inhalte einbetten. Das Element AltChunk() gibt einen Speicherort in Ihrem OpenXML WordprocessingML-Dokument an, um externen Inhalt wie ein RTF-Dokument einzufügen. Der folgende Code verwendet die AltChunk Klasse in Verbindung mit der AlternativeFormatImportPart Klasse den Inhalt eines RTF Dokument in eine DOCX Datei nach dem letzten Absatz einzubetten:

using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(@"your_docx_file.docx", true)) 
{ 
    string altChunkId = "AltChunkId5"; 

    MainDocumentPart mainDocPart = wordDocument.MainDocumentPart; 
    AlternativeFormatImportPart chunk = mainDocPart.AddAlternativeFormatImportPart(
     AlternativeFormatImportPartType.Rtf, altChunkId);  

    // Read RTF document content. 
    string rtfDocumentContent = File.ReadAllText("your_rtf_document.rtf", Encoding.ASCII); 

    using (MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(rtfDocumentContent))) 
    { 
    chunk.FeedData(ms); 
    } 

    AltChunk altChunk = new AltChunk(); 
    altChunk.Id = altChunkId; 

    // Embed AltChunk after the last paragraph. 
    mainDocPart.Document.Body.InsertAfter(
    altChunk, mainDocPart.Document.Body.Elements<Paragraph>().Last()); 

    mainDocPart.Document.Save(); 
} 

Wenn Sie eine Unicode RTF Zeichenfolge in ein einbetten möchten DOCX Datei dann müssen Sie die Unicode-Zeichen zu entkommen. Ein Beispiel finden Sie unter stackoverflow answer.

Wenn Sie den Fehler auf „die Datei beschädigt ist“ dann sicher, dass Sie Dispose() oder Close() die WordprocessingDocument. Wenn Sie das Dokument nicht schließen(), wird die Verknüpfung für die w:altchunk nicht in der Datei Document.xml.rels gespeichert.

+0

Ich habe 'AltChunk' vorher verwendet, um HTML in docx-Dateien einzufügen und es funktionierte wie ein Zauber. Definitiv der Weg zu gehen – flipchart

+0

Hmm, das schien so gut zu gehen, aber ich bekomme nur "die Datei ist beschädigt", wenn Sie versuchen, es in Word 2010 nach dem Speichern von Änderungen zu öffnen. Ich benutze dieses Beispiel praktisch genau jetzt. Was soll ich prüfen, wo soll ich hinschauen? –

+0

@ John: Konnten Sie ein Beispieldokument zur Verfügung stellen (das ist beschädigt)? Also werde ich es mir ansehen. Ich verwende das OpenXML Produktivitäts-Toolkit, um solche Dokumente zu prüfen. Ist das eingegebene RTF-Dokument vollständig (gültig)? Ist die aktuelle Position des Speicherstroms Null?Beachten Sie, dass die FeedData-Methode nicht zum Anfang des Streams sucht. – Hans

0

schien dieses Fella es mit seiner eigenen Frage und Antwort auf How can I embed any file type into Microsoft Word using OpenXml 2.0

+2

Seine Lösung erfordert immer noch, dass Sie Word installiert haben, was eine schreckliche Idee für die serverseitige Dokumentgenerierung ist und der ganze Grund, warum wir das neue Tool in der erstellen erster Platz. Bei einigen Serverkonfigurationen können Sie Word nicht über COM starten. –

+2

Ugh, du hast Recht, genau dort unten. Scheint sinnlos, all das in WordprocessingML anzubieten, nur um es mit Interop zu ruinieren. –

Verwandte Themen