【发布时间】:2014-02-01 08:35:11
【问题描述】:
我有两个 PDF 文件,每个文件都在 ByteArrayOutputStream 中。我想合并这两个 PDF,我想使用 iText,但我不明白如何制作它,因为它只使用 InputStream。谁能帮帮我?
【问题讨论】:
我有两个 PDF 文件,每个文件都在 ByteArrayOutputStream 中。我想合并这两个 PDF,我想使用 iText,但我不明白如何制作它,因为它只使用 InputStream。谁能帮帮我?
【问题讨论】:
ByteArrayOutputStream 对象有一个返回byte[] 的toByteArray() 方法。 PdfReader 类有一个 constructor,它接受一个 byte[] 作为参数。拥有两个文件的 PdfReader 实例后,您可以将这些实例与 PdfCopy 或 PdfSmartCopy 一起使用来合并文件。使用Concatenate 示例获取灵感。
【讨论】:
这是一个简单的代码 sn-p 除了@Lowagie 的答案。此函数读取输入 pdf 并写入 ByteArrayOutputStream 并在另一个 ByteArrayOutputStream 中创建第二个 Pdf。完成两个 Pdf 后,它会通过调用它们的 toByteArray() 来使用两个流中的 byte[],并使用它来创建新的 PdfReader。
private void mergeTwoPdf() {
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
PdfWriter pdfWriter = new PdfWriter(os);
PdfReader pdfReader = new PdfReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get("/tmp/input.pdf"))));
PdfDocument pdf = new PdfDocument(pdfReader, pdfWriter);
// ... some process on pdf
pdf.close();
//Preparing to create final merged pdf
PdfWriter resultWriter = new PdfWriter("/tmp/output.pdf");
PdfDocument resultPdfDoc = new PdfDocument(resultWriter);
// Create new PdfReader & PdfDocument from OutputStream of first pdf
PdfReader reader = new PdfReader(new ByteArrayInputStream(os.toByteArray()));
PdfDocument pdfDoc1 = new PdfDocument(reader);
// Copy pages of first PdfDocument to Final PdfDocument
pdfDoc1.copyPagesTo(1, pdfDoc1.getNumberOfPages(), resultPdfDoc);
// Preparing to create Second PdfDocument in memory stream.
ByteArrayOutputStream os2 = new ByteArrayOutputStream();
PdfWriter writer2 = new PdfWriter(os2);
PdfDocument pdfDoc2 = new PdfDocument(writer2);
// Some dummy operation on second Pdf
Document document = new Document(pdfDoc2, new PageSize(pdfDoc1.getFirstPage().getPageSizeWithRotation()));
document.add(new Paragraph("This is a demo text"));
document.close();
// Create new PdfReader & PdfDocument from OutputStream of second PdfDocument
PdfReader reader2 = new PdfReader(new ByteArrayInputStream(os2.toByteArray()));
PdfDocument toAttach = new PdfDocument(reader2);
// Copy pages of second PdfDocument to Final PdfDocument
toAttach.copyPagesTo(1, toAttach.getNumberOfPages(), resultPdfDoc);
resultPdfDoc.close();
pdfDoc1.close();
toAttach.close();
} catch (Exception e) {
e.printStackTrace();
}
}
【讨论】: