2012-01-06 10 views
-1

イントラネットWebサーバー上でPDFドキュメントをレンダリングするクラスで作業しています。私が抱えている問題は、iTextSharpがPDFWriterを使ってバーコードイメージをレンダリングし、ドキュメントをレンダリングする前にIElementsのコレクションを構築しようとしていることです。バーコードイメージを組み込んだコレクションを作成する方法はありますか、このクラスをコーディングするにはより良い方法がありますか?iTextSharpバーコードを要素として保存 - Null参照例外

私のコードではうまく説明できます。ありがとう。

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

コードスニペットの問題は、あなたがDocument.Close()を呼び出した後MemoryStreamにアクセスしようとしているということです。電話番号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()メソッドに渡し、正しく動作しています。私はmemorystreamをMVCのFileStreamResultで使用するために使用しています。 – Pete