当前位置: 首页 > 知识库问答 >
问题:

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

包阳成
2023-03-14

我是第一次使用iText,我有这个问题。

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

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();

    }

}

正如你所看到的,为了完成这个任务,我是以以下方式完成的:

>

  • 迭代listaFatture集合中的所有文档,并从Blob对象开始构建相关的PDF文档:

    Blob currentPdfBlob = listaFatture.get(i).getPdf();
    

    然后通过以下方式创建此文档的阅读器:

    PdfReader currentPdfReader = new PdfReader(currentPdfBAIS);
    

    所以我阅读这个阅读器,然后复制文档中的页面。

    好的,很好用。问题是,在每个文档之前,我必须插入一个特殊的页面,该页面是由stampaTestataFatturaPdf()方法生成的,该方法返回一个表示单个页面文档的ByteArrayOutputStream。

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

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

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

    TNX

  • 共有1个答案

    怀宇
    2023-03-14

    您可以打开任何数量的PDFReader。您已经有一个带有CurrentPDFReader的PdfReader了,只需用新PdfReader(CurrentFatturateStatabasos.TobyteArray())打开另一个PdfReader并将一个页和另一个页添加到PDFCopy中。

     类似资料:
    • 假设我有两份文件。 一个是有大约2-3页的主模板。第二个只有一段文字与各种风格(粗体,斜体,下划线,字体大小等)。 我想用第二个文档中的段落替换模板中的一个参数。 null

    • 喂 我有一个文档,看起来像这样: 我尝试使用$push添加另一个街道文档,它错误地出现: pymongo.errors。WriteError:字段“地址”必须是数组,但在文档{_id:ObjectId('6049e88657e43d8801197c72')}中属于object类型 我正在使用的代码: 没有制作地址簿或任何东西,只是编辑它,这样它对没有上下文的人来说更有意义。 我想要的输出是文档如下

    • 问题内容: 将节点从一个文档复制到另一个文档时遇到问题。我已经使用了Node中的acceptNode和importNode方法,但是它们不起作用。我也尝试了appendChild,但是抛出了异常。我正在使用Xerces。那里没有实现吗?还有另一种方法吗? 问题答案: 问题在于,节点的上下文包含许多内部状态,其中包括其父项和拥有它们的文档。无论是也将目标文档,这就是为什么你的代码是没有的新节点的任何

    • 我正在尝试将多个pdf页面合并为一个pdf页面。有很多iText的例子展示了如何将pdf页面合并到一个文件中,但是我需要所有的页面都放在一个页面中(一路上缩小它们的宽度和高度) 编辑:尝试从这里这个代码,但它只是合并成一个文件的pdf页面,我需要他们收缩成一个单一的页面

    • 我已经很多年没有使用VB了,所以如果这是显而易见的,请原谅我。我正在尝试编写一个word vba宏,以便在模板中使用,该模板将显示一个userform,然后导入fileA的内容。docx,fileB。docx或fileC。docx取决于用户表单。(之后我将使用书签填写一些表单数据,我不知道这是否相关)。文件A、B和C将包含一些基本格式(如列表)的文本,但没有什么特别之处。 我在网上看到的解决方案可

    • 目前,我只能阅读一个excel文档,并用我得到的代码编写相同的文档。现在我想读取多个excel文档并将数据写入其中。现在我得到了一个清晰的代码,这样做到一个文档,但这不是我想要的。我理解我目前得到的代码的结构,所以我更喜欢继续使用它。如何使用函数和函数来实现这一点? 这是我到目前为止所拥有的: 不是很好的编码...但它有效...