iTextSharp - 将多个A4文档合并到双面A3小册子中

时间:2014-08-15 11:38:59

标签: c# itextsharp

我有一个4 x A4页的PDF表格。我使用iTextSharp填写字段。这一部分都很好。

然后,我需要将许多这些表单合并为一个PDF文档。计划使用这种方法:Using iTextSharp to generate multiple page PDF from existing PDF Form

然而,这些A4页需要合并成一张A3纸,打印在一本小册子中。类型配置,即正面和背面,如下面

          A3 Front    ----- turn over ---->    A3 Back
-------------------------------   -------------------------------
|              |              |   |              |              |
|              |              |   |              |              |
|              |              |   |              |              |
|     Page     |     Page     |   |     Page     |     Page     |
|       4      |      1       |   |      2       |       3      |
|              |              |   |              |              |
|              |              |   |              |              |
|              |              |   |              |              |
-------------------------------   -------------------------------

(ascii ftw)

当A3被折成两半时,它会读取(从左到右),第1页,第2页,第3页,第4页。然后,我将以这种方式组合所有已完成的表单,然后打印整个PDF A3背靠背的文件。

我发现这篇文章(http://forums.asp.net/t/1692347.aspx?Merging+two+pdf+pages+into+one+using+itextsharp)提到在页面上放置一个PdfPTable,然后抓取页面的图像,并将其嵌入表格单元格中......

如果我这样做了,PDF文件不会很大,因为它基本上都是图像?有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

想出来......按照这种方法:

using (var copyms = new MemoryStream())
{
    var document = new Document();

    using (PdfSmartCopy copy = new PdfSmartCopy(document, copyms))
    {
        document.Open();

        foreach (var item in Items)
        {
            // Read the template
            var pdfReader = new PdfReader(TemplateLocation);

            // Save the current completed template to a MemoryStream
            using (var ms = new MemoryStream())
            {
                using (PdfStamper stamper = new PdfStamper(pdfReader, ms))
                {
                    var fields = stamper.AcroFields;

                    // Set the field values here

                    stamper.FormFlattening = true;
                }

                pdfReader = new PdfReader(ms.ToArray());

                // Copy the memorystream to the main document
                copy.AddDocument(pdfReader);
            }
        }
    }

    document.CloseDocument();

    // Combine on A3 pages in new document

    var a3doc = new Document(PageSize.A3.Rotate(), 0, 0, 0, 0);

    var a3reader = new PdfReader(copyms.ToArray());
    var a3writer = PdfWriter.GetInstance(a3doc, new FileStream(outputFileLocation, FileMode.Create));

    a3doc.Open();

    var a3cb = a3writer.DirectContent;

    PdfImportedPage page;

    int totalPages = a3reader.NumberOfPages;

    for (int i = 1; i <= (int)Math.Ceiling(totalPages / 2); i++)
    {
        // Create an A3 page
        a3doc.NewPage();
        var a3size = PageSize.A3.Rotate();

        page = a3writer.GetImportedPage(a3reader, (i * 2) + 1);
        a3cb.AddTemplate(page, 0, 0);

        page = a3writer.GetImportedPage(a3reader, (i * 2) + 2);
        a3cb.AddTemplate(page, (int)(a3size.Width / 2), 0);                    
    }

    a3doc.CloseDocument();
}

所以基本上,将所有内容保存在内存中,最后使用编写器的DirectContent将A4页面粘贴到A3页面的某个位置。此外,使用PdfSmartCopy来保持文件大小较低,因为每次添加填充副本时都不会添加模板页面内容。