首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用iTextSharp将四个“季度页”合并成一个完整的页面?

如何使用iTextSharp将四个“季度页”合并成一个完整的页面?
EN

Stack Overflow用户
提问于 2016-03-12 15:22:00
回答 1查看 280关注 0票数 2

我想在一个PDF页面上创建四个重复的“模板”。每个季度页面中的“静态”信息将是相同的,但是每个季度都会有不同的内容。您可以将其视为登录表单或其他类型的四个“副本”,但通过编程添加条目,如:

代码语言:javascript
复制
Real name: B. Clay Shannon
User name: Radicalia
Password: thatDarnedKatzenjammer
Email address: clay@pigeon.com

Real name: Albert L.B. Kollenborn
User name: Grandpa
Password: caseyJonesBigBrother1907
Email address: princealbertinacan@balpeenhammer.org

(右边还有两个)

我有创建文档的代码,并添加了如下段落:

代码语言:javascript
复制
using (var ms = new MemoryStream())
{
    using (var doc = new Document(PageSize.A4, 25, 25, 25, 25))
    {
        using (var writer = PdfWriter.GetInstance(doc, ms))
        {
            doc.Open();

            Paragraph realName = new Paragraph("Real name:", 
times16BoldCyan);
            doc.Add(realName);
            . . .

这类东西适用于“普通”页面,但是在上面描述的场景中(一页填充了四个四分之一页),我应该如何处理呢?如果是这样的话:

代码语言:javascript
复制
    using (var msNorthWestQuadrant = new MemoryStream())
    {
        using (var docNorthWestQuadrant = new Document(PageSize.A4, 6.25, 
6.25, 6.25, 6.25))
        {
            using (var writer = PdfWriter.GetInstance(docNorthWestQuadrant, 
            msNorthWestQuadrant))
            {
                docNorthWestQuadrant.Open();

                Paragraph realName = new Paragraph("Real name:", 
times16BoldCyan);
                docNorthWestQuadrant.Add(realName);
                . . .

        using (var msNorthEastQuadrant = new MemoryStream())
        {
            using (var docNorthEastQuadrant = new Document(PageSize.A4, 
12.5, 12.5, 6.25, 6.25))
            {
                using (var writer = 
PdfWriter.GetInstance(docNorthEastQuadrant, msNorthEastQuadrant))
                {
                    docNorthEastQuadrant.Open();

                    Paragraph realName = new Paragraph("Real name:", 
times16BoldCyan);
                    docNorthEastQuadrant.Add(realName);
                    . . .

(等等)-还有SouthEastQuadrant和SouthEastQuadrant?)

...or,这是错误的方法吗?如果是的话,我所需要的PageSize位置/大小的精确值是什么(上面的“1.25s”只是一个粗略的猜测)。

更新

或者,我需要一个“主”doc对象,然后需要四个"sub“doc对象,它们像这样添加到主程序中(伪代码):

代码语言:javascript
复制
using (var doc = new Document(PageSize.A4, 25, 25, 25, 25))

using (var docNorthwest = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
. . .
docNorthwest.Add(par);
doc.Add(docNorthwest);
. . .
using (var docSouthwest = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
docSouthwest.Add(par2);
doc.Add(docSouthwest);
. . .
using (var docSoutheast = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
docSoutheast.Add(par3);
doc.Add(docSoutheast);
. . .
using (var docNortheast = new Document(PageSize.A4, 6.25, 6.25, 6.25, 6.25))
docNortheast.Add(par2);
doc.Add(docNortheast);
. . .
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-13 00:51:42

根据上面的描述,实现目标的一个简单方法是:

  1. 创建一个内存中的Document
  2. 将重复内容放在Document的单独页面上
  3. 使用Document将单个页面从原始PdfPTable转储到新的PdfPTable中。

首先,上面步骤1-2的一些测试数据:

代码语言:javascript
复制
byte[] GetMasterDocument(int count)
{
    using (var stream = new MemoryStream())
    {
        using (var document = new Document())
        {
            PdfWriter.GetInstance(document, stream);
            document.Open();
            for (int i = 1; i <= count; ++i)
            {
                document.Add(new Paragraph(string.Format(
@"Real name: real-name-{0:D4}
User name: user-name-{0:D4}
Password: password-{0:D4}
Email address: email-{0:D4}@invalid.com",
                 i)));
                if (i < count) document.NewPage();
            }
        }
        return stream.ToArray();
    }
}

将重复内容转储到输出文件中:

代码语言:javascript
复制
PdfReader reader = new PdfReader(GetMasterDocument(38));
Rectangle pageSize = reader.GetPageSize(1);
using (FileStream stream = new FileStream(
    outputFile,
    FileMode.Create,
    FileAccess.Write))
{
    using (Document document = new Document(pageSize, 0, 0, 0, 0))
    {
        PdfWriter writer = PdfWriter.GetInstance(document, stream);
        document.Open();
        PdfPTable table = new PdfPTable(2);
        table.TotalWidth = pageSize.Width;
        table.LockedWidth = true;
        table.DefaultCell.Border = Rectangle.NO_BORDER;
        table.DefaultCell.FixedHeight = pageSize.Height / 2;

        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            PdfImportedPage page = writer.GetImportedPage(reader, i);
            table.AddCell(Image.GetInstance(page));
        }
        document.Add(table);
    }
}

如果重复的内容像上面那样小,并且有太多的空空间,那么(页面被缩放以适应PdfPCell)在GetMasterDocument()中设置一个较小的页面大小。PageSize.A6很好地处理了上面的示例数据:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35959487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档