segunda-feira, 14 de fevereiro de 2011

justificar texto quando quebra pagina no jasper

Opa,

jasper e o ireport são os caras mas de fez em quando eles ajudam a tinjir meus cabelos brancos.
o caso era o seguinte, tina que imprimir um texto comprido e quando esse texto extrapolava a pagina
ele nao justificava a ultima linha do texto. Como o jasper quebra em componentes e o compomente quando mandado alinhar horizontalmente, ele faz isso com todas a linhas menos a ultima, o que é correto mas nao quando se é a continuação de um texto que vai imprimir o restante em outra pagina.

Procurando por ajuda no google encontrei outras pessoas com o mesmo problema (Incorrect wrapping of text at end of page), neste forum (http://jasperforge.org/projects/jasperreports/tracker/view.php?id=2874) o amigo Denis criou um path que corrigia isso quando exportado o relatorio em pdf.

No meu caso, nao poderia exportar o relatorio, entao a solução foi mexer direto no codigo fonte do jarper. Segues as alterações que fiz para fungar a bagaça:

baixar codigo fonte do jasper 3.7.2:

arquivo: net.sf.jasperreports.engine.util.JRStyledText.java;

// adicionar attributo
private boolean lastParagraphCompleted;
// getter e setter

arquivo: net.sf.jasperreports.engine.fill.JRFillTextElement.java

linha 1155: tmpStyledText.setLastParagraphCompleted(lastParagraphCompleted);

arquivo: net.sf.jasperreports.engine.export.draw.TextDrawer.java

linha 199:
JRStyledText result = textElement.getStyledText(JRStyledTextAttributeSelector.NO_BACKCOLOR);
result.setLastParagraphCompleted(textElement.isLastParagraphCompleted());
return result;

arquivo: net.sf.jasperreports.engine.export.TextRenderer.java

linha 177: renderParagraph(allParagraphs, lastParagraphStart, lastParagraphText, !styledText.isLastParagraphCompleted());

linha 261: private void renderParagraph(
AttributedCharacterIterator allParagraphs,
int lastParagraphStart,
String lastParagraphText,
boolean isJustifica // acidiona parametro
)
{

linha 336: if ((lineMeasurer.getPosition() < paragraph.getEndIndex()) || (isJustifica))
{
layout = layout.getJustifiedLayout(formatWidth);
}