0

PDFファイルを生成できるWebアプリを開発しました。ユーザーは、最大 5 枚の写真をアップロードできます。ユーザーが 5 枚の写真をアップロードすると、PDF ファイルを生成できるようになります。ただし、ユーザーが 4 のみをアップロードすることを選択した場合、PDF ファイルを生成できず、このエラーが発生します。

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

どうすればこれを解決できますか? 1日か2日立ち往生しています。

4

1 に答える 1

0

空のバイトから画像を作成するように iTextSharp に依頼しているため、エラーが発生します。空の画像のケースを処理するコードを追加する必要があります。私はあなたの他のスレッドPdfPTableに、あなたの人生を楽にするためにこれに切り替えることをお勧めすることを投稿しました. Phraseただし、 /パスを下って続行するChunk場合は、イメージが見つからない場合に SQL Server に有効な "既定のイメージ" を返すようにするか、コードに "既定のイメージ" を挿入させます。

たとえば、SQL Server から、可能な限り最小の透明な画像を返すことができます。これを正しく変換すると、次のようになります。

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);
    }
}
于 2013-06-26T13:42:01.293 に答える