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