Goran Bibic Ответов: 2

Выберите изображение из БД в pdf документ C#


Я пробую это Itext sharp и работаю

  iTextSharp.text.Image logo = iTextSharp.text.Image.GetInstance("C:\\Program files\\BSS\\memorandum.jpg");

logo.ScaleAbsolute(550, 110);
logo.SetAbsolutePosition(25, 715);
pdfDoc.Add(logo);


Мне нужно от БД до документа

А когда пробуешь решение вниз получаешь ошибку

+		$exception	{"Could not find file 'C:\\Users\\Bibic Goran\\source\\repos\\BSS\\BSS\\bin\\Debug\\System.Byte[]'."}	System.Net.WebException


Что я уже пробовал:

string Memorandum = "";
           using (SqlConnection openCon14 = new SqlConnection(Con))
           {
               SqlDataReader reader14;
               SqlCommand cmd14 = new SqlCommand();
               cmd14.CommandText = "select memorandum from podaci_o_korisniku";
               cmd14.Connection = openCon14;
               openCon14.Open();
               reader14 = cmd14.ExecuteReader();
               while (reader14.Read())
               {
                  Memorandum = reader14[0].ToString();
               }
               openCon14.Close();
           }


iTextSharp.text.Image logo = iTextSharp.text.Image.GetInstance(Memorandum);

F-ES Sitecore

Самый простой способ сделать это, вероятно, будет создать объект изображения из вашего читателя (google "c# create Bitmap image from byte array", и вы, вероятно, найдете примеры. Затем передайте этот объект Bitmap\Image в GetInstance

https://www.mikesdotnetting.com/article/87/itextsharp-working-with-images

или просто создайте stream reader, чтобы преобразовать ваш байтовый массив в поток и использовать его непосредственно с GetInstance. Опять же, google "c# convert byte array to stream" для примеров.

2 Ответов

Рейтинг:
20

Richard Deeming

Поле reader14[0] возвращает массив байтов.

Затем вы преобразуете этот массив байтов в строку, в результате чего получается строка "System.Byte[]".

Затем вы передаете эту строку в GetInstance перегрузка, которая ожидает путь к файлу. Поскольку это не корневой путь, метод рассматривает его как относительный путь и пытается найти файл:

C:\Users\Bibic Goran\source\repos\BSS\BSS\bin\Debug\System.Byte[]
Этот файл не существует, поэтому вы получаете исключение.

Измените свой код, чтобы загрузить изображение из массива байтов:
byte[] Memorandum = null;

using (SqlConnection openCon14 = new SqlConnection(Con))
using (SqlCommand cmd14 = new SqlCommand())
{
    cmd14.CommandText = "select memorandum from podaci_o_korisniku";
    cmd14.Connection = openCon14;
    openCon14.Open();

    using (SqlDataReader reader14 = cmd14.ExecuteReader())
    {
        if (reader14.Read())
        {
            Memorandum = (byte[])reader14[0];
        }
    }
}

iTextSharp.text.Image logo = iTextSharp.text.Image.GetInstance(Memorandum);


Goran Bibic

Спасибо

Goran Bibic

Это прекрасно работает...просто дополнительный вопрос
Эквивалентность МКС нуль?

если (reader14[0] != нуль &амп;&амп; reader14[0] != Значение dbnull.Ценность)
{
Меморандум = (байт[])reader14[0];
}
еще
{
Меморандум = ????
}

Richard Deeming

Вы уже инициализировали переменную в null- значит , тебе это не нужно else блок.

Очевидно, вам нужно будет проверить, есть ли Memorandum является null прежде чем ты позвонишь Image.GetInstance, и не показывать логотип в этом случае.

Goran Bibic

Без проблем. Если значение равно null, то показать документ без изображения. Теперь у errof if есть null
Somesting как

Меморандум=пусто;
Или вот так

Richard Deeming

Переменная представляет собой массив байтов. Вы можете либо установить его на null, или установите его в пустой массив - Array.Empty<byte>().

if (!reader14.IsDBNull(0))
{
    Memorandum = (byte[])reader14[0];
}
else
{
    Memorandum = null;
}

Goran Bibic

Здесь есть ошибка если она равна нулю

если (!reader14.IsDBNull(0)) ///здесь ошибка-это система.InvalidOperationException: "недопустимая попытка чтения при отсутствии данных".

{
Меморандум = (байт[])reader14[0];
}
еще
{
Меморандум = null;
}

Richard Deeming

Это может означать, что вы пропустили предыдущую if (reader14.Read()) тест.

Если вы хотите их объединить:

if (reader14.Read() && !reader14.IsDBNull(0))
{
    Memorandum = (byte[])reader14[0];
}
else
{
    Memorandum = null;
}

Goran Bibic

В этом случае есть ошибка здесь
iTextSharp.text.Изображение логотипа = iTextSharp.text.Изображение.GetInstance(Меморандум);

System.NullReferenceException: 'ссылка на объект не установлена на экземпляр объекта'.

Goran Bibic

Я решаю!

if (меморандум == null)
{
Ящик для сообщений.Показать("пожалуйста, обновите фотографии ", "Informacija", MessageBoxButtons.Хорошо, MessageBoxIcon.Информация);
}
еще
{
...распечатываемый документ

Спасибо

Goran Bibic

Мы можем поставить какое-нибудь окно для сообщений ...Пожалуйста, прочтите картинку...

Goran Bibic

Или какой-нибудь ящик для сообщений ...Пожалуйста, прочтите картинку...

Рейтинг:
1

MadMyche

Возможно, вы захотите взглянуть на документацию и образцы. Похоже, что метод, который вы пытаетесь использовать, предназначен для извлечения информации из файла; и что вы передаете информацию непосредственно.
То, что вы можете попробовать, - это создать System.Drawing.Image объект, а затем передача этого объекта в iTextSharp

Ссылка:
iTextSharp - работа с изображениями[^]


Richard Deeming

Согласно с этот поток переполнения стека[^], iTextSharp имеет перегрузки, которые принимают массив байтов или поток, а также путь к файлу. :)

MadMyche

Видел это, но ошибка, которую он получает, предполагает, что метод, который он использует, ищет местоположение (string), а не массив байтов

Richard Deeming

Только потому, что он передавал строку вместо массива байтов. :)