2012-08-05 37 views
2

我使用iTextSharp的,並試圖用爲什麼我得到一個空引用異常?

PdfAction action = PdfAction.GotoLocalPage(1, pdfDest, writer); 

這是一個靜態方法,但我總是得到這個錯誤

Server Error in '/' Application. 
Object reference not set to an instance of an object. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object. 

Source Error: 


Line 178: 
Line 179:   //create a new action to send the document to our new destination. 
Line 180:   PdfAction action = PdfAction.GotoLocalPage(1, pdfDest, writer); 
Line 181: 
Line 182:   //set the open action for our writer object 


Source File: VoucherService.cs Line: 180 

Stack Trace: 


[NullReferenceException: Object reference not set to an instance of an object.] 
    iTextSharp.text.pdf.PdfWriter.GetPageReference(Int32 page) +326 
    iTextSharp.text.pdf.PdfAction.GotoLocalPage(Int32 page, PdfDestination dest, PdfWriter writer) +49 
    OnlineStudentPlanner.Framework.Services.VoucherService.SetupPdfDoc(String invoiceNumber, String logoPath, Document doc, MemoryStream memoryStream, PdfWriter writer, PdfPTable& table) in VoucherService.cs:180 
    OnlineStudentPlanner.Framework.Services.VoucherService.GenerateVouchers(Int32 qty, Int32 voucherSize, String invoiceNumber, String logoPath, Int32 siteWideQty, IEnumerable`1 validDomains, Boolean siteWideVoucher) in VoucherService.cs:55 
    OnlineStudentPlanner.WebUI.Areas.Admin.Controllers.HomeController.GenerateVouchers(GenerateVouchersVm vm) in Admin\Controllers\HomeController.cs:52 
    lambda_method(Closure , ControllerBase , Object[]) +163 
    System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17 
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +208 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27 
    System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +263 
    System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +191 
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343 
    System.Web.Mvc.Controller.ExecuteCore() +116 
    System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97 
    System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10 
    System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37 
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21 
    System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62 
    System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50 
    System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 
    System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8970061 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 

這裏是我的代碼,我有

Document doc = new Document(); 
MemoryStream memoryStream = new MemoryStream(); 
PdfPTable table; 

doc.Open(); 

PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream); 
writer.CloseStream = false; 

SetupPdfDoc(invoiceNumber, logoPath, doc, memoryStream, writer, out table); 

private void SetupPdfDoc(string invoiceNumber, string logoPath, Document doc, MemoryStream memoryStream, PdfWriter writer, out PdfPTable table) 
{ 
    PdfDestination pdfDest = new PdfDestination(PdfDestination.XYZ, 0, doc.PageSize.Height, 0.75f); 
    doc.AddTitle(String.Format("Vouchers-{0}", invoiceNumber)); 
} 
+1

'doc'和'memoryStream'是空的。這是預期的嗎? – 2012-08-05 19:40:50

回答

3

這是因爲您試圖在沒有任何頁面的情況下操作空白的PDF文檔。

更改以下三行:

 doc.Open(); 

     PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream); 
     writer.CloseStream = false; 

到:

 PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream); 
     writer.CloseStream = false; 
     doc.Open(); 
     doc.NewPage(); 

應該解決您的問題。

+0

我會嘗試,但如果我移動我的上層代碼到相同的方法。這一切正常,我不需要做NewPage(); – chobo2 2012-08-05 20:24:12

+0

在這種情況下,請嘗試刪除PDFTable輸出參數。這是我能看到的唯一可能導致這種行爲的事情。 – 2012-08-05 22:36:48

0

你檢查過pdfDest和writer是否爲空?它以線拋出異常:

iTextSharp.text.pdf.PdfWriter.GetPageReference(Int32 page) +326 

我認爲作家不爲空,所以無論是pdfDest爲空或有缺陷的iTextSharp的,並傳遞錯誤的頁面是引起異常(錯誤的例外,它應該是OutOfBounds或者其他的東西)。

+0

從我看到的東西都是空的。它似乎有與文件的問題,即使它不是null。 – chobo2 2012-08-05 20:24:39

+0

然後iTextSharp似乎有bug。 GetPageReference()應該檢查頁面參數是否有效(小於頁面數量),它可能不會導致異常。如果是這種情況您應該檢查頁面參數是否小於頁數。此外,請記住,在大多數情況下(即使不是全部),在編程中,編號從0開始,而不是1(我在這裏假設您想要轉到第一頁) – Varius 2012-08-05 20:32:19

相關問題