IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de donn�es Discussion :

G�n�ration de pdf via un blob [SQL-Server]


Sujet :

PHP & Base de donn�es

  1. #1
    Membre chevronn�
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Juin 2022
    Messages
    310
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 21
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 310
    Par d�faut G�n�ration de pdf via un blob
    Bonjour messieurs , mesdames
    Je suis actuellement confront� � un probl�me qui me semble �tre li� a l'encodage,
    Ps : les variables tel que serveur , database ,login ... sont �videmment initialis� et valide, dans un soucis de confidentialit� je ne vais pas les afficher.
    Lorsque je fais une g�n�ration de pdf a partir d'un blob stock� en bdd
    Voici un exemple de d�but de blob :
    %PDF-1.5 %���� 2 0 obj <</Length 4972/Filter/FlateDecode>> stream x��ˎ��m���;�Ⱥ���>Y;9@Av�

    Premier script :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    try {
        // Créer une instance de l'objet COM pour la connexion à la base de données SQL Server
        $connection = new COM("ADODB.Connection");
     
        // Chaîne de connexion à la base de données avec l'authentification Windows
        $connectionString = "Provider=SQLOLEDB;Server=$serverName;Database=$databaseName;Integrated Security=SSPI";
     
        // Ouvrir la connexion à la base de données
        $connection->Open($connectionString);
     
        // Exécuter une requête SQL
        $query = "SELECT TOP 1 REPLACE(TRS_C_CODE,' ','_') + '_' + format(PDF_D_CREATE,'yyyyMMdd-HHmmss') + '.pdf' as FileName, PDF_U_BLOB,TRS_C_CODE,PDF_I_ID FROM MPH.GYS_MPH_PROD.dbo.ALL_PDF AS p LEFT JOIN MPH.GYS_MPH_PROD.dbo.GDV_TRANSPORTEUR AS t ON t.TRS_I_ID = p.PDF_TRS_i_ID WHERE p.PDF_C_NAME LIKE '%PRN_%_BordereauRecap.fr5%' and pdf_i_id=259242 ORDER BY p.PDF_D_CREATE DESC;";
        $result = $connection->Execute($query);
     
        // Parcourir les résultats
        while (!$result->EOF) {
            $pdf_blob=$result->Fields("PDF_U_BLOB")->Value;
            $encoding = mb_detect_encoding($pdf_blob, "UTF-8, ISO-8859-1, CP1252");
            $filename=$result->Fields("FileName")->Value;
            $transporteur=$result->Fields("TRS_C_CODE")->Value;
            // echo $encoding;
            $id_pdf=$result->Fields("PDF_I_ID")->Value;
            echo $pdf_blob;
            $position_espace = strpos($transporteur, ' ');
            if ($position_espace === false) {
                $position_espace = strlen($transporteur);
            }
            $partie_transporteur = substr($transporteur, 0, $position_espace);
     
     
     
            file_put_contents('Bordereau/' .$partie_transporteur."/". $filename, $pdf_blob);
            $result->MoveNext();
     
        }
        // Fermer la connexion à la base de données
        $connection->Close();
    } catch (Exception $e) {
        echo "Une erreur s'est produite : " . $e->getMessage();
    }
    La ca fonctionne bel et bien , le fichier pdf g�n�r� est valide et je peux voir le contenu mais lorsque j'ai voulu transitionn� de com vers pdo qui lui n'est pas d�pr�ci� impossible de g�n�r� un pdf avec du contenu , le pdf est vide (il ya bien des pages mais blanches sans contenu)

    Voici l'extrait du code en question :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    try {
     
     
        // Connexion à la base de données
        $conn = new PDO("sqlsrv:Server=$server;Database=$database;", $username, $password);
        $conn->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
        // Requête SQL
        $sql = "SELECT TOP 1 REPLACE(TRS_C_CODE,' ','_') + '_' + FORMAT(PDF_D_CREATE,'yyyyMMdd-HHmmss') + '.pdf' AS filename, PDF_U_BLOB AS blob_data, TRS_C_CODE AS transporteur, PDF_I_ID AS id_pdf FROM GYS_MPH_PROD.dbo.ALL_PDF AS p LEFT JOIN GYS_MPH_PROD.dbo.GDV_TRANSPORTEUR AS t ON t.TRS_I_ID = p.PDF_TRS_i_ID WHERE p.PDF_C_NAME LIKE '%PRN_%_BordereauRecap.fr5%' AND PDF_D_UPDATE is not null ORDER BY p.PDF_D_CREATE DESC";
        $stmt = $conn->query($sql);
        // $meta = $sql->getColumnMeta(1);
        // echo $meta;
        $results = $stmt->fetchAll(PDO::FETCH_ASSOC );
     
        // Boucle sur les résultats 
        foreach ($results as $i => $row) {
     
            $filename = $row['filename'];
            $pdf_blob=$row['blob_data'];
            $transporteur = $row['transporteur'];
            $id_pdf = $row['id_pdf'];
             $encoding = mb_detect_encoding($pdf_blob, 'UTF-8, ISO-8859-1, CP1252');
     
            echo $pdf_blob;
     
     
            // echo $pdf_blob;
            // Afficher le contenu du blob PDF
     
            // Récupération du transporteur
            $position_espace = strpos($transporteur, ' ');
            if ($position_espace === false) {
                $position_espace = strlen($transporteur);
            }
            // var_dump($results);
            $partie_transporteur = substr($transporteur, 0, $position_espace);
     
            // Chemin du dossier
            $folder_path = $cheminStockage . $partie_transporteur . '/';
     
            // Création du dossier si inexistant
            if (!file_exists($folder_path)) {
                mkdir($folder_path, 0777, true);
            }
     
            // Génération du PDF
            $file_path = $folder_path . $filename;
     
     
     
            file_put_contents($file_path, $pdf_blob);
     
     
            // Update du champ PDF_D_UPDATE de la table ALL_PDF
            // $sql_update = "UPDATE GYS_MPH_PROD.dbo.ALL_PDF SET PDF_D_UPDATE = GETDATE() WHERE PDF_I_ID = ?";
            // $stmt_update = $conn->prepare($sql_update);
            // $stmt_update->execute([$id_pdf]);
     
            // echo "Fichier enregistré : $file_path<br>";
        }
    } catch (PDOException $e) {
        echo "Une erreur s'est produite : " . $e->getMessage();
    }
    Information utile ou non :
    Lorsque je detecte l'encodage utilis� , sur le premier script php il me dit windows 1252 alors que sur le deuxi�me script il me dit UTF-8
    Je consent qu'il serait donc logique de mb_convert_encoding en sp�cifiant l'encodage origine et celui vis� mais cela ne fonctionne point
    Merci d'avance de l'aide apport�

  2. #2
    Membre chevronn�
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Juin 2022
    Messages
    310
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 21
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 310
    Par d�faut
    Quitte � s'embeter a vouloir changer de m�thode de connexion autant faire les choses bien et utiliser sqlsrv_connect, juste � sp�cifier comment il doit interpr�ter la data :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    $pdf_blob = sqlsrv_get_field($result, 1, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY));
    Et puis pof le tour est jou�
    Nota bene : j'ai fait crash le WMS de ma boite � cause d'un update tout seul sans boucle , comme quoi il faut faire attention avant de toucher � la bdd en prod :p
    Au moins je m'en suis rendu compte la deuxi�me fois ...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Nom du PDF via BLOB
    Par benjisan dans le forum JDBC
    R�ponses: 0
    Dernier message: 24/04/2009, 09h41
  2. Affichage pdf via un Blob sans cr�ation de fichier
    Par orphee13 dans le forum Langage
    R�ponses: 2
    Dernier message: 23/10/2008, 17h47
  3. impression pdf via asp
    Par flo456 dans le forum ASP
    R�ponses: 2
    Dernier message: 16/01/2006, 14h58
  4. R�ponses: 1
    Dernier message: 13/01/2006, 17h43
  5. R�ponses: 9
    Dernier message: 04/03/2005, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo