iTextSharp将条形码存储为元素 - 空引用异常

时间:2012-01-06 13:27:38

标签: asp.net-mvc collections itextsharp barcode

我正在研究一个将在Intranet Web服务器上呈现PDF文档的类。我遇到的问题是iTextSharp使用PDFWriter渲染条形码图像,我试图在渲染文档之前构建一个IElements集合。有没有办法创建一个包含条形码图像的集合,还是有更好的方法来编写这个类?

希望我的代码可以更好地解释它。感谢。

public class PDFDoc
{

    public float Width { get; set; }
    public float Height { get; set; }
    private List<IElement> Elements { get; set;}
    ...
    private MemoryStream ms = new MemoryStream();
    private Document doc = new Document();
    private PdfWriter writer;

    private void initializeDocument()
    {
        doc = new Document(new Rectangle(Width, Height), marginLeft, marginRight, marginTop, marginBottom);
        writer = PdfWriter.GetInstance(doc, ms);
        Elements = new List<IElement>();
    }

    private FileStreamResult GenerateLabel(IEnumerable<IElement> elements)
    {
        doc.Open();
        foreach (var e in elements)
        {
            doc.Add(e);
        }
        //doc.Add(GenerateBarcodeImage("123456"));  //GenBC works here but not below
        writer.CloseStream = false;
        doc.Close();

        byte[] byteinfo = ms.ToArray();
        ms.Write(byteinfo, 0, byteinfo.Length);
        ms.Position = 0;
        ms.Seek(0, SeekOrigin.Begin);
        return new FileStreamResult(ms, "application/pdf");
    }

    private Image GenerateBarcodeImage(string code)
    {
        Barcode128 code128 = new Barcode128();
        code128.Code = code;
        code128.X = 1f;
        return code128.CreateImageWithBarcode(new PdfContentByte(writer), null, null);
    }

//Program
        public FileStreamResult RenderLabel()
    {
        Elements.Add(new Paragraph("This is a test"));
        Elements.Add(GenerateBarcodeImage("123456"));  //This gives a null ref exception.
        return GenerateLabel(Elements); 
    }

1 个答案:

答案 0 :(得分:0)

代码段的问题在于您在致电MemoryStream后尝试访问Document.Close()。您可以在Close()下方移动ms.ToArray()来电,或完全取消MemoryStream

当您实例化PdfWriter时,您可以使用任何可用Stream,那么为什么不使用Response.OutputStream

List<IElement> Elements  = new List<IElement>();     
using (Document document = new Document()) {
  PdfWriter writer = PdfWriter.GetInstance(
    document, Response.OutputStream
  );
  document.Open();
  PdfContentByte cb = writer.DirectContent;
  for (int i = 0; i < 9; ++i) {
    Barcode128 code128 = new Barcode128();
    code128.Code = "code " + i.ToString();
    Elements.Add(code128.CreateImageWithBarcode(cb, null, null));
  }
  for (int i = 0; i < Elements.Count; ++i) {
    document.Add(new Paragraph("Barcode: " + i.ToString()));
    document.Add(Elements[i]);
  }
}