gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:56:55 26 4
gpt4 key购买 nike

我是第一次使用 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. 然后我为此文档创建阅读器,方法是:

    PdfReader currentPdfReader = new PdfReader(currentPdfBAIS);

    因此我阅读了该阅读器,并将该页面复制到文档中。

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

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

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

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

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

Tnx

最佳答案

您可以打开任意数量的PdfReader。您已经拥有一个带有 currentPdfReader 的页面,只需使用 new PdfReader(currentFatturaTestataBasos.toByteArray()) 打开另一个 PdfReader 并从其中一个页面添加页面并从其他到 PdfCopy

关于java - 如何将 ByteArrayOutputStream 表示的单页文档插入到另一个文档中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28676117/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com