如何将ByteArrayOutputStream表示的单页文档插入另一个文档?

时间:2015-02-23 14:32:57

标签: java pdf pdf-generation itext

我第一次使用iText时遇到了这个问题。

我创建了这个 stampaFattureMultiple()方法,该方法连接了在 ArrayList listaFatture 集合中检索到的一些PDF文档。如您所见,PDF文档存储在 listaFatture.get(i).getPdf()表示的 Blob 字段中。好的,这工作正常,PDF文档正确连接。

public void stampaFattureMultiple(ArrayList<Fattura> listaFatture) {

    ByteArrayOutputStream docPDF = null;
    ByteArrayOutputStream currentPdfBAOS = null;

    InputStream blobinstream = null;

    /** The resulting PDF file: */
    String result = "D:/XYZ/fatture-concatenate.pdf";

    // STEP 1 Creazione del documento in formato A4 e senza margini:
    com.itextpdf.text.Document document = new com.itextpdf.text.Document(com.itextpdf.text.PageSize.A4, 0, 0, 0, 0);

    try {
        // STEP 2: Make copies of PDF documents. Documents can be edited after reading and before writing them out
        //PdfCopy copy = new PdfCopy(document, pdfResult);
        docPDF = new ByteArrayOutputStream();
        //PdfCopy copy = new PdfCopy(document, docPDF);

        PdfCopy copy = new PdfCopy(document, new FileOutputStream(result));



        // STEP 3:
        document.open();

        // Concatena tutti i PDF delle fatture reperite:
        for (int i = 0; i < listaFatture.size(); i++) {

            // Obtain the current Blob object representing the PDF:
            Blob currentPdfBlob = listaFatture.get(i).getPdf();

            // Put the current PDF Blob content into the current ByteArrayOutputStream:
            if(currentPdfBlob!=null){
                blobinstream = currentPdfBlob.getBinaryStream();

                int chunk = 1024;
                byte[] buffer = new byte[chunk];
                int length = -1;


                currentPdfBAOS = new ByteArrayOutputStream();

                while ((length = blobinstream.read(buffer)) != -1) {
                    currentPdfBAOS.write(buffer, 0, length);
                }
                currentPdfBAOS.flush();
            }

            ByteArrayOutputStream currentFatturaTestataBasos = stampaTestataFatturaPdf(listaFatture.get(i));

            //document.newPage();


            // STEP 4: reader for the i document:
            ByteArrayInputStream currentPdfBAIS = new ByteArrayInputStream(currentPdfBAOS.toByteArray());
            PdfReader currentPdfReader = new PdfReader(currentPdfBAIS);

            PdfImportedPage page;
            PdfCopy.PageStamp stamp;

            for (int currentPageIndex = 0; currentPageIndex < currentPdfReader.getNumberOfPages(); ) {

                page = copy.getImportedPage(currentPdfReader, ++currentPageIndex);
                copy.addPage(page);
            }



        }

    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        document.close();

    }

}

正如你所看到的那样,我按照以下方式完成了这项任务:

  1. 我迭代 listaFatture 集合中的所有文档,然后从 Blob 对象开始构建相关的PDF文档:

    Blob currentPdfBlob = listaFatture.get(i).getPdf();
    
  2. 然后我通过以下方式为此documnt创建读者

    PdfReader currentPdfReader = new PdfReader(currentPdfBAIS);
    

    所以我读了这个阅读器,然后将文件复制到文档中。

  3. 好的,它运作正常。问题是在每个文档之前我必须插入一个特殊页面,该页面是从 stampaTestataFatturaPdf()方法生成的,该方法返回 ByteArrayOutputStream 表示单页文档。

    所以我在复制当前PDF页面之前插入了这一行:

    ByteArrayOutputStream currentFatturaTestataBasos = stampaTestataFatturaPdf(listaFatture.get(i));
    

    但我不知道如何在我生成的文档中插入由 currentFatturaTestataBasos 表示的页面。

    你能给我一些帮助和一些建议吗?

    TNX

1 个答案:

答案 0 :(得分:2)

您可以打开任意数量的PdfReader。您已经拥有currentPdfReader的用户,只需使用PdfReader打开另一个new PdfReader(currentFatturaTestataBasos.toByteArray()),然后将一个页面和另一个页面添加到PdfCopy