2010-07-28 8 views
10

W naszym starym systemie opartym na systemie MSWord-97 używamy COM do interakcji z plikiem .doc i osadzamy obiekt OLE, więc dokument osadzony jest widoczny w obiekcie nadrzędnym (nie jako ikona).Osadź zawartość pliku RTF w pliku DOCX przy użyciu zestawu OpenXML SDK

Zamienimy to na system wykorzystujący pakiet OpenXML SDK, ponieważ wymaga on programu Word na naszym serwerze, który generuje pliki .docx. jednak nadal musimy osadzić zawartość plików RTF w wygenerowanym DOCX ... konkretnie zamieniamy zakładkę na zawartość pliku.

Znalazłem kilka przykładów w Internecie, ale wszystkie one się różnią. Gdy utworzę prosty przykład w programie Word i wyświetlam kod XML, istnieje wiele różnych rzeczy do umieszczenia/wyświetlenia wizualnej reprezentacji obiektu osadzonego, a samo osadzanie nie wydaje się zbyt przerażające. Jaki jest najłatwiejszy sposób na zrobienie tego?

+0

Cóż, zatrzymałem się na tym zadaniu, ale ponownie otworzyłem je 3,5 roku później. Zacząłem pisać pytanie na SO i przypomniało mi to już na tym, że już istnieje! –

+0

Prawdopodobnie powiązane, może to komuś pomóc: 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 –

Odpowiedz

11

Można umieścić treść dokumentu RTF w OpenXML DOCX pliku za pomocą kotwicy AltChunk za treści zewnętrznych. Element AltChunk (w:altChunk) określa lokalizację w dokumencie OpenXML WordProcessingML w celu wstawienia zewnętrznych treści, takich jak dokument RTF. Poniższy kod wykorzystuje klasę AltChunk w połączeniu z klasą AlternativeFormatImportPart osadzić treści dokumentu RTF do pliku DOCX po ostatnim akapicie:

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

Jeśli chcesz osadzić Unicode RTF ciąg do DOCX plik następnie musisz uciec znaki Unicode. Na przykład zapoznaj się z następującym stackoverflow answer.

przypadku napotkania błędu „plik jest uszkodzony”, a następnie upewnij się, że Dispose() lub Close()WordprocessingDocument. Jeśli nie zamkniesz() dokumentu, wówczas status relevinghip dla w:altchunk nie jest przechowywany w pliku Document.xml.rels.

+0

Użyłem 'AltChunk' przed wstawieniem HTML do plików docx i działało jak urok. Zdecydowanie sposób, aby przejść – flipchart

+0

Hmm, wydawało się, że idzie tak dobrze, ale po "zapisaniu zmian" po prostu "plik jest uszkodzony", gdy próbuję otworzyć go w Word 2010. Właściwie używam tego przykładu właśnie teraz. Co powinienem sprawdzić, gdzie powinienem szukać? –

+0

@John: Czy możesz podać przykładowy dokument (który jest uszkodzony)? Więc popatrzę na to. Używam zestawu narzędzi produktywności OpenXML do sprawdzania takich dokumentów. Czy wstawiony dokument RTF jest kompletny (ważny)? Czy aktualna pozycja strumienia pamięci wynosi zero?Należy pamiętać, że metoda FeedData nie szuka początku strumienia. – Hans

0

Ten facet wydawał się zorientowaliśmy się ze swoim pytaniem i odpowiedzią na How can I embed any file type into Microsoft Word using OpenXml 2.0

+2

Jego rozwiązanie wciąż wymaga zainstalowania Worda, co jest okropnym pomysłem na generowanie dokumentów po stronie serwera i cały powód, dla którego tworzymy nowe narzędzie w pierwsze miejsce. Poza wszystkim, na niektórych konfiguracjach serwera nie można uruchamiać Worda poprzez COM. –

+2

Ugh, masz rację, właśnie tam na dole. Wydaje się, że nie ma sensu oferować wszystkiego w edytorze WordProcessingML, tylko po to, aby zepsuć go we współdziałaniu. –

Powiązane problemy