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!
![](https://i0.wp.com/img.zemanta.com/pixy.gif)