如何将由 ByteArrayOutputStream 表示的单页文档插入到另一个文档中?
How can I insert a single page document represented by an ByteArrayOutputStream into another document?
我是第一次使用 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();
}
}
如您所见,我是通过以下方式完成此任务的:
我遍历 listaFatture 集合中的所有文档,并从 Blob[=49= 开始构建相关的 PDF 文档] 对象:
Blob currentPdfBlob = listaFatture.get(i).getPdf();
然后我为该文档创建 reader,方法是:
PdfReader currentPdfReader = new PdfReader(currentPdfBAIS);
所以我读了这个 reader 然后我复制了文档中的页面。
好的,它工作正常。问题是,在每个文档之前,我必须插入一个特殊页面,该页面是从 stampaTestataFatturaPdf() 方法生成的 return a ByteArrayOutputStream 表示单页文档。
所以我在复制当前 PDF 页面之前插入了这一行:
ByteArrayOutputStream currentFatturaTestataBasos = stampaTestataFatturaPdf(listaFatture.get(i));
但我不知道如何将 currentFatturaTestataBasos 表示的页面插入到我正在生成的文档中。
你能给我一些帮助和建议吗?
Tnx
您可以打开任意数量的 PdfReader
。您已经有一个 currentPdfReader
,只需打开另一个 PdfReader
new PdfReader(currentFatturaTestataBasos.toByteArray())
,然后将一个页面和另一个页面添加到 PdfCopy
.
我是第一次使用 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();
}
}
如您所见,我是通过以下方式完成此任务的:
我遍历 listaFatture 集合中的所有文档,并从 Blob[=49= 开始构建相关的 PDF 文档] 对象:
Blob currentPdfBlob = listaFatture.get(i).getPdf();
然后我为该文档创建 reader,方法是:
PdfReader currentPdfReader = new PdfReader(currentPdfBAIS);
所以我读了这个 reader 然后我复制了文档中的页面。
好的,它工作正常。问题是,在每个文档之前,我必须插入一个特殊页面,该页面是从 stampaTestataFatturaPdf() 方法生成的 return a ByteArrayOutputStream 表示单页文档。
所以我在复制当前 PDF 页面之前插入了这一行:
ByteArrayOutputStream currentFatturaTestataBasos = stampaTestataFatturaPdf(listaFatture.get(i));
但我不知道如何将 currentFatturaTestataBasos 表示的页面插入到我正在生成的文档中。
你能给我一些帮助和建议吗?
Tnx
您可以打开任意数量的 PdfReader
。您已经有一个 currentPdfReader
,只需打开另一个 PdfReader
new PdfReader(currentFatturaTestataBasos.toByteArray())
,然后将一个页面和另一个页面添加到 PdfCopy
.