Java – Concatenar RTF’s

Para concatenar varios archivos RTF’s en un solo RTF lo unico que tenemos que hacer es:

    remover la etiqueta rtf de fin de documento del primer archivo
    remover la etiqueta de inicio de documento y fin de documento de archivos subsecuentes
    remover la etiqueta de inicio de documento del ultimo archivo

esta idea surgio a partir de este post.
El problema es identificar la etiqueta de inicio de documento, ya que depende de la codificacion que se utilizo para crear el archivo. Aqui dejo el codigo que utilicé, espero posteriormente mejorarlo -mediante el uso de expresiones regulares– para que pueda concatenar cualquier RTF (independiente de la codificación). Si alguien sabe como hacer esto, le agradecería deje un comentario ;-).
Los documentos de entrada como el documento que se regresa son representados como bytes, para que sea más fácil su manejo -ej. documentos almacenados en la base de datos-

private byte[] concatenateRTF(List documentos)
throws UnsupportedEncodingException {
StringBuffer rtf = new StringBuffer(), subRtf;
int indexOfEndTag, indexOfBeginTag;
final String CHARSET = “UTF-8”;
final String BEGIN_TAG = “{\\rtf1\\ansi\\ansicpg1252\\uc1 \\deff0\\deflang3082\\deflangfe3082”;
final String END_TAG = “\\par }”;
for (int docNumber = 0; docNumber < documentos.size(); docNumber++) { byte[] contenido = documentos.get(docNumber); if (contenido != null) { if (docNumber == 0) { rtf = new StringBuffer(new String(contenido, CHARSET)); indexOfEndTag = rtf.lastIndexOf(END_TAG); if (indexOfEndTag != -1) rtf = rtf.replace(indexOfEndTag, indexOfEndTag + END_TAG.length(), ""); } else if (docNumber < documentos.size() - 1) { subRtf = new StringBuffer(new String(contenido, CHARSET)); indexOfBeginTag = subRtf.indexOf(BEGIN_TAG); if (indexOfBeginTag != -1) subRtf = subRtf.replace(indexOfBeginTag, indexOfBeginTag + BEGIN_TAG.length(), ""); indexOfEndTag = subRtf.lastIndexOf(END_TAG); if (indexOfEndTag != -1) subRtf.replace(indexOfEndTag, indexOfEndTag + END_TAG.length(), ""); rtf.append(subRtf); } else { subRtf = new StringBuffer(new String(contenido, CHARSET)); indexOfBeginTag = subRtf.indexOf(BEGIN_TAG); if (indexOfBeginTag != -1) subRtf = subRtf.replace(indexOfBeginTag, indexOfBeginTag + BEGIN_TAG.length(), ""); rtf.append(subRtf); } } } return rtf.toString().getBytes(CHARSET); } [/sourcecode] byte!

Anuncios

Java – String.Format

El día de hoy requerí sustituir posicionalmente valores en una cadena.
Por ejemplo, como entrada recibo la cadena

select * from usr{0}.empleados

y requiero que la salida sea

select * from usrVentas.empleados

En .NET basta con hacer un

String.Format(“select * from usr{0}.empleados”,”Ventas”)

En Java, por suerte, no es mucho mas complicado. Se haría de la siguiente forma

String cadena=new MessageFormat(“select * from usr{0}.empleados”).format(“Ventas”)

Algo curioso que me sucedió fue cuando intente formatear la siguiente cadena

select ‘inactivo’,nombre from usr{0}.empleados

me la convertía en

select inactivo,nombre from usrVentas.empleados

lo que me produjó un error ya que removió los apóstrofes. Para evitar esto hay que reemplazar previamente los apóstrofes por dobles apóstrofes como se muestra a continuación. La razón se explica en uno de los enlaces.

String cadena=new MessageFormat(“select ‘inactivo’,nombre from usr{0}.empleados”.replace(“‘”, “””)).format(“Ventas”)

Referencias:
Class MessageFormat
Apostrophe handling of java.text.MessageFormat
String.Format in C#