微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决处理特定页面上的表计数器

我正在使用 itext7 库。我想制作将放置在桌子顶部的桌子柜台。问题出在包含表的每个最后一页上。它绘制下一个表的编号。This is result。您可以看到 table1 在哪里结束,但 table 顶部是 2 等。

import os

filename = "17861.jpg"
path = "E:\projects\python\Yuki.py\pic saver\pictures"
fullpath = os.path.join(path,filename)

解决方法

不幸的是,由于以下原因,无法使用建议的事件处理程序:即使创建了 PdfDocument 并将 immediateFlush 设置为 true(顺便说一下,它是其默认值,以及 PageSize.A4,因此无需指定),iText 不会在下一页添加到文档的那一刻刷新页面(关闭页面并调度 END_PAGE 事件)。相反,iText 会等待再刷新一页。

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

            doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));

并且在处理这一行时调用第二页的事件(当 i 等于 2 时):

doc.add(table);

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

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

    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;
        }
    }

}

现在剩下的唯一问题是如何使用这样的处理程序。答案:

  • 在创建文档时将其添加到文档中。您不再需要删除处理程序:一切都将由唯一的处理程序完成;

  • 在向文档添加表格之前,调用 addTable 指定最后一页,并使用一些不切实际的大数字。不知道布置一张表格需要多少页,所以应该确保即使是很长的表格也能得到妥善处理;

  • 一旦添加了表,就可以指定表的正确最后一页(在地图中,旧的一对将被重写)。

         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,lastPage);
         doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
     }
     doc.close();
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。