Bom, juro que não entendi o seu problema, e provavelmente pode ser só um pequeno problema de configuração do Jasper ou falta de fontes no PDF. Sei lá. Mas mesmo assim vou explicar meu problema… Posta aí seus códigos e exemplos, pra facilitar.
Eu tinha um layout (em html), e uns "trechos" dele iam ser recuperados da base. Esses trechos não eram só estilo, e incluiriam tabelas, divs, etc.
Por, exemplo, o layout.
<html>
<body>
<table border="1">
<tr>
<td>$conteudo1</td>
</tr>
<tr>
<td>$conteudo2</td>
</tr>
</table>
</body>
</html>
E eu substituiria o $conteudo1 e o $conteudo2 por coisas HTML vindas do banco. E eu queria que esse "HTMLzão" gerasse um super pdf.
A solução que usei para lidar com o HTML foi o JTidy, e depois pegar o resultado do JTidy e passar pro XHTMLRenderer.
// criando Árvore inicial
Tidy t = new Tidy();
t.setXHTML(true);
t.setQuiet(true);
Document xmlDoc = t.parseDOM(new ByteArrayInputStream(resultado.getBytes()), null);
Daí eu recursivamente procurava nesta árvore (xmlDoc) por nodos com o value "$conteudo1" e assim por diante, fazia um parseDOM do conteúdo necessário no banco, e inseria esse novo nó como filho no nó que tinha escrito "$conteudo1".
//nodeDescr é o nodo da árvore que contem, por exemplo, o texto "$conteudo1"
//c.getBytes é o troço que vem do banco.
Document frag = t.parseDOM(new ByteArrayInputStream(c.getBytes()), null);
Node body = frag.getChildNodes().item(1).getChildNodes().item(1);
for (int i = body.getChildNodes().getLength() - 1; i >= 0; i--) {
Node table = body.getChildNodes().item(i);
nomeDescr.getParentNode().insertBefore(table,
nomeDescr.getParentNode().getFirstChild());
}
E daí, é só passar pro XHtmlRenderer:
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(xmlDoc, null);
renderer.layout();
ByteArrayOutputStream os = new ByteArrayOutputStream();
renderer.createPDF(os);
os.close();
Eu senti muita, muita falta da implementação do Document de métodos que procurassem nodos por id e por valor, então tive que criá-los na mão (busca em profundidade, recursiva, básica, usando casamento de padrões).
Bem da verdade, meu layout tem mais alguns complicadores, como nós $demaisConteudos, que seriam repetidos dinamicamente e etc. Mas eu acertei todos estes detalhes com o JTidy. Não foi simples nem trivial, mas consegui e achei uma boa solução.