将参数传递给重写的OnEndPage方法

时间:2014-07-10 09:35:42

标签: c# itextsharp

我需要将参数传递给" OnEndPage"的重写版本。方法,当我声明参数时我没有得到任何错误但是当我调用方法时它告诉我"不能隐式地将void转换为itextsharp.text.pdf.ipdfpageevent"

这是我的OnEndPage方法:

  public class pdfPage : iTextSharp.text.pdf.PdfPageEventHelper
{           
    public override void OnEndPage(PdfWriter writer, Document doc, int parametro)
    {
        PdfPTable headerTbl = new PdfPTable(1);

        headerTbl.TotalWidth = doc.PageSize.Width;

        Image logo = Image.GetInstance("logo.png");

        logo.ScalePercent(42);

        PdfPCell cell = new PdfPCell(logo);

        cell.HorizontalAlignment = Element.ALIGN_LEFT;

        cell.PaddingRight = 52;

        cell.Border = 0;

        headerTbl.AddCell(cell);

        headerTbl.WriteSelectedRows(0, -1, 0, (doc.PageSize.Height - 10), writer.DirectContent);

        PdfPTable headerrow = new PdfPTable(7);
        headerrow.TotalWidth = 570f;
        headerrow.LockedWidth = true;
        headerrow.AddCell(new Phrase("TIPO DOCUMENTO", new Font(Font.FontFamily.HELVETICA, 6f)));

        headerrow.WriteSelectedRows(0, -1, 0, (doc.PageSize.Height - 50), writer.DirectContent);
    }
}

这就是我所说的:

 var doc = new Document(PageSize.A4, 10, 10, 170, 10);
        pdfPage page = new pdfPage();
        PdfWriter pdfWriter = PdfWriter.GetInstance(doc, new FileStream( "test.pdf", FileMode.Create));
        pdfWriter.PageEvent = page.OnEndPage(pdfWriter, doc, 1234);

5 个答案:

答案 0 :(得分:12)

要进一步添加Bruno所说的内容,如果您想向PdfPageEventHelper添加其他信息,可以添加其他属性:

public class pdfPage : iTextSharp.text.pdf.PdfPageEventHelper
{           
    public int parametro { get; set; }
    public override void OnEndPage(PdfWriter writer, Document doc)
    {
        //...
    }
}

然后:

var page = new pdfPage();
page.parametro = 40;
pdfWriter.PageEvent = page;

或者只是:

pdfWriter.PageEvent = new pdfPage() { parametro = 40 };

如果你想更改这个有效的"每页",你需要将你的逻辑移到这个类而不是调用主体。

答案 1 :(得分:0)

page.OnEndPage(只返回void

这意味着pdfWriter.PageEvent = page.OnEndPage(pdfWriter, doc, 1234);设置为null,但PageEvent不能设置为null,因为它不是nullable所以它会中断。

如果方法签名为public override ipdfpageevent OnEndPage,它将起作用 Here is an article that deals with PageEvent
有一种方法writer.setPageEvent();

答案 2 :(得分:0)

您已在此行中出现语法错误:

public override void OnEndPage(PdfWriter writer, Document doc, int parametro)

原始OnEndPage()方法有两个参数。当你override时,你只能使用两个参数。如果您添加参数,则不要覆盖方法,重载它。请参阅加州大学圣克鲁兹分校网站上的"Overriding vs Overloading"页面。

通过重载方法很难理解你想要实现什么,因为从iTextSharp的核心内调用OnEndPage()。 iTextSharp无法猜出parametro的含义。您必须重写iTextSharp的内部代码才能使其正常工作。

正如LUIFA已经解释的那样,这也是错误的:

pdfWriter.PageEvent = page.OnEndPage(pdfWriter, doc, 1234);

应该是:

pdfWriter.PageEvent = page;

但是:无论发生什么情况,您的OnEndPage()方法的重载版本将永远不会被调用,原因对于那些理解覆盖和重载方法之间差异的人来说应该是显而易见的。< / p>

这个答案解释了你的代码是错误的。你需要替换

public override void OnEndPage(PdfWriter writer, Document doc, int parametro)

public override void OnEndPage(PdfWriter writer, Document doc)

并替换

pdfWriter.PageEvent = page.OnEndPage(pdfWriter, doc, 1234);

使用:

pdfWriter.PageEvent = page;

现在创建一个新问题,解释您希望使用parametro做什么,因为现在,您已将此添加为参数,但我们不会在任何地方看到您使用此参数。

答案 3 :(得分:0)

 public class pdfPage : iTextSharp.text.pdf.PdfPageEventHelper
 {
    private long OrderId;
    private string PhoneNumber;
     //constructor
     public InvoicePdfEvents(long orderId, string phoneNumber)
    {
        OrderId = orderId;
        PhoneNumber= phoneNumber;
    }

    public override void OnEndPage(PdfWriter writer, Document doc)
    {
         //Now you can use values
         //OrderId  And PhoneNumber
        //...
    }
}

public class CreatePDF
{
  private void GenerateCreatePDF(OrderListingInfo orderDetail, string contain)
  {
   var doc = new Document(PageSize.A4, 10, 10, 170, 10);
    pdfPage page = new pdfPage();
    PdfWriter pdfWriter = PdfWriter.GetInstance(doc, new FileStream( 
    "test.pdf", FileMode.Create));
    int orderID=123456789;
    string phoneNumber="+01 123456789"
    pdfWriter.PageEvent = page.OnEndPage(pdfWriter, doc, orderID,phoneNumber);
  }
}

答案 4 :(得分:0)

我已经尝试过这种简单的方法,并且有效。

Have a class contructor
public class pdfPage extends PdfPageEventHelper{
      private int parametro;
      public pdfPage(int parametro){
         this.parametro=parametro;
      }
//.....
writer.setPageEvent(new pdfPage(int parametro));

//in the same class you can pageEvent
public void onEndPage(PdfWriter writer,Document document){
         try {
            //can access parametro 
           Text text = new Text(parametro);
           document.add(text);
         } catch (Exception e) {

         }
     }