2011-02-11 11 views
6

He estado utilizando Apache POI para manipular archivos .docx de Microsoft Word, es decir, abrir un documento que se creó originalmente en Microsoft Word, modificarlo, guardarlo en un documento nuevo.Cómo generar correctamente los atributos RSID en archivos .docx de Word utilizando Apache POI?

noto que los nuevos párrafos creados por Apache POI están perdiendo una revisión Guardar ID, a menudo conocido como un RSID o rsidR. Esto es utilizado por Word para identificar los cambios realizados en un documento en una sesión, por ejemplo, entre guardar. Es opcional: los usuarios podrían desactivarlo en Microsoft Word si así lo desean, pero en realidad casi todos lo tienen puesto, por lo que casi todos los documentos están llenos de RSID. Lea this excellent explanation of RSIDs para obtener más información al respecto.

En un documento de Microsoft Word, word/document.xml contiene párrafos como éste:

<w:p w:rsidR="007809A1" w:rsidRDefault="007809A1" w:rsidP="00191825"> 
    <w:r> 
    <w:t>Paragraph of text here.</w:t> 
    </w:r> 
</w:p> 

Sin embargo, el mismo párrafo creado por PDI se verá así en word/document.xml:

<w:p> 
    <w:r> 
    <w:t>Paragraph of text here.</w:t> 
    </w:r> 
</w:p> 

He descubierto que Puedo forzar POI para agregar un RSID a cada párrafo usando un código como este:

byte[] rsid = ???; 
    XWPFParagraph paragraph = document.createParagraph(); 
    paragraph.getCTP().setRsidR(rsid); 
    paragraph.getCTP().setRsidRDefault(rsid); 

Sin embargo, no sé cómo debería generar los RSID.

¿Tienen los POI una manera de generar y/o realizar un seguimiento de los RSID? Si no, ¿hay alguna manera de asegurarme de que un RSID que genero no entre en conflicto con uno que ya está en el documento?

+0

Desde el ártico le ha referido: "Son completamente aleatorios, y solo se usan para ver dónde coinciden las cosas. Por lo tanto, no son de mucha utilidad a menos que se fusionen con otro documento que también tenga RSID. "De modo que puede generar números aleatorios apropiados. En cuanto a los conflictos, se almacena una lista de ellos en una de las partes de las propiedades. para agregarlos, solo mejoran ciertos casos de comparación/diferencia. – JasonPlutext

Respuesta

4

Parece que la lista de entradas rsid válidas se guarda en word/settings.xml en la entrada <w:rsids>. XWPF debería poder darle acceso a eso ya.

Probablemente quieras generar un número aleatorio largo de 8 dígitos hexadecimales, verificar si está ahí y volver a generar si es así. Una vez que tenga uno único, agréguelo a esa lista y luego etiquete sus párrafos con él.

Lo que sugeriría es que te unas a la lista de desarrolladores de poi (mailing list details), y podemos darte una mano en el desarrollo de un parche para ello. Creo que las cosas que hacer son:

  • la envoltura alrededor de la entrada de palabra RSID/settings.xml, a dejar de hacer salir fácilmente de la lista y generar una nueva (único)
  • una envoltura alrededor de los diferentes rsid entradas en un párrafo y una carrera
  • métodos en los párrafos y corre a buscar la envoltura rsid, añadir uno nuevo, o borrar la existente

deberíamos tomar esto a la lista dev aunque :)

+0

Gracias por su respuesta, esta parece ser una solución sensata y, como necesito la funcionalidad, ¡podría ser mejor que la construya! Así que la llevaré a la lista de desarrolladores de POI . – gutch

Cuestiones relacionadas