ByteArrayOutputStream

package com.estagio.passagem;

import com.estagio.entidade.Passagem;
import com.estagio.utils.ObjectUtils;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;

/**
 * @author Cristian Urbainski
 * @since 03/07/2012
 */
public class GeracaoPassagem {
    
    /**
     * Variaveis da privadas da classe
     */
    private static final String TXT_LINHA = "txtLinha";
    private static final String TXT_NUMERO = "txtNumero";
    private static final String TXT_DE = "txtDe";
    private static final String TXT_PARA = "txtPara";
    private static final String TXT_DATAVIAGEM = "txtDataViagem";
    private static final String TXT_HORARIO = "txtHorario";
    private static final String TXT_SEGURO = "txtSeguro";
    private static final String TXT_PEDAGIO = "txtPedagio";
    private static final String TXT_TAXAEMBARQUE = "txtTaxaEmbarque";
    private static final String TXT_TARIFA = "txtTarifa";
    private static final String TXT_OBSERVACAO = "txtObservacao";
    private static final String TXT_MOTIVO = "txtMotivo";
    private static final String TXT_VALORPASSAGEM = "txtValorPassagem";
    private static final String TXT_VIA = "txtVia";
    
    public static ByteArrayOutputStream  gerarPassagem(Passagem passagem) throws Exception
    {
        int numeroDeVias = 3;
        int numeroViasCriadas = 0;
        
        ByteArrayOutputStream listaPassagem = new ByteArrayOutputStream();
        
        try {
        
            while(numeroViasCriadas < numeroDeVias)
            {

                //TODO trocar caminho de carregamento do arquivo de pdf
                File f = new File("E:/Desenvolvimento/projetoEstagio/web/template/layout_passagem.pdf");
                PdfReader reader = new PdfReader(f.getCanonicalPath());

                ByteArrayOutputStream out = new ByteArrayOutputStream();
                
                PdfStamper stamper = new PdfStamper(reader, out);
                
                AcroFields form = stamper.getAcroFields();
                
                setFieldsInPassagem(form, passagem, (numeroViasCriadas + 1) + "ª Via");
                
                reader.consolidateNamedDestinations();
                stamper.setFormFlattening(Boolean.TRUE);
                stamper.setRotateContents(Boolean.TRUE);
                reader.removeFields();
                stamper.setFullCompression();
                reader.eliminateSharedStreams();
                out.flush();
                out.close();
                reader.close();
                stamper.close();

                listaPassagem.write(out.toByteArray());
                
                numeroViasCriadas++;
            }
            
            return listaPassagem;
            
        } catch (NullPointerException e) {
            System.out.println("Alguma propriedade do objeto do tipo passagem esta nula, por favor verficar.");
            e.printStackTrace();
            throw e;
        }
        catch (IOException ex) {
            System.out.println("Não foi possivel localizar o arquivo de template da passagem, por favor verificar.");
            ex.printStackTrace();
            throw ex;
        }
        catch (DocumentException doc) {
            System.out.println("Problema com documento, por favor verificar.");
            doc.printStackTrace();
            throw doc;
        }
        
    }

    private static void setFieldsInPassagem(AcroFields form, Passagem passagem, String via) throws IOException, DocumentException
    {
        form.setField(TXT_NUMERO, passagem.getIdPassagem().toString());
        form.setField(TXT_DATAVIAGEM, new SimpleDateFormat("dd/MM/yyyy").format(passagem.getDsHoraSaida()));
        form.setField(TXT_DE, passagem.getMunicipioDe().getDsMunicipio());
        form.setField(TXT_HORARIO, new SimpleDateFormat("HH:mm").format(passagem.getDsHoraSaida()));
        form.setField(TXT_LINHA, passagem.getRota().getDsRota());
        form.setField(TXT_MOTIVO, passagem.getDsMotivo());
        form.setField(TXT_OBSERVACAO, passagem.getDsObservacao());
        form.setField(TXT_PARA, passagem.getMunicipioPara().getDsMunicipio());
        form.setField(TXT_PEDAGIO, passagem.getNrPedagio().toString());
        form.setField(TXT_SEGURO, passagem.getNrSeguro().toString());
        form.setField(TXT_TARIFA, passagem.getNrTarifa().toString());
        form.setField(TXT_TAXAEMBARQUE, passagem.getNrTaxaEmbarque().toString());
        form.setField(TXT_VALORPASSAGEM, passagem.getNrValor().toString());
        form.setField(TXT_VIA, via);
    }

}
package com.estagio.teste;

import com.estagio.entidade.*;
import com.estagio.inicializa.InicializaApp;
import com.estagio.passagem.GeracaoPassagem;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import urbainskidao.UrbainskiDAO;

/**
 * @author Cristian Urbainski
 * @since 09/07/2012
 */
public class TestGeneratingPassagem {
    
    public static void main(String[] args) {
        
        UrbainskiDAO dao = new UrbainskiDAO();        
        
        try {
            
            InicializaApp.inicializa();
            
            dao.beginTras();
            
            Passagem p = new Passagem();
            
            Municipio munDe = (Municipio) dao.getSessao().createCriteria(Municipio.class)
                    .add(Restrictions.ilike("dsMunicipio", "PALMA SOLA", MatchMode.EXACT))
                    .uniqueResult();
            
            Municipio munP = (Municipio) dao.getSessao().createCriteria(Municipio.class)
                    .add(Restrictions.ilike("dsMunicipio", "FRANCISCO BELTRAO", MatchMode.EXACT))
                    .uniqueResult();
            
            p.setMunicipioDe(munDe);
            p.setMunicipioPara(munP);
            
            p.setDia((Dia) dao.getSessao().createCriteria(Dia.class).setMaxResults(1).uniqueResult());
            p.setDsMotivo("Trabalho");
            p.setDsObservacao("");
            p.setFuncionario((Funcionario) dao.getSessao().createCriteria(Funcionario.class).setMaxResults(1).uniqueResult());
            p.setIdDia(p.getDia().getIdDia());
            p.setIdFuncionario(p.getFuncionario().getIdFuncionario());
            p.setIdMunicipioDe(p.getMunicipioDe().getIdMunicipio());
            p.setIdMunicipioPara(p.getMunicipioPara().getIdMunicipio());
            p.setIdPassagem(10);
            p.setRota((Rota) dao.getSessao().createCriteria(Rota.class).setMaxResults(1).uniqueResult());
            p.setIdRota(p.getRota().getIdRota());
            p.setNrNumero(485);
            p.setNrPedagio(new BigDecimal("1.6"));
            p.setNrPoltrona(10);
            p.setNrTarifa(new BigDecimal("2.3"));
            p.setNrTaxaEmbarque(new BigDecimal("1.2"));
            p.setNrSeguro(new BigDecimal("0.8"));
            p.setNrValor(p.getNrPedagio().add(p.getNrTarifa()).add(p.getNrTaxaEmbarque()).add(p.getNrSeguro()));
            p.setDsHoraSaida(new Date());
            
            ByteArrayOutputStream out = GeracaoPassagem.gerarPassagem(p);
            
            FileOutputStream outF = new FileOutputStream(new File("C:/Users/Cristian/Desktop/testePassagem.pdf"));
            outF.write(out.toByteArray());
            
            out.flush();
            out.close();
            
            outF.flush();
            outF.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
}

Eu carrego tres vezes o pdf e jogo os bytes para dentro do mesmo ByteArrayOutputStream mas quando gravo o arquivo no disco e abro ele, ele gravou apenas a primeira passagem (1ª via ) e não as 3ª vias de passagens, alguem sabe aonde eu estou errando ?