2010-07-28 8 views
10

En nuestro antiguo sistema basado en MSWord-97, usamos COM para interactuar con un archivo .doc e incrustar un objeto OLE para que el documento incrustado sea visible en el padre (no como un ícono)Incrustar contenidos de un archivo RTF en un archivo DOCX utilizando OpenXML SDK

Estamos reemplazando esto con un sistema que usa SDK de OpenXML, ya que requiere tener Word en nuestro servidor, que genera archivos .docx. sin embargo, todavía tenemos que insertar el contenido de los archivos RTF en el DOCX generado ... específicamente reemplazamos un marcador con el contenido del archivo.

Encontré algunos ejemplos en línea pero todos difieren. Cuando creo un ejemplo simple en Word y veo el XML, hay un lote de cosas para posicionar/mostrar la representación visual del objeto incrustado, mientras que la incrustación en sí no parece demasiado horrible. ¿Cuál es la forma más fácil de hacer esto?

+0

Bueno, me detuve en esta tarea pero la volví a abrir 3.5 años después. Empecé a escribir una pregunta sobre SO y me recordó que esto ya existía. –

+0

Posiblemente relacionado, tal vez pueda ayudar a alguien: 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 –

Respuesta

11

Se puede incrustar el contenido de un documento RTF en un archivo OpenXML DOCX utilizando el ancla AltChunk de contenido externo. El elemento AltChunk (w:altChunk) especifica una ubicación en su documento OpenXML WordprocessingML para insertar contenido externo, como un documento RTF. El código siguiente utiliza la clase AltChunk en conjunción con la clase AlternativeFormatImportPart para incrustar el contenido de un documento RTF en un archivo DOCX después del último párrafo:

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

Si desea incrustar una cadena Unicode RTF en una DOCX archivo, entonces debe escapar de los caracteres Unicode. Para ver un ejemplo, consulte el siguiente stackoverflow answer.

Cuando se produce el error "el archivo está dañado" y luego asegurarse de que Dispose() o Close() la WordprocessingDocument. Si no cierra() el documento, la relación entre w:altchunk no se almacena en el archivo Document.xml.rels.

+0

He usado 'AltChunk' antes para insertar HTML en archivos docx y funcionó como un amuleto. Definitivamente el camino a seguir – flipchart

+0

Hmm, esto parecía ir muy bien, pero acabo de obtener "el archivo está dañado" al intentar abrirlo en Word 2010 después de guardar los cambios. Prácticamente estoy usando este ejemplo exactamente ahora. ¿Qué debería estar revisando? ¿Dónde debería estar mirando? –

+0

@John: ¿Podría proporcionar un documento de muestra (que está dañado)? Entonces lo veré. Uso el toolkit de productividad OpenXML para verificar tales documentos. ¿El documento RTF que inserta es completo (válido)? ¿La posición actual de la secuencia de memoria es cero?Tenga en cuenta que el método FeedData no busca el comienzo de la transmisión. – Hans

0

Este tío parecía haberse dado cuenta con su propia pregunta y respuesta en How can I embed any file type into Microsoft Word using OpenXml 2.0

+2

Su solución todavía requiere que tenga Word instalado, lo cual es una idea terrible para la generación de documentos en el servidor y la razón por la que estamos creando la nueva herramienta en el primer lugar. Aparte de todo lo demás, en algunas configuraciones de servidor no se puede ejecutar Word a través de COM. –

+2

Uf, tienes razón, allí abajo. Parece inútil ofrecer todo eso en WordprocessingML, solo para arruinarlo con interoperabilidad. –

Cuestiones relacionadas