Java – Concatenar RTF’s

septiembre 15, 2009

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

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: