Bem, então não sei se eu é que entendi o teu problema. Se tu tens uma String html e usar a implementação na forma que está no tópico ele vai gerar um único arquivo. Se quiseres separar em vários, então vais ter de refazer a chamada n vezes. É isto?
Acho que agora está um pouco mais claro. Acho que pra conseguir o que tu pretende podes formatar o html para distribuir os elementos espaçados para caber em cada página. Então a cada quebra de página que ele fizer cada elemento será colocada em uma página. Não acho que seja a melhor solução mas é o que me ocorre agora. De qualquer forma fazer este controle dentro da implementação também gostaria de saber se e como é possível.
Testei para cada item da lista chamar o create, porem ele retornou apenas o ultimo item :(.
Mas vou continuar testando, de outras formas de gerar sem a necessidade de gerar com espaços para preencher o PDF. Mas mesmo assim vlw
ITextRenderer renderer = new ITextRenderer();
ByteArrayOutputStream out = new ByteArrayOutputStream();
//cria o document que irah receber a concatenacao dos PDF's
com.lowagie.text.Document document = new com.lowagie.text.Document();
PdfCopy copy = new PdfCopy(document, out);
document.open();
for (InputStream input : inputList) {
// renderiza e cria o PDF conforme os HTML's
Tidy tidy = new Tidy();
Document doc = tidy.parseDOM(input, null);
renderer.setDocument(doc, null);
renderer.layout();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
renderer.createPDF(baos);
// para cada pdf gerado add no PDF principal, que serah mostrado para o user
PdfReader reader = new PdfReader(baos.toByteArray());
copy.addPage(copy.getImportedPage(reader, 1));
}
// fecha o documento para poder o user visualizar
document.close();
HttpServletResponse response = (HttpServletResponse) FacesContext
.getCurrentInstance().getExternalContext().getResponse();
response.reset();
response.setContentType("application/pdf");
//escreve no response o PDF gerado
PrintWriter writer = response.getWriter();
for (int i = 0; i < out.toByteArray().length; i++) {
writer.write(out.toByteArray()[i] & 255);
if ((i % 1000) == 0) {
writer.flush();
}
}
writer.flush();
writer.close();
}[/code]
Eu uso um template velocity para gerar a saída em html para depois gerar o pdf. É uma exportação de uma listagem de uma determinada página do sistema. Tudo funciona bem. O problema é que pode acontecer de uma ocorrência da lista ficar quebrada em duas páginas.
Acho que fica mais fácil vendo o template velocity. Cada
CONTEUDO
é um elemento da lista. Essa div acontece por quebrar em duas páginas, quero evitar isso. Tentei usar css e não consegui. Alguém tem sugestão?
Basta dar uma ajustadinha no ClassPath que vai funcionar.[/quote]
Eder ou alguém sabe como forçar a criação do pdf em paisagem ao invés de retrato?
Obrigado a todos.
Keldjan Alves[/quote]
Dá um olhada na API do iText pra ver como muda a orientação. Deve ser sobre o ‘Document’ ou no pior dos casos no Renderer. De qualquer forma se descobrir coloca aí.
Basta dar uma ajustadinha no ClassPath que vai funcionar.[/quote]
Eder ou alguém sabe como forçar a criação do pdf em paisagem ao invés de retrato?
Obrigado a todos.
Keldjan Alves[/quote]
Dá um olhada na API do iText pra ver como muda a orientação. Deve ser sobre o ‘Document’ ou no pior dos casos no Renderer. De qualquer forma se descobrir coloca aí.
T+[/quote]
Opa,
Tentei verificar. O Itext possui propriedade de orientação para geração do PDF.
Já no código mostrado por Eder o ITextRenderer, o qual possui o método createPDF(), não possui no seu core nenhum método que dê suporte a essa escolha de geração portrait ou landscape.
Tentei até usar pelo construtor ITextRenderer(float dotsPerPoint, int dotsPerPixel), mas não consegui.
Obrigado pela idéia.
Assim que descobrir esse negocio, eu aviso aqui.
Estou com outro problema na geracao do PDF, no momento que passo uma string por parametro para o “com.lowagie.text.pdf.PdfReader”, como no exemplo abaixo:
// input sera instanciado utilizando o setInput()
private byte[] input;
...
ByteArrayOutputStream out = new ByteArrayOutputStream();
Document document = new Document();
PdfCopy copy = new PdfCopy(document, out);
document.open();
String str = new String(input)
PdfReader reader = new PdfReader(new ByteArrayInputStream(str.getBytes()));
copy.addPage(copy.getImportedPage(reader, 1));
document.close();
out.flush();
out.close();
Porém qdo executo o codigo acima para gerar um PDF, ele gera um arquivo de PDF em branco, e isso soh ocorre no caso de converter os bytes para String. Alguém sabe o por que?
Galera, sou novo aqui.
To tentando usar o exemplo do inicio do post.
Quando uso numa classe stand alone, eu consigo instanciar o ITextRenderer numa boa, mas quando estou dentro de uma classe no server side, dá um stackoverflow gigante.
Alguém tam alguam idéia do que seja?
Valew
segue o stack do erro:
er.java:288)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:199)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:233)
at java.util.logging.StreamHandler.flush(StreamHandler.java:238)
at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:101)
at java.util.logging.Logger.log(Logger.java:465)
at com.ibm.ejs.ras.Tr.logToJSR47Logger(Tr.java:1592)
at com.ibm.ejs.ras.Tr.systemErr(Tr.java:910)
at com.ibm.ejs.ras.SystemErrStream.dispatchEvent(SystemErrStream.java:236)
at com.ibm.ejs.ras.SystemStream.write(SystemStream.java:286)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlushBuffer(StreamEncoder.java:282)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlush(StreamEncoder.java:288)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:199)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:233)
at java.util.logging.StreamHandler.flush(StreamHandler.java:238)
at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:101)
at java.util.logging.Logger.log(Logger.java:465)
at com.ibm.ejs.ras.Tr.logToJSR47Logger(Tr.java:1592)
at com.ibm.ejs.ras.Tr.systemErr(Tr.java:910)
at com.ibm.ejs.ras.SystemErrStream.dispatchEvent(SystemErrStream.java:236)
at com.ibm.ejs.ras.SystemStream.write(SystemStream.java:286)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlushBuffer(StreamEncoder.java:282)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlush(StreamEncoder.java:288)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:199)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:233)
at java.util.logging.StreamHandler.flush(StreamHandler.java:238)
at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:101)
at java.util.logging.Logger.log(Logger.java:465)
at com.ibm.ejs.ras.Tr.logToJSR47Logger(Tr.java:1592)
at com.ibm.ejs.ras.Tr.systemErr(Tr.java:910)
at com.ibm.ejs.ras.SystemErrStream.dispatchEvent(SystemErrStream.java:236)
at com.ibm.ejs.ras.SystemStream.write(SystemStream.java:286)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlushBuffer(StreamEncoder.java:282)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlush(StreamEncoder.java:288)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:199)
Cara, acho q foi um lance do próprio websphere.
Quando eu instanciava o ITextRenderer, ele usava o Log dele para logar algumas coisas…em alguma parte ele começa a usar o sistema de log do servidor, aí que dava Stack Overflow. Foi só desabilitar o log no arquivo xhtmlrenderer.conf e funcionou.
O código é o mesmo do inicio do post
para criar o pdf em como eu queria, eu tive de baixar os fontes do core-renderer no flying saucer.
Então, na classe ITextRenderer modifiquei o metodo createPDF() definindo com.lowagie.text.Rectangle firstPageSize = PageSize.A4.rotate();
E para o meu xhtml ficar no tamanho que queria, coloquei: @page {
size: 15.18in 7.88in;
margin: 0.5in;
}