8

我正在使用 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 的构造函数调用超类构造函数时,它使用一个新的 Document 对象,而不是传入的对象,所以我想这就是原因。

有没有更好的方法来解决这个问题?目前我最好的猜测是使用 PdfWriter 从图像中创建单页 Pdf,然后使用 PdfCopy 将其添加到文档中,但这似乎是一种解决方法。

4

2 回答 2

10

我最近遇到了这个问题,这里的答案实际上并没有那么有用。我的用例基本上是“获取一堆 PDF 和图像(.jpg、.png 等)并将它们全部组合成一个 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();
         }

     }
于 2014-09-30T02:08:49.770 回答
0

您可以使用以下语法将页面添加到使用 PdfCopy 创建的文档(在您的示例中命名为副本):

Rectangle rec = new Rectangle(10, 10, 10, 10);
copy.AddPage(rec, 1);
于 2020-11-22T18:56:53.237 回答