2013-06-26 71 views
0

我開發了一個能夠生成PDF文件的webapp。用戶可以選擇上傳最多5張照片。當用戶上傳5張照片時,我將能夠生成PDF文件。但是,如果用戶只選擇上傳4,我將無法生成PDF文件,我將收到此錯誤。無法生成帶'0x'varbinary值的PDF文件ASP.net itextsharp

Index was outside the bounds of the array 

如果用戶沒有上傳全部5張照片,我已經插入了默認值'0x'作爲varbinary。這是我如何直接從我的SQL服務器獲取圖像的代碼。

phrase.Add(new Chunk("C-IMG1 :\u00a0", normalFont)); 
      Byte[] bytes1 = (Byte[])dr[8]; 
      iTextSharp.text.Image image1 = iTextSharp.text.Image.GetInstance(bytes1); 
      image1.ScaleToFit(112f, 112f); 
      Chunk imageChunk1 = new Chunk(image1, 0, 0); 
      phrase.Add(imageChunk1); 

      phrase.Add(new Chunk("C-IMG2 :\u00a0", normalFont)); 
      Byte[] bytes2 = (Byte[])dr[9]; 
      iTextSharp.text.Image image2 = iTextSharp.text.Image.GetInstance(bytes2); 
      image2.ScaleToFit(112f, 112f); 
      Chunk imageChunk2 = new Chunk(image2, 0, 0); 
      phrase.Add(imageChunk2); 

      phrase.Add(new Chunk("C-IMG3 :\u00a0", normalFont)); 
      Byte[] bytes3 = (Byte[])dr[10]; 
      iTextSharp.text.Image image3 = iTextSharp.text.Image.GetInstance(bytes3); 
      image3.ScaleToFit(112f, 112f); 
      Chunk imageChunk3 = new Chunk(image3, 0, 0); 
      phrase.Add(imageChunk3); 

      phrase.Add(new Chunk("C-IMG4 :\u00a0", normalFont)); 
      Byte[] bytes4 = (Byte[])dr[11]; 
      iTextSharp.text.Image image4 = iTextSharp.text.Image.GetInstance(bytes4); 
      image4.ScaleToFit(112f, 112f); 
      Chunk imageChunk4 = new Chunk(image4, 0, 0); 
      phrase.Add(imageChunk4); 

      phrase.Add(new Chunk("C-IMG5 :\u00a0", normalFont)); 
      Byte[] bytes5 = (Byte[])dr[12]; 
      iTextSharp.text.Image image5 = iTextSharp.text.Image.GetInstance(bytes5); 
      image5.ScaleToFit(112f, 112f); 
      Chunk imageChunk5 = new Chunk(image5, 0, 0); 
      phrase.Add(imageChunk5); 

我該如何解決這個問題?已被卡住了一兩天。

回答

0

您正在要求iTextSharp從空字節創建一個會導致錯誤的圖像,您需要添加一些代碼來處理空圖像大小寫。我發佈在your other thread,我建議切換到PdfPTable這會讓你的生活更輕鬆。但是如果你要繼續沿着Phrase/Chunk的路徑,那麼如果圖像沒有找到或者你的代碼插入了一個「默認圖像」,SQL Server就會返回一個有效的「默認圖像」。

例如,從SQL Server,你可以只返回的,如果我正確轉換它的smallest transparent image possible將是:

0x47494638396101000100800000ffffff00000021f90400000000002c00000000010001000002024401003b 

或者從.net你可以只生成磁盤簡單空白圖像或負載之一。

而且,你如果你只是將所有內容遷移到一個循環的代碼可以簡化爲:

//Loop through the 5 images 
for (int i = 0; i < 5; i++) { 
    //Output the image with the current index (adding 1 since we're starting at zero) 
    phrase.Add(new Chunk("C-IMG" + (i + 1).ToString() + " :\u00a0", normalFont)); 
    //It appears 8 is the "magic number" of the column so add whatever index we're currently on 
    Byte[] bytes = (Byte[])dr[8 + i]; 
    if (bytes.Length == 0) { 
     //Do something special with the empty ones 
    } else { 
     iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(bytes); 
     image.ScaleToFit(112f, 112f); 
     Chunk imageChunk = new Chunk(image, 0, 0); 
     phrase.Add(imageChunk); 
    } 
} 
+0

我已經在另一個線程粘貼我的全部代碼。我確實使用了pdfptable。我使用了塊,因爲我無法格式化圖片的大小或單詞的字體大小,如果我想通過datareader獲取我的數據。 –