読者です 読者をやめる 読者になる 読者になる

PDF結合のメソッド追加

以前書いた、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 に結合したいだけ出力してからこのメソッドを呼べばよい。