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.)
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;
}