以前書いた、iText を使用したPDF結合
http://blog.zaq.ne.jp/oboe2uran/article/1120/
これだと、ファイルに書いたものだけが対象なので、PDFを複数作りながらの一連の処理で
実行するのにファイルIOになってしまう。
そこで、ByteArrayOutputStream に出力したものを対象にするメソッドを追加する。
/**
* 結合実行(リスト指定).
* @param byteOutStreams 結合対象PDFをbyteに格納済のByteArrayOutputStreamのリスト
*/
public void join(Collection<ByteArrayOutputStream> byteOutStreams){
join(byteOutStreams.toArray(new ByteArrayOutputStream{}));
}
/**
* 結合実行(リスト配列).
* @param byteOutStreams 結合対象PDFをbyteに格納済のByteArrayOutputStreamの配列
*/
public void join(ByteArrayOutputStream byteOutStreams){
if (byteOutStreams.length < 1) return;
try{
PdfReader pdfreader = new PdfReader(byteOutStreams[0].toByteArray());
pdfreader.consolidateNamedDestinations();
Document document = new Document(pdfreader.getPageSizeWithRotation(1));
PdfCopy writer = new PdfCopy(document, out);
document.open();
for(int i=1;i <= pdfreader.getNumberOfPages();i++){
writer.addPage(writer.getImportedPage(pdfreader, i));
}
writer.freeReader(pdfreader);
for(int i=1;i < byteOutStreams.length;i++){
PdfReader reader = new PdfReader(byteOutStreams[i].toByteArray());
reader.consolidateNamedDestinations();
int pageCount = reader.getNumberOfPages();
for(int p=1;p <= pageCount;p++){
writer.addPage(writer.getImportedPage(reader, p));
}
writer.freeReader(reader);
}
document.close();
}catch(IOException | DocumentException e){
throw new RuntimeException(e.getMessage(), e);
}finally{
try{ out.close(); }catch(IOException e){}
}
}
----
net.sf.jasperreports.engine にある
JasperExportManager.exportReportToPdfStream(JasperPrint jasperPrint, OutputStream outputStream)
で、ByteArrayOutputStream に結合したいだけ出力してからこのメソッドを呼べばよい。