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