Passing a parameter to an overridden OnEndPage method

大兔子大兔子 提交于 2019-12-01 21:54:22

问题


I need to pass a parameter to an overridden version of the "OnEndPage" method, when i declare the parameter i don't get any error but when i call the method it tells me that "cannot implicitly convert void to itextsharp.text.pdf.ipdfpageevent"

This is my OnEndPage method:

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

and this is how i am calling it:

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

回答1:


To further add to what Bruno said, if you want to add additional information to your PdfPageEventHelper you can just add additional properties:

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

And then:

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

Or just:

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

If you want to change this valid "per page", you're going to need to move your logic into this class instead of the calling body.




回答2:


page.OnEndPage( returns void e.g nothing.

This means that pdfWriter.PageEvent = page.OnEndPage(pdfWriter, doc, 1234); is being set to null, but PageEvent cannot be set to null as it is not nullable so it breaks.

It would work if method signature would be public override ipdfpageevent OnEndPage.
Here is an article that deals with PageEvent
There's a method writer.setPageEvent();




回答3:


You've made a syntax error in this line:

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

The original OnEndPage() method has two parameters. When you override it, you can only use two parameters. If you add a parameter, you don't override the method, you overload it. See the page "Overriding vs Overloading" found on the site of The University of California (Santa Cruz).

It is hard to understand what you would want to achieve by overloading the method, because OnEndPage() is called from within the core of iTextSharp. There is no way that iTextSharp can guess what parametro is about. You'd have to rewrite the internal code of iTextSharp to make it work.

As LUIFA already explained, this is also wrong:

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

It should be:

pdfWriter.PageEvent = page;

However: whatever happens, your overloaded version of the OnEndPage() method will never be called for reasons that should be obvious for those who understand the difference between overriding and overloading a method.

This answer explains that your code is wrong. You need to replace

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

with

public override void OnEndPage(PdfWriter writer, Document doc)

and replace

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

with:

pdfWriter.PageEvent = page;

Now create a new question explaining what you expect to do with parametro because right now, you added this as a parameter, but we don't see you using this parameter anywhere.




回答4:


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


来源:https://stackoverflow.com/questions/24673110/passing-a-parameter-to-an-overridden-onendpage-method

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!