使用OnGenericTag在PdfPCell中绘制一条线

我正在创建一个新的线程,开始于在Itext中的当前位置绘制一条线 。 我已经确定没有触发onGenericTag方法。 我首先建立事件助手:

writer=PdfWriter.getInstance(document,new FileOutputStream(filePath.getText())); writer.setPageEvent(new EventHelper(document)); document.open(); 

这是整个助手类:

 private class EventHelper extends PdfPageEventHelper { private Phrase footer=new Phrase(); private Document document=null; private Chunk copyright=new Chunk("Copyright 2017 (all rights reserved)"); private String pageNum=" Page "; Font copyrightFont = new Font(FontFamily.TIMES_ROMAN, 10.f, Font.NORMAL, BaseColor.LIGHT_GRAY); Font pageFont=new Font(FontFamily.TIMES_ROMAN, 10.f, Font.NORMAL, BaseColor.BLACK); public EventHelper(Document document_) { super(); document=document_; } @Override public void onStartPage(PdfWriter writer_,Document document_) { writer_.addPageDictEntry(PdfName.ROTATE,PdfPage.LANDSCAPE); } @Override public void onEndPage(PdfWriter writer_,Document document_) { PdfContentByte cb = writer_.getDirectContent(); footer.clear(); footer.setFont(copyrightFont); footer.add(copyright); footer.setFont(pageFont); footer.add(new Chunk(pageNum+Integer.toString(writer_.getPageNumber()))); ColumnText.showTextAligned(cb, Element.ALIGN_LEFT,footer,document.left(),document.bottom(),0); } @Override public void onGenericTag(PdfWriter writer_, Document document_, Rectangle rectangle_, String tag_) { PdfContentByte canvas = writer_.getDirectContent(); canvas.saveState(); Monitor mon=Configuration.getInstance().getMonitor(tag_); canvas.setColorStroke(new BaseColor(mon.getColor().getRGB())); Float center=(rectangle_.getTop()-rectangle_.getBottom())/2.f; System.out.println("leftX="+Float.toString(rectangle_.getLeft())+" rightX="+Float.toString(rectangle_.getRight())+" centerY="+Float.toString(center)); canvas.moveTo(rectangle_.getLeft(),center); canvas.lineTo(rectangle_.getRight(),center); canvas.stroke(); canvas.restoreState(); } } 

onStartPage和onEndPage按预期工作。 创建表格单元格的代码是:

 String[] monitorIds=Configuration.getInstance().getMonitorIds(); PdfPTable leg=new PdfPTable(monitorIds.length+2); Paragraph p=new Paragraph("Legend: ",legendFont); PdfPCell title=new PdfPCell(p); title.setBorder(Rectangle.NO_BORDER); leg.addCell(title); for (String entry : monitorIds) { Monitor mon=Configuration.getInstance().getMonitor(entry); Font nameFont=new Font(FontFamily.TIMES_ROMAN, 14.f, Font.BOLD,new BaseColor(mon.getColor().getRGB())); Paragraph name=new Paragraph(mon.getName(),nameFont); PdfPCell c=new PdfPCell(name); c.setBorder(Rectangle.NO_BORDER); leg.addCell(c); Chunk line=new Chunk(); line.setGenericTag(entry); c=new PdfPCell(new Paragraph(line)); c.setBorder(Rectangle.NO_BORDER); leg.addCell(c); } document.add(leg); 

onGenericTag方法中的’System.out.println’不会输出任何内容,所以很明显它永远不会被执行。 这显然意味着我没有正确设置通用标签。 TIA。

更新:

我也试过这个无济于事:

 Chunk line=new Chunk(); line.setGenericTag(entry); c=new PdfPCell(); c.addElement(line); c.setBorder(Rectangle.NO_BORDER); leg.addCell(c);