iTextSharp -将多个A4文档组合成双面A3小册子

本文关键字:A3 小册子 组合 文档 A4 iTextSharp | 更新日期: 2023-09-27 18:18:12

我有一个4 x A4页的PDF表单。我使用iTextSharp完成字段。这部分都没问题。

然后我需要将这些表单组合成一个PDF文档。计划使用这种方法:使用iTextSharp从现有的PDF表单生成多页PDF。

然而,这些A4页需要合并成一个A3页,以"小册子"类型的配置打印,即像下面的正反两面

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

(ascii增值)

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

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

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

iTextSharp -将多个A4文档组合成双面A3小册子

明白了…遵循以下方法:

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来保持文件大小较低,因为每次添加填充副本时都不会添加模板页面内容。