iTextSharp Хранение штрих-кодов как элементов - исключение нулевой ссылки - PullRequest
0 голосов
/ 06 января 2012

Я работаю над классом, который будет отображать документы PDF на веб-сервере интрасети. Проблема, с которой я столкнулся, заключается в том, что iTextSharp использует PDFWriter для рендеринга изображений со штрих-кодом, и я пытаюсь создать коллекцию элементов IE, прежде чем рендерить документ. Есть ли способ создать коллекцию, которая включает в себя изображения со штрих-кодом или есть лучший способ кодировать этот класс?

Надеюсь, мой код сможет объяснить это лучше. Спасибо.

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 голосов
/ 06 января 2012

Проблема с фрагментом кода заключается в том, что вы пытаетесь получить доступ к 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]);
  }
}
...