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