2009-03-30 24 views

Respuesta

40

Como se ha observado, no parece haber ninguna biblioteca para manipular documentos Open XML en Ruby, pero OpenXML Developer tiene documentación completa sobre el formato de documentos Open XML.

Si lo que desea es enviar una copia de un documento estándar (como una carta) personalizado para cada usuario, debería ser bastante simple dado que un DOCX es un archivo ZIP que contiene varias partes en una jerarquía de directorios. Tener una "plantilla" de DOCX que contenga todas las partes y la estructura de árbol que desee enviar a los usuarios de all (sin contenido real), simplemente cree nuevas (o modifique) piezas que contengan el contenido específico del usuario que desea e inserte en el ZIP (archivo DOCX) antes de enviarlo al usuario.

Por ejemplo: Puede tener document-template.xml que contenga Estimado [USER-PLACEHOLDER]:. Cuando un usuario solicita el documento, reemplaza [USER-PLACEHOLDER] con el nombre del usuario, luego agrega el resultado document.xml al archivo ZIP your-template.docx (que contendría todas las imágenes y otras partes que desee en el documento Word) y envíe el documento resultante al usuario .

Tenga en cuenta que si cambia el nombre de un archivo .docx a .zip, es trivial explorar la estructura y el formato de las piezas internas. Puede eliminar o reemplazar imágenes u otras partes muy fácilmente con cualquier herramienta de manipulación ZIP o programáticamente con código.

Generar un nuevo documento de Word con contenido completamente personalizado desde XML sin formato sería muy difícil sin acceso a una API para facilitar el trabajo. Si realmente necesita hacer eso, podría considerar instalar Mono, luego usar VB.NET, C# o IronRuby para crear sus documentos Open XML usando el Open XML Format SDK 1.0. Como solo usaría el Microsoft.Office.DocumentFormat.OpenXml.Packaging Namespace para manipular documentos Open XML, debería funcionar bien en Mono, que parece ser compatible con todo lo que el SDK requiere.

+0

He escrito una pequeña utilidad para dividir plantillas de docx algo complejas y crear un documento personalizado usando las divisiones: http://github.com/bagilevi/docx_builder – Leventix

+0

. Todavía estoy tratando de ponerme cómodo con este método. –

+0

Agregué otra opción para generar un archivo docx a partir de una plantilla https://github.com/jawspeak/ruby-docx-templater Utiliza zipruby y procesos en memoria. (En realidad, utiliza una versión bifurcada que no colisiona con el módulo Zip :: de rubyzip). – JAWspeak

7

Sé que si sirve un documento HTML como un documento de Word con la extensión .doc, se abrirá en Word muy bien. Simplemente no hagas nada elegante.

Edit: Aquí hay un ejemplo que usa ASP clásico. http://www.aspdev.org/asp/asp-export-word/

+0

Gracias, pero eso suena un poco como un truco sucio, ¿no? :-) Además de eso: ¿Cuáles son las preocupaciones de seguridad al usar RTF? – Javier

+2

¿Cuáles son las preocupaciones con los archivos RTF? – Brian

1

Si está ejecutando en Windows, por supuesto, es una cuestión de WIN32OLE y algo de dolor con los objetos de Word COM.

Sin embargo, lo más probable es que se trate de un entorno * nix. Word 2007 utiliza el formato "Microsoft Office Open XML" (* .docx) que se puede abrir utilizando el compatibility pack from Microsoft apropiado.

Algunas de las aplicaciones de Office más recientes (2002/XP y 2003 al menos) tenían their own XML formats que también pueden ser utilizables.

No estoy al tanto de ninguna herramienta de Ruby para facilitar el proceso, por desgracia.

Si se puede hacer aceptable, creo que me inclinaría a ir por la ruta del archivo renombrado-html. Acabo de guardar un documento como HTML de WordXP, lo cambié a .doc y lo abrí sin problemas.

+0

La ruta del archivo renombrado-html como usted lo describe no funcionaría para mi caso. No puedo precompilar los archivos html en una aplicación de Word de Office y cambiarle el nombre a .doc y si hago esto con archivos html simples en mi servidor IE no los reconoce como archivos de doc. – Javier

+0

No soy fanático de Win32OLE ya que usa la palabra motor para manipular el archivo. –

6

Puede usar Apache POI. Está escrito en Java, pero integrates with Ruby as an extension

+2

¡Gracias por tu aporte! ¿Conoce alguna implementación en la que se utilizó el POI de Apache para crear realmente un documento de Word (no solo analizarlo)? – Javier

+0

Disculpe, no sé mucho sobre eso aparte de que existe. – ykaganovich

+0

docx4j (mi proyecto) está enfocado en hacer cosas con archivos docx (a diferencia de xlsx, aunque maneja esos también) – JasonPlutext

2

Además de la respuesta de Grant, también puede enviar a Word un archivo "OPC plano", que es esencialmente el docx descomprimido y concatenado para crear un solo archivo xml. De esta forma, puede reemplazar [USER-PLACEHOLDER] en un archivo y terminarlo (es decir, sin comprimir ni descomprimir).

0

me encontré con el mismo problema. Desafortunadamente no pude manipular el xml porque mis clientes deberían rellenar las plantillas. Y hacer esto no siempre es posible (por ejemplo, office for mac no permite esto).

Como solución a este problema, hice una joya sencilla, que se puede utilizar como una plantilla de documento RTF con el rubí incrustado: https://github.com/eicca/rtf-templater

lo probé y funciona bien para el llenado de informes y documentos. Sin embargo, el formato muestra mal para bucles y condiciones complejas.

4

Esta es una forma en que Doccy (doccyapp.com) tiene una API que hace exactamente lo que puede usar. Admite docx, odt y páginas y convierte a PDF también si te gusta

3

Utilizando una técnica muy similar a la sugerida por Grant Wagner he creado un html de Ruby para gema de palabra que debería permitirle exportar fácilmente archivos Word docx desde tu aplicación Ruby Puede verificarlo al http://github.com/nickfrandsen/htmltoword - Simplemente páselo por una cadena html y creará un archivo word docx correspondiente.

def show 
    respond_to do |format| 
    format.docx do 
     file = Htmltoword::Document.create params[:docx_html_source], "file_name.docx" 
     send_file file.path, :disposition => "attachment" 
    end 
    end 
end 

Espero que lo encuentres útil. Si tiene algún problema, puede abrir un problema de github.

+0

Muchas gracias, me salvaste la vida para hacer esta Gema @Nick ... – VKatz

+0

Una vez que uso 'create_and_save 'método Se guardó en una ruta determinada en un archivo comprimido, pero no se pudo encontrar el archivo de formato' .docx '. ¡Por favor, avise! – VKatz

+0

¿Esta gema le permite controlar la orientación de la página? –

3

Divulgación: Soy el líder del proyecto docxtemplater.

Sé que estás buscando una solución de ruby, pero como todas las demás soluciones solo te dicen cómo hacerlo globalmente, sin darte una biblioteca que haga exactamente lo que quieres, aquí hay una solución basada en JS o NodeJS (funciona en ambas)

DocxTemplater Library

Demo of the library

también se puede utilizar en la línea de comandos:

npm install docxtemplater -g 

docxtemplater <configFile> 

----config.docxFile: The input file in docx format 
----config.outputFile: The outputfile of the document 
+4

dando un ejemplo js para una pregunta de rubí es de mal gusto. –

+0

También hay una interfaz de línea de comandos, así que quizás esto podría ser útil para proyectos que no usan node.js – edi9999

5

Esta es una pregunta antigua, pero hay una nueva respuesta. Si desea convertir un documento HTML en un documento de Word (.docx), sólo tiene que utilizar el 'htmltoword' joya:

https://github.com/nickfrandsen/htmltoword

No estoy seguro de por qué no había respuesta de fluencia y todo el mundo comenzó a publicar plantillas soluciones, pero esto responde a la pregunta del OP.Al igual que Gambas, excepto Word en lugar de PDF.

ACTUALIZACIÓN:

También hay pandoc y una envoltura API para Pandoc llamados docverter. Ambos tienen instalaciones ligeramente complicadas ya que Pandoc es una biblioteca de Haskell.

+2

He usado 'htmltoword' y no puedo recomendarlo. Solo puede manejar párrafos y encabezados. Si quieres una poderosa conversión de documentos en tu aplicación Ruby, te sugiero Pandoc, aunque sea un rubí como docverter o pandoc-ruby. Sin embargo, la conversión de PDF requiere bibliotecas LaTeX; son casi 2 GB de bibliotecas. Advertencia justa :) – Archonic

Cuestiones relacionadas