Modificar un Docx con enlaces usando un XML

Mi objetivo actual es un poco complejo, pero intentaré explicarlo lo mejor que pueda. Tenemos una pieza de software que ha estado generando registros XML de todos los usos durante los últimos meses. Alguien más analizó a partir de estos datos lo que consideró necesario para la documentación y lo colocó todo en un formato HTML legible.

Mi trabajo es encontrar una manera de vincular los archivos HTML legibles que generaron con un documento de Word (.docx) preexistente. Actualmente tengo un script NAnt que lee el directorio que contiene los registros y crea un documento XML con el formato:

<root> 
    <HTML address=...>
        <ProductName name=...>
            <FunctionName name=...>
            </FunctionName>
        </ProductName>
    </HTML>
</root>

El documento de Word en sí contiene tablas que contienen los nombres de las funciones. Estas tablas están debajo de los encabezados que contienen el nombre del producto. Necesito envolver un enlace a la dirección asociada con la función alrededor del nombre de la función dentro de la tabla para que alguien que lea la documentación pueda hacer clic fácilmente en el nombre de una función y ver la documentación de la función.

No tengo experiencia en la modificación procedimental de documentos de Word, por lo que me encantaría que me ayudaran con esto, ya que parece un procedimiento bastante complejo. Puedo reordenar los nodos XML fácilmente, si simplificara el proceso de alguna manera.

Cosas que he investigado hasta ahora:

  • Antes de analizar el formato de docx, quería escribir otro script que simplemente buscara los datos asociados y luego los envolviera con etiquetas de hipervínculos. Desafortunadamente, una vez que investigué docx, parece que el formato es mucho más complicado que eso.

  • Después de eso, decidí considerar el uso de C# a través de Visual Studio 2010. Desafortunadamente, como no tengo experiencia en el uso de C# (solo he usado C y C++), fue bastante confuso. Llevo unos días buscando guías y referencias, pero está todo muy disperso y no encuentro lo que busco.

preguntado el 12 de junio de 12 a las 16:06

1 Respuestas

Tres técnicas para tu kit bag:

  1. Enlace de datos XML personalizado. Con esto, puede inyectar un documento XML en su docx y hacer que los datos (vinculados a través de XPath) se muestren automáticamente. Sin embargo, no dentro de un hipervínculo, por lo que es posible que esto no funcione para usted. Aunque podría ejecutar una macro AutoOpen cuando el docx se abre por primera vez en Word, para convertir texto en hipervínculos.

  2. AltChunk. Con esto puedes incluir HTML dentro de tu docx. Sin embargo, necesitaría modificar el docx. (Ver 3 a continuación)

  3. XML OPC plano. Esta es una representación del docx como un solo archivo XML, con Word 2007 o posterior puede leer o escribir felizmente. Con esto, puede reemplazar el contenido de un hipervínculo con la herramienta que elija. También puede usar esta representación para facilitar la inyección de contenido en AltChunks si lo desea.

El pequeño desafío de reemplazar los hipervínculos es que debe hacerlo en 2 lugares. En primer lugar, el texto del enlace que se muestra al usuario en el propio documento (document.xml), y en segundo lugar, la URL de destino (en la parte de relaciones). Estos están unidos por un relId.

Si usa AltChunk, puede reemplazar en un solo lugar. No estoy seguro de cuánto duran sus documentos y si tendrá problemas de rendimiento si tiene cientos de AltChunks (incluso si básicamente solo contienen un solo hipervínculo).

Aquí hay un ejemplo de un archivo XML OPC plano que contiene un AltChunk HTML (que debería poder guardar y arrastrar a Word o hacer Archivo> Abrir):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage">
    <pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/_rels/.rels">
        <pkg:xmlData>
            <rel:Relationships xmlns:rel="http://schemas.openxmlformats.org/package/2006/relationships">
                <rel:Relationship Id="rId1" Target="word/document.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"/>
            </rel:Relationships>
        </pkg:xmlData>
    </pkg:part>
    <pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" pkg:name="/word/document.xml">
        <pkg:xmlData>
            <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" >
                <w:body>
                    <w:altChunk r:id="rId2"/>
                    <w:sectPr>
                        <w:pgSz w:code="1" w:h="15840" w:w="12240"/>
                        <w:pgMar w:bottom="1440" w:left="1440" w:right="1440" w:top="1440"/>
                    </w:sectPr>
                </w:body>
            </w:document>
        </pkg:xmlData>
    </pkg:part>
    <pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/word/_rels/document.xml.rels">
        <pkg:xmlData>
            <rel:Relationships xmlns:rel="http://schemas.openxmlformats.org/package/2006/relationships">
                <rel:Relationship Id="rId2" Target="../chunk.html" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk"/>
            </rel:Relationships>
        </pkg:xmlData>
    </pkg:part>
    <pkg:part pkg:compression="store" pkg:contentType="text/html" pkg:name="/chunk.html">
        <pkg:binaryData>PGh0bWw+PGJvZHk+PHA+PGEgaHJlZj0iaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tIj5TdGFja092ZXJmbG93PC9hPjwvcD48L2JvZHk+PC9odG1sPg==</pkg:binaryData>
    </pkg:part>
    <pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/_rels/chunk.html.rels">
        <pkg:xmlData>
            <rel:Relationships xmlns:rel="http://schemas.openxmlformats.org/package/2006/relationships"/>
        </pkg:xmlData>
    </pkg:part>
</pkg:package>

Los datos binarios son

"<html><body><p><a href="http://stackoverflow.com">StackOverflow</a></p></body></html>" 

Codificado en base64 (según lo requiere el formato Flat OPC XML).

Respondido el 13 de junio de 12 a las 15:06

Uno de mis mayores problemas es que ni siquiera estoy seguro de por dónde empezar. Parece que AltChunk sería bueno excepto por el hecho de que no sé cómo ubicar los datos que se modificarán en primer lugar. Actualmente estoy mirando la interoperabilidad de Word en C#, con la esperanza de que pueda proporcionar algunas de las respuestas, pero hasta ahora no he tenido suerte. ¿Hay alguna ayuda que pueda ofrecer sobre la navegación real del contenido de un documento de Word? - MorenaMantooth

Vea el ejemplo de trabajo que he agregado a mi respuesta. Observe que la etiqueta altChunk es donde se insertará el código HTML indicado por 'rId2'. En este enfoque, tendría 1 hipervínculo proporcionado por cada altChunk. Todo lo que tienes que hacer es codificarlo en base64. - Jason Plutexto

Oh, vaya. Esa es una gran ayuda. Sin embargo, tuve que abrir esto como un archivo independiente para ver un enlace. ¿Cómo lo insertaría exactamente en un documento existente? - MorenaMantooth

Actualización: Creo que lo encontré. Insertar el archivo como un objeto parece funcionar. Muchas gracias, el código de ejemplo es de GRAN ayuda. - MorenaMantooth

Tenía en mente que abrirías esto como un archivo independiente. Mi sugerencia es que guarde su docx preexistente como Flat OPC XML, luego agregue los elementos altChunk a las celdas de la tabla según sea necesario. O, un cuarto enfoque, puede guardar su docx preexistente como HTML y luego simplemente insertar hipervínculos HTML ordinarios. Word puede volver a abrir su propio HTML sin pérdida de formato. - Jason Plutexto

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.