【问题标题】:iTextSharp - Combining multiple A4 documents into double-sided A3 bookletiTextSharp - 将多个 A4 文档组合成双面 A3 小册子
【发布时间】:2014-08-15 11:38:59
【问题描述】:

我有一个 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 文件会不会很大,因为它基本上充满了图像?有没有更好的方法来实现这一点?

【问题讨论】:

  • 只需阅读 iText in action 第 6 章中关于 N-Up 的部分。似乎这可能是答案。

标签: c# itextsharp


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

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2020-07-09
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多