Boleto em formato de Carnê no inicio da pagina

83 views
Skip to first unread message

Douguii Veruck

unread,
Sep 17, 2019, 2:24:55 PM9/17/19
to JRimum Community
Boa Tarde Amigos

Estou desenvolvendo uma aplicação para gerar boletos em formato de Carnê, porém ao gerar os boletos e apresentar no pdf os boletos são apresentados "de baixo" da pagina para cima.

Para me explicar melhor anexei um arquivo com dois boletos gerados (dois_boletos.pdf). Nesse arquivo podemos ver que no "inicio" da pagina está em branco para então vir o "segundo boleto " e depois o "primeiro boleto" . é como se estivesse gerando em ordem decrescente.

Gostaria de saber se tem como mudar isso? gerar sempre no inicio da Pagina para baixo

Anexei o layout que estou utilizando para gerar em formato de carnê...

Se puderem me informar oque fazer para corrigir ficarei muito agradecido..     
BoletoCarne3PorPagina.odt
BoletoCarne3PorPagina.pdf
dois_boletos.pdf

Gestefane Rabbi

unread,
Sep 17, 2019, 7:59:41 PM9/17/19
to JRimum Community
Boa tarde Douguii Veruck,
Pode não ser exatamente o que precisa mas talvez essas ideias possam ajudar: 
1 - sobre iniciar no topo da página já analisou o código fonte do componente?
2 - sobre a ordem já analisou em que ordem está a coleção que alimenta o relatório?

Artigos sobre ordem:

Douguii Veruck

unread,
Sep 17, 2019, 8:23:38 PM9/17/19
to JRimum Community
 Os métodos que estou utilizando encontrei no próprio site do Jrimum (alterei algumas coisas como por exemplo pegar as linhas selecionadas de uma tabela para gerar os boletos, mas creio que não interfere nessa questão.)

os Código que uso são esses:

 public  void mostra_pagina() throws ParseException{
  
           
                List<Boleto> boletos = new ArrayList<Boleto>();
              
               int[] selecao = jTable1.getSelectedRows();
            
               for (int i = 0; i < selecao.length; i++) { 
                   
                    Boleto boletoBBNossoNumero10 = cria_boleto((String)jTable1.getValueAt(selecao[i], 0));
                    boletos.add(boletoBBNossoNumero10);
             
               }  
                    
           
                //Informando o template personalizado:
                File templatePersonalizado = new File(ClassLoaders.getResource("/templates/BoletoCarne3PorPagina.pdf").getFile());
                
                File boletosPorPagina = groupInPages(boletos, "boletos.pdf", templatePersonalizado);

               // mostreBoletoNaTela(boletosPorPagina);
                
           java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
                  try {
                      desktop.open(boletosPorPagina);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
   
   }

    
  private static File groupInPages(List<Boleto> boletos, String filePath, File templatePersonalizado) {
                
                File arq = null;
                BoletoViewer boletoViewer = new BoletoViewer(boletos.get(0));
                boletoViewer.setTemplate(templatePersonalizado);

                List<byte[]> boletosEmBytes = new ArrayList<byte[]>(boletos.size());

                //Adicionando os PDF, em forma de array de bytes, na lista.
                for (Boleto bop : boletos) {
                        boletosEmBytes.add(boletoViewer.setBoleto(bop).getPdfAsByteArray());
                }
             
                try {
                        
                        //Criando o arquivo com os boletos da lista
                        arq = Files.bytesToFile(filePath, mergeFilesInPages(boletosEmBytes));
                        
                } catch (Exception e) {
                        throw new IllegalStateException("Erro durante geração do PDF! Causado por " + e.getLocalizedMessage(), e);
                }

                return arq;
        }
    

  public static byte[] mergeFilesInPages(List<byte[]> pdfFilesAsByteArray) throws DocumentException, IOException {

               Document document = new Document();
      
                ByteArrayOutputStream byteOS = new ByteArrayOutputStream();
                
        PdfWriter writer = PdfWriter.getInstance(document, byteOS);
        
        document.open();
        
        PdfContentByte cb = writer.getDirectContent();
        float positionAnterior = 0;
        
        //Para cada arquivo da lista, cria-se um PdfReader, responsável por ler o arquivo PDF e recuperar informações dele.
        for (byte[] pdfFile : pdfFilesAsByteArray) {
                
            PdfReader reader = new PdfReader(pdfFile);
            
            //Faz o processo de mesclagem por página do arquivo, começando pela de número 1.
            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                
                float documentHeight = cb.getPdfDocument().getPageSize().getHeight();

                //Importa a página do PDF de origem
                PdfImportedPage page = writer.getImportedPage(reader, i);
                float pagePosition = positionAnterior;
                
                /*
                 * Se a altura restante no documento de destino form menor que a altura do documento,
                 * cria-se uma nova página no documento de destino.
                 */
                if ( (documentHeight - positionAnterior) <=  page.getHeight()) {
                        document.newPage();
                        pagePosition = 0;
                        positionAnterior = 0;
                }
                
                //Adiciona a página ao PDF destino
                cb.addTemplate(page, 0, pagePosition);
                
                positionAnterior += page.getHeight();
            }
        }
        
        byteOS.flush();
        document.close();
        
        byte[] arquivoEmBytes = byteOS.toByteArray();
        byteOS.close();
        
        return arquivoEmBytes;
        }


Aonde eu aplicaria o Collection.sort() ?

Solerman Kaplon

unread,
Oct 1, 2019, 10:22:23 AM10/1/19
to jrimum-c...@googlegroups.com
Às 21:23 de 17/09/2019, Douguii Veruck escreveu:
>  Os métodos que estou utilizando encontrei no próprio site do Jrimum (alterei
> algumas coisas como por exemplo pegar as linhas selecionadas de uma tabela
> para gerar os boletos, mas creio que não interfere nessa questão.)
>
> os Código que uso são esses:
<snip>
>   public static byte[] mergeFilesInPages(List<byte[]> pdfFilesAsByteArray)
> throws DocumentException, IOException {
<snip>
>                 float documentHeight =
> cb.getPdfDocument().getPageSize().getHeight();
>
>                 //Importa a página do PDF de origem
>                 PdfImportedPage page = writer.getImportedPage(reader, i);
>                 float pagePosition = positionAnterior;
>                 /*
>                  * Se a altura restante no documento de destino form menor que
> a altura do documento,
>                  * cria-se uma nova página no documento de destino.
>                  */
>                 if ( (documentHeight - positionAnterior) <=  page.getHeight()) {
>                         document.newPage();
>                         pagePosition = 0;
>                         positionAnterior = 0;
>                 }
>                 //Adiciona a página ao PDF destino
>                 cb.addTemplate(page, 0, pagePosition);
>                 positionAnterior += page.getHeight();
>             }
>         }


Acho que em PDF o padrão é as coordenadas começarem do fim da página para cima
(Eixo Y invertido em relação à tela), então quando começa a página você assume a
posição final (length - margens) e vai decrementando o contéudo, se ficar < 0
acabou o espaço e aí volta ao length - margens


Solerman

Reply all
Reply to author
Forward
0 new messages