C# 特定页面上的处理表计数器

C# 特定页面上的处理表计数器,c#,itext7,C#,Itext7,我在itext7图书馆工作。我想做一个放在桌子上面的柜台。问题出现在包含表的每一页上。它绘制下一个表的编号。。您可以看到表1结束的位置,但表的顶部是2,以此类推 public class TabPageHandler : IEventHandler { public string number { get; set; } public TabPageHandler(string number) { this.number = number; }

我在itext7图书馆工作。我想做一个放在桌子上面的柜台。问题出现在包含表的每一页上。它绘制下一个表的编号。。您可以看到表1结束的位置,但表的顶部是2,以此类推

public class TabPageHandler : IEventHandler
{
    public string number { get; set; }
    public TabPageHandler(string number)
    {
        this.number = number;
    }


    public void HandleEvent(Event @event)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
        PdfDocument pdfDoc = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        int pageNumber = pdfDoc.GetPageNumber(page);

        PdfCanvas canvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc);

        canvas.BeginText().MoveText(page.GetPageSize().GetWidth() / 2, page.GetPageSize().GetTop() - 35)
            .SetFontAndSize(PdfFontFactory.CreateFont(FontConstants.TIMES_ROMAN), 10)
            .ShowText("Number of page " + pageNumber)
            .EndText();

        canvas.BeginText().MoveText(20, page.GetPageSize().GetTop() - 20)
            .SetFontAndSize(PdfFontFactory.CreateFont(FontConstants.TIMES_ROMAN), 10)
            .ShowText("Table:" + number)
            .EndText();

        canvas.Release();
    }
}

public static void Main()
    {
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
        Document doc = new Document(pdfDoc, PageSize.A4, true);
        for (int i = 1; i < 5; i++)
        {
            pdfDoc.RemoveAllHandlers();
            pdfDoc.AddEventHandler(PdfDocumentEvent.END_PAGE, new TabPageHandler(i.ToString()));
            Table table = new Table(UnitValue.CreatePercentArray(1)).UseAllAvailableWidth();
            table.AddHeaderCell(new Paragraph(i.ToString()));
            for (int j = 0; j < 40 * i; j++)
            {
                table.AddCell(new Paragraph("aaa"));
            }
            doc.Add(table);
            doc.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
        }
        doc.Close();
    }
公共类TabPageHandler:IEventHandler
{
公共字符串编号{get;set;}
公共TabPageHandler(字符串编号)
{
这个数字=数字;
}
公共无效HandleEvent(事件@事件)
{
PdfDocumentEvent docEvent=(PdfDocumentEvent)@event;
PdfDocument pdfDoc=docEvent.GetDocument();
PdfPage page=docEvent.GetPage();
int pageNumber=pdfDoc.GetPageNumber(第页);
PdfCanvas canvas=newpdfcanvas(page.NewContentStreamBefore(),page.GetResources(),pdfDoc);
canvas.BeginText().MoveText(page.GetPageSize().GetWidth()/2,page.GetPageSize().GetTop()-35)
.SetFontAndSize(PdfFontFactory.CreateFont(FontConstants.TIMES_ROMAN),10)
.ShowText(“页码”+页码)
.EndText();
canvas.BeginText().MoveText(20,page.GetPageSize().GetTop()-20)
.SetFontAndSize(PdfFontFactory.CreateFont(FontConstants.TIMES_ROMAN),10)
.ShowText(“表格:+编号)
.EndText();
canvas.Release();
}
}
公共静态void Main()
{
PdfDocument pdfDoc=新PdfDocument(新PdfWriter(DEST));
文档文档=新文档(pdfDoc,PageSize.A4,true);
对于(int i=1;i<5;i++)
{
pdfDoc.RemoveAllHandlers();
pdfDoc.AddEventHandler(PdfDocumentEvent.END_页面,新的TabPageHandler(i.ToString());
Table Table=新表(UnitValue.CreatePercentArray(1)).UseAllAvailableWidth();
表.AddHeaderCell(新的段落(i.ToString());
对于(int j=0;j<40*i;j++)
{
表2.AddCell(新段落(“aaa”);
}
单据新增(表);
添加文档(新AreaBreak(AreaBreakType.NEXT_PAGE));
}
doc.Close();
}

不幸的是,由于以下原因,无法使用建议的事件处理程序:尽管创建
PdfDocument
时将
immediateFlush
设置为
true
(顺便说一句,它是它的默认值,也是PageSize.A4,因此无需指定),但iText不会刷新页面(在文档中添加下一个页面时立即关闭页面并发送
END\u page
事件)。相反,iText会等待刷新另一个页面

因此,在处理此行时调用第一页的事件:

            doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
处理此行时调用第二页的事件(当i等于2时):

我建议重写事件处理程序。例如,为什么不在处理程序中有一个映射,其中key表示表出现的第一页和值—表的编号和它出现的最后一页。然后在处理程序的级别上,可以只执行以下操作:无论何时调度事件,都应该搜索thr通过地图查找a)页面上是否有要刷新的表格;b) 如果是,是哪张表

下面的处理程序对此负责(请注意,代码段是用Java编写的,但我相信在移植到.NET时应该没有问题):

看看这个答案:
doc.add(table);
    public class TabPageHandler implements IEventHandler {

    private Map<Integer, PageSpan> tables;

    public TabPageHandler() {
        this.tables = new HashMap<Integer, PageSpan>();
    }

    public void addTable(int table, int firstPage, int lastPage) {
        tables.put(firstPage, new PageSpan(table, lastPage));
    }

    int getTable(int page) {
        int firstPage = 0;
        for (int i = page; i > 0; i--) {
            if (null != tables.get(i)) {
                firstPage = i;
                break;
            }
        }
        if (0 == firstPage || tables.get(firstPage).getLastPage() < page) {
            // no table on such a page
            return -1;
        } else {
            return tables.get(firstPage).getTableNum();
        }
    }

    @Override
    public void handleEvent(Event event) {
        try {
            PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
            PdfDocument pdfDoc = docEvent.getDocument();
            PdfPage page = docEvent.getPage();
            int pageNumber = pdfDoc.getPageNumber(page);

            PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);

            canvas.beginText().moveText(page.getPageSize().getWidth() / 2, page.getPageSize().getTop() - 35)
                    .setFontAndSize(PdfFontFactory.createFont(FontConstants.TIMES_ROMAN), 10)
                    .showText("Number of page " + pageNumber)
                    .endText();

            int table = getTable(pageNumber);
            if (-1 != table) {
                canvas.beginText().moveText(20, page.getPageSize().getTop() - 20)
                        .setFontAndSize(PdfFontFactory.createFont(FontConstants.TIMES_ROMAN), 10)
                        .showText("Table:" + table)
                        .endText();
            }

            canvas.release();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    class PageSpan {
        private int tableNum;
        private int lastPage;

        public PageSpan(int tableNum, int lastPage) {
            this.tableNum = tableNum;
            this.lastPage = lastPage;
        }

        public int getTableNum() {
            return tableNum;
        }

        public int getLastPage() {
            return lastPage;
        }
    }

}
     PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
 Document doc = new Document(pdfDoc);
 TabPageHandler handler = new TabPageHandler();
 pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, handler);
 for (int i = 1; i < 5; i++) {
     int firstPage = Math.max(1, doc.getPdfDocument().getNumberOfPages());
     Table table = new Table(UnitValue.createPercentArray(1)).useAllAvailableWidth();
     table.addHeaderCell(new Paragraph(i + ""));
     for (int j = 0; j < 40 * i; j++) {
         table.addCell(new Paragraph("aaa"));
     }
     handler.addTable(i, firstPage, 10000000);
     doc.add(table);
     int lastPage = doc.getPdfDocument().getNumberOfPages();
     handler.addTable(i, firstPage, lastPage);
     doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
 }
 doc.close();