如何解决处理特定页面上的表计数器
我正在使用 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 举报,一经查实,本站将立刻删除。