2012-01-06 2 views
-1

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

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

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

ответ

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]); 
    } 
} 
+0

Спасибо за обратную связь. Прочитав ваш код, я понял, что моя проблема заключается не в том, что вызов Closed() был вызван, а в том, что Open() не был вызван. Я переместил doc.Open(); к методу initializeDocument(), и он работает правильно. Я использую memystream для работы с FileStreamResult в MVC. – Pete

Смежные вопросы