代码之家  ›  专栏  ›  技术社区  ›  Roman Ieromenko

以pdf格式输出#iTextSharp

  •  0
  • Roman Ieromenko  · 技术社区  · 7 年前

    我刚刚开始探索itextsharp C#库,遇到了一个异常。 此异常的类型特定于此库。

    以下代码构成pdf文档:

    private static void returnPdf(IEnumerable<object> reportItemList)
    {
        var suggestedFileName = "Sales_By_Payment_Type_Report" + ".pdf";
        using (var doc = new Document(PageSize.A4, 60, 60, 30, 30))
        {
            PdfWriter.GetInstance(doc, new FileStream(suggestedFileName, FileMode.Create));
            doc.Open();
            doc.NewPage(); 
    
            var totalList = reportItemList as IEnumerable<ReportItem>;
            if (totalList != null)
            {
              //filter by 14
              var members = typeof(ReportItem).GetMembers().Where(memb =>memb.MemberType == 
                System.Reflection.MemberTypes.Property && memb.GetCustomAttributes(false).Where(att => (att as ReportProperty)?.PropertyName != String.Empty).Count() != 0);
              var itemNumber = members.Count();
              if (itemNumber != 0)
              { 
                PdfPTable table = new PdfPTable(itemNumber);
                PdfPCell[] itemArray = new PdfPCell[itemNumber];
                for (int i = 0; i < itemArray.Length - 1; i++)
                {
                  var customList = members.ElementAt(i).CustomAttributes.Where(t => t.AttributeType == typeof(ReportProperty)).FirstOrDefault()?.ConstructorArguments;
                  if (customList.Count != 0) {
                    itemArray[i] = new PdfPCell();
                    itemArray[i].Phrase = new Phrase(customList[0].Value.ToString());
                  }
                }
                PdfPRow pdfRow = new PdfPRow(itemArray);
                table.Rows.Add(pdfRow);                
                //footer
                table.Rows.Add(new PdfPRow(new PdfPCell[itemNumber]));
                try
                {                      
    
                  **doc.Add(table);**
    
                }
                catch (DocumentException ex)
                {
                  throw ex;
    
                }           
    
              }
            }
    
        }
    }
    

    enter image description here

    doc,table不是空值

    iTextSharp.text.DocumentException:  reference to an object does not indicate an object instance.
        в PdfTesting.Program.returnPdf(IEnumerable`1 reportItemList) в D:\FranPosTest\iconnect-web\PdfTesting\Program.cs:строка 70   
        в PdfTesting.Program.Main(String[] args) в D:\FranPosTest\iconnect-web\PdfTesting\Program.cs:строка 107
        в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
        в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
        в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
        в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
        в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
        в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
        в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
        в System.Threading.ThreadHelper.ThreadStart()
    
    0 回复  |  直到 7 年前
        1
  •  1
  •   mkl    7 年前

    你这样做

    //footer
    table.Rows.Add(new PdfPRow(new PdfPCell[itemNumber]));
    

    PdfPRow 基于一个新的 PdfPCell 数组中没有设置值,因此该数组中的所有项都是 null

    当iText试图在 doc.Add(table) ,它最终也尝试布局这一行,并绊倒了所有这些 无效的 细胞。

    推荐文章