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 :
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)
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(); }
Voici l'extrait du code en question :
Information utile ou non :
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(); }
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é
Partager