Paisagem e retrato para pdf com Flying Saucer / iText
Pergunta
Existe uma maneira de definir diferentes estilos de página com Flying Saucer / iText? Eu preciso ter o primeiro par de páginas na paisagem, em seguida, mudar para o retrato em uma determinada página e para fora.
Todas as idéias?
Solução
Não importa, encontrei a resposta. Para quem estiver interessado, este é como fazê-lo:
@page land { size:landscape; }
@page port { size:portrait; }
.landscapePage { page:land; }
.portraitPage { page:port; }
voilá!
Outras dicas
Para quem ainda está preso com o problema Derek mencionou, eu descobri que eu preciso definir explicitamente uma largura no elemento que está a mudar o seu layout. Assim, com o exemplo div
<div class="portraitPage">
<p>Some page content in portrait</p>
</div>
<div class="landscapePage">
<p>Some page content in landscape</p>
</div>
que irá formatar corretamente uma página retrato seguido por uma página de paisagem, mas o conteúdo na página de paisagem só será tão ampla como a página retrato, mesmo se o terra @page declaração contém uma largura. O que eu precisava era para definir a largura directamente na div que tem a classe relevante aplicada, de modo a declaração é algo mais parecido
.landscapePage { page:land; width: 29.7cm; }
Tenha cuidado, porém, que a largura deve ter em conta quaisquer margens ou preenchimento aplicadas através do bloco de declaração @page.
Você pode lidar com o tamanho da página dinamicamente em tempo de execução. Por favor, siga o passo seguinte
- Adicionar parâmetro extra para a página tipo por exemplo paisagem ou retrato em pageType param
- Adicionar seguinte código em seu tag estilo quando você está gerando o seu html no lado do servidor para por exemplo
FileOutputStream fos = new FileOutputStream(file); ITextRenderer renderer = new ITextRenderer(); StringBuilder htmls = new StringBuilder(); htmls.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); htmls.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"); htmls.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">"); htmls.append("<head><style type=\"text/css\">"); htmls.append("@page{ size: "+request.getParameter("pageType")}"); htmls.append("</style></head>"); htmls.append("<body><div>dynamic pdf data</div></body></html>"); renderer.getFontResolver().addFont("C:\\Windows\\Fonts\\Calibri.ttf","UTF-8",BaseFont.NOT_EMBEDDED); renderer.setDocumentFromString(htmls.toString()); renderer.layout(); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + ".pdf\""); renderer.createPDF(outputStream); renderer.createPDF(fos);