Pobieranie PDFów z bazy Comarcha

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET

Moderator: mikey

Awatar użytkownika
Tym
Posty: 26
Rejestracja: 05 kwie 2019, 09:32
Rola: Inny
Wersja: 2019

Pobieranie PDFów z bazy Comarcha

Post autor: Tym »

Chciałbym pobrać plik zapisany w bazie Comarcha swoim programem, a więc albo bezpośrednio z bazy, albo poprzez API. Pliki na których mi zależy, to skany w PDFie, do których w Comarchu docieram w następujący sposób: Księgowość > Rejestry VAT > tam wyszukuję fakturę sprzedaży i otwieram jej podgląd. W API nie widzę funkcji, która by mogła to wykonać, dlatego spróbowałem pobrać plik bezpośrednio z bazy danych, załączam kod:

Kod: Zaznacz cały

byte[] plik_bin = SQL.GetBinaryFile(id_pliku);
string ścieżka = Path.GetTempPath() + id_pliku + ".pdf";
try
{
    File.WriteAllBytes(ścieżka, plik_bin);
}
Niestety tak pobrany plik nie działa, nie da się go otworzyć i wyskakuje taka informacja:
Obrazek

A więc moje pytania są następujące: Czy istnieje lepszy sposób na pobranie tych plików z Comarcha? Czy może te pliki są jakoś specjalnie kompresowane/szyfrowane i trzeba coś z nimi więcej robić przy bezpośrednim pobieraniu z bazy danych?

rolski95
Posty: 101
Rejestracja: 21 lut 2019, 08:24
Rola: Administrator CDN XL

Re: Pobieranie PDFów z bazy Comarcha

Post autor: rolski95 »

U mnie poniższy kod pobiera pliki PDF beż żadnego problemu. Jest on analogiczny do twojego więc gdzieś indziej musi być problem

Kod: Zaznacz cały

 
 var DABITEM= context.DaneBinarne.Where(x => x.DAB_ID == Convert.ToInt32(item.Name)).FirstOrDefault();
 System.IO.File.WriteAllBytes(folderPath + DABITEM.DAB_Nazwa + "." + DABITEM.DAB_Rozszerzenie, DABITEM.DAB_Dane);
 

Awatar użytkownika
viesiek1
Posty: 416
Rejestracja: 03 maja 2011, 18:40
Rola: Administrator CDN XL
Wersja: 2023
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Pobieranie PDFów z bazy Comarcha

Post autor: viesiek1 »

Może trzeba rozpakować? Nie mam pewności czy mój kod rozpakuje dane binarne z XL, ale może warto spróbować. Usuń wcześnej, to co niepotrzebne ;-)

Kod: Zaznacz cały

        private void GetBinaryDataFormDb()
        {
            try
            {
                StringBuilder lSb = new StringBuilder();

                if (fOlvMain.SelectedIndices.Count > 0)
                {
                    this.Cursor = Cursors.WaitCursor;
                    int lIndex = gBinaryFileList.IndexOf((BinaryFile)fOlvMain.SelectedObject);

                    lSb.AppendLine("SELECT");
                    lSb.AppendLine("      BD.BinaryData      AS BinaryData");
                    lSb.AppendLine("    , ISNULL(BD.Name,'') AS Name");
                    lSb.AppendLine("FROM BinaryData AS BD");
                    lSb.AppendLine("WHERE BD.Id = " + gBinaryFileList[lIndex].Id);

                    using (SqlConnection lConnection = new SqlConnection(Global.gvConnectionStringEshops))
                    {
                        try
                        {
                            using (SqlCommand lCommand = new SqlCommand())
                            {
                                lCommand.Connection = lConnection;

                                if (lConnection.State != ConnectionState.Open)
                                    lConnection.Open();

                                lCommand.CommandText = lSb.ToString();
                                lCommand.CommandTimeout = 600;

                                using (SqlDataReader lReader = lCommand.ExecuteReader())
                                {
                                    try
                                    {
                                        if (lReader.HasRows)
                                        {
                                            while (lReader.Read())
                                            {
                                                if ((lReader["BinaryData"]) != DBNull.Value)
                                                {
                                                    byte[] lByte = new byte[0];
                                                    lByte = (Byte[])(lReader["BinaryData"]);

                                                    if (lByte.Length > 0)
                                                    {
                                                        byte[] lByteDeComp = new byte[0];
                                                        lByteDeComp        = Global.DecompressSQL(lByte);

                                                        if (lByteDeComp.Length > 0)
                                                        {

                                                            if (Path.GetExtension(lReader["Name"].ToString().ToUpper()) == ".JPG")
                                                            {
                                                                if (pdfViewer.Document != null)
                                                                {
                                                                    pdfViewer.Document = null;
                                                                    pdfViewer.Visible = false;
                                                                }

                                                                ImageConverter lConverter = new ImageConverter();
                                                                pictureBoxPreview.Image = (Image)lConverter.ConvertFrom(lByteDeComp);
                                                                pictureBoxPreview.SizeMode = PictureBoxSizeMode.StretchImage;

                                                                labelImageSize.Text = "Rozmiar obrazka: " + pictureBoxPreview.Image.Width + " x " + pictureBoxPreview.Image.Height;

                                                                if (pictureBoxPreview.Image.Width < 200 | pictureBoxPreview.Image.Height < 200)
                                                                {
                                                                    labelImageSize.BackColor = Color.Red;
                                                                    labelImageSize.ForeColor = Color.Yellow;
                                                                }
                                                                else
                                                                {
                                                                    labelImageSize.BackColor = SystemColors.Control;
                                                                    labelImageSize.ForeColor = SystemColors.ControlText;
                                                                }
                                                            }
                                                            else
                                                            {
                                                                pictureBoxPreview.Image = null;
                                                                labelImageSize.Text     = "Rozmiar obrazka:";
                                                                labelImageSize.BackColor = SystemColors.Control;
                                                                labelImageSize.ForeColor = SystemColors.ControlText;

                                                                if (Path.GetExtension(lReader["Name"].ToString().ToUpper()) == ".PDF")
                                                                {
                                                                    pdfViewer.Visible = true;

                                                                    using (MemoryStream lStream = new MemoryStream(lByteDeComp))
                                                                    {
                                                                        pdfViewer.Document = PdfDocument.Load(lStream);
                                                                        lStream.Close();
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    finally
                                    {
                                        if (!lReader.IsClosed)
                                            lReader.Close();
                                    }
                                }
                            }
                        }
                        finally
                        {
                            if (lConnection.State != ConnectionState.Closed)
                                lConnection.Close();
                        }
                    }
                }

                this.Cursor = Cursors.Default;
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Default;
                string lClassName = System.Reflection.MethodBase.GetCurrentMethod().Name;
                MessageBox.Show("Błąd: " + lClassName + ", " + ex.Message, "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        public static byte[] DecompressSQL(byte[] data)
        {
            using (var output = new MemoryStream())
            {
                using (var input = new MemoryStream())
                {
                    input.Write(data, 0, data.Length);
                    input.Position = 0;

                    using (var gzip = new GZipStream(input, CompressionMode.Decompress, true))
                    {
                        var buff = new byte[64];
                        var read = gzip.Read(buff, 0, buff.Length);

                        while (read > 0)
                        {
                            output.Write(buff, 0, read);
                            read = gzip.Read(buff, 0, buff.Length);
                        }

                        gzip.Close();
                    }
                    return output.ToArray();
                }
            }
        }        
        

Wiesław Świergała

tel: +48 33 829 54 50
e-mail: wieslaw.swiergala@hydro.com.pl

http://www.hydro.com.pl

Awatar użytkownika
Tym
Posty: 26
Rejestracja: 05 kwie 2019, 09:32
Rola: Inny
Wersja: 2019

Re: Pobieranie PDFów z bazy Comarcha

Post autor: Tym »

Dziękuję bardzo Panu viesiek1, dekompresja gzipem okazała się elementem, którego u mnie brakowało, po dodaniu tego PDFy pobierane z bazy XLa już poprawnie się otwierają :D

Awatar użytkownika
viesiek1
Posty: 416
Rejestracja: 03 maja 2011, 18:40
Rola: Administrator CDN XL
Wersja: 2023
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Pobieranie PDFów z bazy Comarcha

Post autor: viesiek1 »

To dobrze, bo nie byłem pewien. Ale "Pan", to już nie był potrzebny ;)
Wiesław Świergała

tel: +48 33 829 54 50
e-mail: wieslaw.swiergala@hydro.com.pl

http://www.hydro.com.pl

ODPOWIEDZ