Ireport gerar pdf com lista java web

Boa tarde pessoal, estou desenvolvendo um sistema de Ordem de serviço consegui com ireport gerar um pdf tranquilo de uma ordem de serviço através do id da OS, agora estou precisando imprimir uma lista de Ordem de serviço onde o usuário irá selecionar em uma página anterior vários checkbox, até a próxima página onde recebo os dados consegui fazer receber a lista dos checkbox selecionados mas não estou conseguindo fazer o ireport gerar as páginas em pdf referente ao checkbox selecionados, segue o código do sistema.

nesse primeiro consigo imprimir a lista de ids selecionados nos checkbox na página anterior

int quantasosSelecionadas=0;
String [] osSelecionadas = request.getParameterValues("idOS");
String listaOsSelecionadas = "";
	if(osSelecionadas != null){
		
		quantasosSelecionadas = osSelecionadas.length;
		
			for(int i=0;i<quantasosSelecionadas; i++){
			listaOsSelecionadas+=osSelecionadas[i];
			}
			out.println(listaOsSelecionadas);
			
	}

nesse código onde gero o pdf mas nesse caso ele gera apenas uma página em pdf eu preciso que ele imprima a lista de páginas através da minha lista

        Map<String,Object> parameter = new HashMap<String,Object>();
        String valor = request.getParameter("idOS");
        parameter.put("idOS",new String(valor));
        File reportFile = new File(application.getRealPath("//relatorios//OsCliente.jasper"));
        byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(),parameter, con);
        
        response.setContentType("application/pdf");

        response.setContentLength(bytes.length);

        ServletOutputStream ouputStream = response.getOutputStream();

        ouputStream.write(bytes, 0, bytes.length); /*Limpiamos y cerramos flujos de salida*/

        ouputStream.flush();

        ouputStream.close();

Da pra fazer dessa maneira:

		List<byte[]> listaDePdf = new ArrayList<byte[]>();
		
		List<InputStream> list = new ArrayList<InputStream>();
		for (byte[] bs : listaDePdf) {
			list.add(new ByteArrayInputStream(bs));
		}
		
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, out);
        
        document.open();
        
        PdfContentByte cb = writer.getDirectContent();
        
        for (InputStream in : list) {
            PdfReader reader = new PdfReader(in);
            
            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                document.newPage();
               
                PdfImportedPage page = writer.getImportedPage(reader, i);
                cb.addTemplate(page, 0, 0);
            }
        }
     
        out.flush();
        document.close();
        out.close();
        
        return out.toByteArray();

API utilizada:

iText

obrigado pela ajuda amigo, mas no caso eu estou utilizando o jasperreport até tentei mas não consigui adptar o codigo pelo seu.

deixa eu me expressar melhor como funciona o sistema

eu tenho uma página anterior que lista varias Ordem de serviço em aberto o usuário irá selecionar quais Ordem de serviço deseja imprimir e o sistema terá que imprimir as Ordem de serviço em sequência no meu arquivo em pdf eu consegui fazer se selecionar apenas uma Ordem de serviço e sair uma página apenas em pdf as varias páginas eu não consigui.

Boa tarde!

Carregue uma lista com as OS selecionadas, e use:

JasperPrint jasperPrint = JasperFillManager.fillReport(report, parametros, new JRBeanCollectionDataSource(suaLista));

No relatório, crie os fields com os nomes iguais da sua classe Java, e os adicione no “detail” do relatorio.

Não seria isso?

public static byte[] gerarOS(OS os) throws Exception {
		// Esse seria seu metodo que gera somente uma OS
	}
	
	public static byte[] gerarOS(List<OS> listaDeOS) throws Exception {
		List<byte[]> listaDePdf = new ArrayList<byte[]>();
		
		for (OS os : listaDeOS) {		
			// Chamando o seu metodo que so gera 1 PDF
			byte[] pdf = gerarOS(os);
			listaDePdf.add(pdf);
		}
		
		List<InputStream> list = new ArrayList<InputStream>();
		for (byte[] bs : listaDePdf) {
			list.add(new ByteArrayInputStream(bs));
		}
		
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, out);
        
        document.open();
        
        PdfContentByte cb = writer.getDirectContent();
        
        for (InputStream in : list) {
            PdfReader reader = new PdfReader(in);
            
            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                document.newPage();
               
                PdfImportedPage page = writer.getImportedPage(reader, i);
                cb.addTemplate(page, 0, 0);
            }
        }
     
        out.flush();
        document.close();
        out.close();
        
        return out.toByteArray();
	}

Você pode fazer as melhorias necessárias.