Отсканируйте изображение и сохраните его как pdf в базу данных С#

Я создаю метод, который сканирует документ и сохраняет его как изображение. Затем он создает документ в формате PDF, в который я помещаю изображение, и оно правильно сохраняется в базе данных. Проблема в том, что я просто хочу, чтобы pdf был в моем файловом браузере, но отсканированное изображение тоже сохраняется, и я не могу его удалить. Выдает ошибку: Действие невозможно выполнить, так как файл открыт в другой программе.

Я использую Visual Studio 2019 и SQL Server.

Есть ли другой способ сохранить PDF-файл в базу данных без сохранения изображения?

Это код:

internal static string EscanearDocumento(string pathImage, string path, PdfDocument doc)
{
   int count = 0;

WIA.CommonDialog wiaDiag = new WIA.CommonDialog();
var imageFile = wiaDiag.ShowAcquireImage(WiaDeviceType.ScannerDeviceType, WiaImageIntent.TextIntent, WiaImageBias.MaximizeQuality, "{00000000-0000-0000-0000-000000000000}", true, true, false);

while (File.Exists(pathImage + cont + ".png") || File.Exists(path + cont + ".pdf"))
{
   cont++;
}

pathImage = pathImage + cont + ".png";
path = path + cont + ".pdf";
try
{
   imageFile.SaveFile(pathImage);
   Image img = Image.FromFile(pathImage);

   PdfPage page = doc.AddPage();
   page.Orientation = PageOrientation.Portrait;
   XGraphics graphics = XGraphics.FromPdfPage(page);
   graphics.DrawImage(XImage.FromFile(pathImage), 0, 0);
   img.Dispose();
   } catch(NullReferenceException)
   {
      MessageBox.Show("Error");
   }

person luciacar    schedule 10.06.2021    source источник
comment
Вы пытались использовать Stream вместо этого?   -  person ADyson    schedule 10.06.2021
comment
@ADyson ADyson да, я пытался, но это работает так же.   -  person luciacar    schedule 10.06.2021
comment
Что ты конкретно имеешь ввиду? Весь смысл потока в том, что он остается в памяти, его не нужно сохранять в файл   -  person ADyson    schedule 10.06.2021
comment
@ADyson Я пытался создать MemoryStream, сохранить данные и использовать Image.FromStream, но мне также нужно сохранить изображение, чтобы сохранить его в потоке памяти.   -  person luciacar    schedule 10.06.2021
comment
Каков тип данных imageFile?   -  person ADyson    schedule 10.06.2021
comment
@ADyson это ImageFile, и именно здесь я сохраняю отсканированное изображение.   -  person luciacar    schedule 10.06.2021
comment
Вам не нужно сначала сохранять его. stackoverflow.com/a/6489892/5947043   -  person ADyson    schedule 10.06.2021
comment
Я бы предложил использовать операторы using, а не удалять объекты вручную.   -  person JonasH    schedule 10.06.2021
comment
@ADyson Я делал что-то не так с MemoryStream, но я исправил это в этом посте, спасибо!   -  person luciacar    schedule 10.06.2021
comment
Блестящий. Вы должны добавить полное решение ниже, если у кого-то еще есть аналогичная ситуация :-)   -  person ADyson    schedule 10.06.2021


Ответы (1)


Это метод, который я использую для сканирования документа:

internal static string EscanearDocumento(string path, PdfDocument doc)
        {
            int cont = 0;
            
            WIA.CommonDialog wiaDiag = new WIA.CommonDialog();
            try
            {
                ImageFile imageFile = wiaDiag.ShowAcquireImage(WiaDeviceType.ScannerDeviceType, WiaImageIntent.TextIntent, WiaImageBias.MaximizeQuality, "{00000000-0000-0000-0000-000000000000}", true, true, false);

                while (File.Exists(path + cont + ".pdf"))
                {
                    cont++;
                }
                path = path + cont + ".pdf";

                try
                {
                    byte[] imagenEnBytes = (byte[])imageFile.FileData.get_BinaryData();
                    using (MemoryStream ms = new MemoryStream(imagenEnBytes))
                    {
                        XImage imagen = XImage.FromStream(ms);
                        
                        PdfPage page = doc.AddPage();
                        page.Orientation = PageOrientation.Portrait;
                        XGraphics graficos = XGraphics.FromPdfPage(page);
                        graficos.DrawImage(imagen, 0, 0);
                    }
                } catch(NullReferenceException)
                {
                    MessageBox.Show("Error");
                }
            } catch (COMException er) {
                excepciones(er);
            }
            return path;
        }

И я использую его в своем основном классе с помощью этого метода, когда я вставляю документ в базу данных:

private void AgregarDocumentos_Click(object sender, EventArgs e)
        {
            string text1= TextBox1.Text;
            string text2= TextBox2.Text;

            string query = "SELECT * FROM tableName WHERE p ='" + text1 + "'AND n ='" + text2+ "'AND documento is not null";
            SqlDataAdapter adapter = new SqlDataAdapter(query, con);
            DataTable dt = new DataTable();
            adapter.Fill(dt);

            if (dt.Rows.Count == 0)
            {
                Boolean found = false;
                try
                {
                    DeviceManager manejadorDisp = new DeviceManager();
                    DeviceInfo escanerDisponible = null;

                    for (int i = 1; i <= manejadorDisp.DeviceInfos.Count; i++)
                    {
                        if (manejadorDisp.DeviceInfos[i].Type != WiaDeviceType.ScannerDeviceType)
                        {
                            continue;
                        }
                        else
                        {
                            found = true;
                            string path = @"C:";
                            escanerDisponible = manejadorDisp.DeviceInfos[i];
                            Device dispositivo = escanerDisponible.Connect();
                            Item objetoEscaneado = dispositivo.Items[1];
                            PdfDocument doc = new PdfDocument();
                            
                            try
                            {
                                path = Escaner.EscanearDocumento(path, doc);
                                try
                                {
                                    DialogResult dialogResult = DialogResult.Yes;
                                    while (dialogResult == DialogResult.Yes)
                                    {
                                        dialogResult = MessageBox.Show("¿Quiere escanear un documento?", "", MessageBoxButtons.YesNo);
                                        if (dialogResult == DialogResult.Yes)
                                        {
                                            Escaner.EscanearDocumento(path, doc);
                                            doc.Close();

                                        }
                                        else if (dialogResult == DialogResult.No)
                                        {
                                            doc.Save(path);
                                            continue;
                                        }
                                    }

                                    var leer = File.ReadAllBytes(path);

                                    SqlCommand inserta = new SqlCommand("UPDATE tableName SET n = n, p = p, ni = ni, documento = @documento WHERE p ='" + text1 + "'AND n ='" + text2 + "';", con);
                                    inserta.Parameters.AddWithValue("@documento", read);
                                    con.Open();
                                    inserta.ExecuteNonQuery();
                                    con.Close();

                                    Process proceso = new Process();
                                    proceso.StartInfo = new ProcessStartInfo(path)
                                    {
                                        UseShellExecute = true
                                    };
                                    proceso.Start();

                                    MessageBox.Show("Inserted");
                                    break;
                                }
                                catch (InvalidOperationException)
                                {
                                    MessageBox.Show("Cannot save the file");
                                }
                            }
                            catch (FileNotFoundException)
                            {
                                MessageBox.Show("Not found");
                            }
                        }
                    }
                }
                catch (COMException er)
                {
                    Escaner.excepciones(er);
                }
                if(!found)
                {
                    MessageBox.Show("Not found");
                }
            }
            else
            {
                MessageBox.Show("");
            }
        }
person luciacar    schedule 11.06.2021