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