我正在使用iText(特别是iTextSharp 4.1.6),我想通过合并现有PDF的页面来创建PDF,还要插入从图像创建的新页面。
我分别使用PdfCopy和PdfWriter使这两部分分别工作。从图像创建页面的代码如下所示:
PdfWriter pw = PdfWriter.GetInstance(doc, outputStream);
Image img = Image.GetInstance(inputStream);
doc.Add(img);
doc.NewPage();
现在,由于PdfCopy继承自PdfWriter,所以我认为我可以使用相同的技术将此类“图像页面”添加到我的PdfCopy对象中,但是它不起作用(如果在上述示例中实例化了PdfCopy而不是PdfWriter, ,页面上什么也没有出现)。
快速浏览一下源代码,我注意到当PdfCopy的构造函数调用父类(super class)构造函数时,它是使用一个新的Document对象而不是传入的对象来进行的,所以我想这就是原因。
有更好的方法来解决这个问题吗?目前,我最好的猜测是使用PdfWriter从图像创建单个页面Pdf,然后使用PdfCopy将其添加到文档中,但这似乎是一种解决方法。
最佳答案
我最近遇到了这个问题,这里的答案实际上没什么帮助。我的用例基本上是“获取一堆PDF和图像(.jpg,.png等)并将它们全部合并为1个PDF”。我必须使用PdfCopy,因为它保留了诸如表单字段和标签之类的东西,而PdfWriter却没有。
基本上,由于PdfCopy不允许您使用addPage()创建新页面,因此必须在内存中创建带有页面图像的新PDF,然后使用PdfCopy从该PDF中复制页面。
例如:
Document pdfDocument = new Document();
ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream();
PdfCopy copy = new PdfCopy(pdfDocument, pdfOutputStream);
pdfDocument.open();
for (File file : allFiles) {
if (/* file is PDF */) {
/* Copy all the pages in the PDF file into the new PDF */
PdfReader reader = new PdfReader(file.getAllBytes());
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
copy.addPage(copy.getImportedPage(reader, i);
}
} else {
/* File is image. Create a new PDF in memory, write the image to its first page, and then use PdfCopy to copy that first page back into the main PDF */
Document imageDocument = new Document();
ByteArrayOutputStream imageDocumentOutputStream = new ByteArrayOutputStream();
PdfWriter imageDocumentWriter = PdfWriter.getInstance(imageDocument, imageDocumentOutputStream);
imageDocument.open();
if (imageDocument.newPage()) {
image = Image.getInstance(file.getAllBytes());
if (!imageDocument.add(image)) {
throw new Exception("Unable to add image to page!");
}
imageDocument.close();
imageDocumentWriter.close();
PdfReader imageDocumentReader = new PdfReader(imageDocumentOutputStream.toByteArray());
copy.addPage(copy.getImportedPage(imageDocumentReader, 1));
imageDocumentReader.close();
}
}
关于pdf - iText-如何在使用PdfCopy创建的文档中添加页面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13987341/