Ahora quiero implementar una funcionalidad para agregar una imagen de código QR en la primera página de un archivo docx existente en nodejs.
He probado estos tres métodos pero no he podido resolver.
{%image}
en un archivo de imagen.¿Hay alguna solución aquí? Gracias por adelantado.
Es probable que sea mucho más difícil fusionar o editar archivos de forma limpia. Mi idea es analizar el archivo para que pueda editarlo en forma de una estructura JSON fácil de usar.
No he encontrado ninguna buena biblioteca para leer archivos docx, pero son solo archivos zip. Dentro encontrarás algunas carpetas y archivos. Uno de ellos es /word/document.xml
. Ahí es donde se almacena el contenido real del documento.
Probablemente podría simplemente analizar el XML allí, inyectar el suyo propio y volver a serializarlo en el archivo. Si desea que esté centrado o tenga un tamaño específico, es posible que también deba editar el archivo de estilos.
Alternativamente, es posible que desee analizar el contenido y crear un documento de Word completamente nuevo utilizando el paquete docx
, al que se refirió. Esto puede y probablemente resultará en que pierda estilos.
Depende de por qué está inyectando el código QR. Es posible que desee considerar una opción completamente nueva, como simplemente hacer que el usuario escriba lo que estaba escribiendo en un editor de Markdown y exportarlo como PDF. Lo más probable es que sea lo más fácil.
En realidad, es difícil adjuntar una imagen directamente al archivo docx.
Para hacerlo, debe agregar la imagen en la carpeta word/media
, actualizar la relación en el archivo word/_rels/document.xml.rels
y agregar la cadena xml adecuada que representa la imagen en el archivo word/document.xml
.
Pero no funciona bien con la mayoría de los archivos y se corromperá aunque el archivo sea recuperable.
Entonces, mi sugerencia es agregar el texto {%image}
en el archivo docx y reemplazarlo con la imagen usando docxtemplater .
Para agregar {%image}
al archivo docx, debe agregar esta cadena xml <w:p><w:pPr><w:jc w:val="center"/></w:pPr><w:r><w:t xml:space="preserve">{%image}</w:t></w:r></w:p>
en word/document.xml
.
const originFile = fs.readFileSync(path.resolve('origin.docx'), 'binary'); const originZip = await JSZip.loadAsync(originFile); const originDocumentFile = originZip.file(/^word\/document[0-9]*.xml$/)[0]; let originDocumentXml = await originDocumentFile.async("string"); const startIndex = originDocumentXml.indexOf("<w:body>") + 8; originDocumentXml = originDocumentXml.slice(0, startIndex) + '<w:p><w:pPr><w:jc w:val="center"/></w:pPr><w:r><w:t xml:space="preserve">{%image}</w:t></w:r></w:p>' + originDocumentXml.slice(startIndex); originZip.file(originDocumentFile.name, originDocumentXml); const updateFile = await originZip.generateAsync({ type: 'nodebuffer' }); fs.writeFile("output.docx", updateFile, function(err) {/*...*/});