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

Bibliothèques et frameworks PHP Discussion :

[FPDF] Dépassement mémoire png


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut [FPDF] Dépassement mémoire png
    Bonjour,
    Lors de la génération d'un fichier PDF, je rencontre une erreur lorsque j'essaye d'ajouter une image png que je ne sais pas comment résoudre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    error_reporting(E_ALL|E_STRICT);
    require_once 'fpdf.php';
    $pdf = new FPDF();
    $pdf->AddPage();
    $pdf->Image('http://www.generatix.fr/images/elephpant-elephant-php-logo.png',0,0);
    $pdf->Output();
    Avec xDebug, j'ai les messages d'erreurs suivants:
    ( ! ) Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 548722757 bytes) in fpdf.php on line 1593
    Call Stack
    # Time Memory Function Location
    1 0.0024 52920 {main}( ) ..\fpdf_test.php:0
    2 0.0192 704704 FPDF->Image( ) ..\fpdf_test.php:6
    3 0.0193 707088 FPDF->_parsepng( ) ..\fpdf.php:914
    4 0.0918 728552 fread ( ) ..\fpdf.php:1593

    Variables in local scope (#3)

    $colspace = string 'Indexed' (length=7)

    $file = string 'http://www.generatix.fr/images/elephpant-elephant-php-logo.png' (length=62)

    $f = resource(4, stream)

    $pos Undefined

    $n = int 548722752

    $h = int 255

    $t Undefined

    $w = int 397

    $ct = int 3

    $bpc = int 8

    $data = string 'xÚ... (length=7125)

    $parms = string '/DecodeParms <</Predictor 15 /Colors 1 /BitsPerComponent 8 /Columns 397>>' (length=73)

    $pal = string 'ÿÿÿYhšŠŸà½½½t†½PWmÑÙðÌÌÍ*¼èèìø+.9' (length=36)

    $type = string 'š'ã' (length=4)

    $trns = string '' (length=0)
    J'ai essayé le même bout de code sous les versions de php 5 allant de la 5.2.6 a la 5.2.1, j'ai toujours la même erreur

    Avec la versions 5.2.0 j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: unpack() [function.unpack]: Type N: not enough input, need 4, have 0 in fpdf.php on line 1605
    Avec php 5.1.6, j'ai une deuxième erreur qui me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: fread() [function.fread]: Length parameter must be greater than 0 in fpdf.php on line 1593
    Et avec une version encore plus ancienne, la 4.1.2, le fichier PDF ce génère correctement.


    J'ai vu sur le forum une personne qui avait le même problème, mais elle l'a résolu en changeant le type de l'image, chose que je ne peut pas faire, car c'est l'utilisateur qui choisi ce qu'il veut mettre dans son fichier PDF

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 27
    Points : 30
    Points
    30
    Par défaut
    Bonjour,

    memory_limit dépassée. Essaye de mettre la valeur dans le php.ini à 50 Mo pour voir le changement. Ceci dit je pense qu'il y a un possible bug dans fpdf. Vu la taille affichée et la taille de l'image réelle, j'ai un gros doute.
    Content-Length: 14970 pour l'image, 548722757 dans le message ...

    as tu essayer de télécharger d'abord l'image sur la machine avant de l'envoyer à fpdf ?

  3. #3
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut
    J'ai fait le test avec 128Mo de memoire pour PHP, mais toujours pareil. sur le forum de fpdf, j'ai trouvé une solution à ce problème, mais j'ai toujours la même erreur.

    En local ça marche, mais je ne vais pas pouvoir mettre les images en local pour mon projet

  4. #4
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 292
    Points
    292
    Par défaut
    Bon, je viens juste de résoudre le problème, j'ai du adapter le code fourni sur le site de fpdf (http://www.fpdf.org/phorum/read.php?f=1&i=36971&t=36971)
    dans la fonction _parsepng, il faut remplace le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    elseif($type=='IDAT')
    {
      //Read image data block
      $data.=fread($f,$n);
      fread($f,4);
    }
    par

    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
    elseif($type=='IDAT')
    {
      //Read image data block
      $bytes_read = 0;
     
      //can *attempt* to read 8k bytes in one pass max
      if( $n > 8000 )
        $bytes_to_read = 8000;
      else
        $bytes_to_read = $n;
     
      //read IDAT
      while($n > $bytes_read)
      { 
        $chunck = fread( $f, $bytes_to_read ); 
        $actual_bytes_read = strlen($chunck);
        $data.= $chunck;
     
        $bytes_read+=$actual_bytes_read;
     
        if( $n > ($bytes_read+8000) )
          $bytes_to_read = 8000;
        else
          $bytes_to_read = $n - $bytes_read;
      }
     
      //discard crc
      fread($f,4);			
    }

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut pb output "S" avec image
    J'ai ce code en fin de chaine :
    9 0 obj
    <</Type /XObject
    /Subtype /Image
    /Width 65
    /Height 50
    /ColorSpace /DeviceRGB
    /BitsPerComponent 8
    /Filter /FlateDecode
    /DecodeParms <</Predictor 15 /Colors 3 /BitsPerComponent 8 /Columns 65>>
    /Length 4079>>
    stream
    hÞíšk¬÷uÝkï9÷^’W—¢Ä7EI–HÊ"•*mɤkKJ¬‡*

    ce qui rend ma chaine inutilisable. J'ai fait la correction préconisée dans la fonction _parsepng mais pareil.
    idem avec des images jpg.

    des idées?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Liaison série >> Erreur dépassement mémoire
    Par Arameya dans le forum C++
    Réponses: 0
    Dernier message: 16/05/2011, 12h38
  2. Dépassement mémoire et contrôle utilisateur
    Par bzh_coder dans le forum C#
    Réponses: 2
    Dernier message: 04/05/2010, 10h05
  3. Dépassement mémoire MappedByteBuffer
    Par iohack dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 07/12/2007, 16h29
  4. HEAP Size et dépassement mémoire
    Par Sentenza28 dans le forum Général Java
    Réponses: 6
    Dernier message: 20/09/2007, 11h33
  5. Analyseur code pour dépassement mémoire
    Par adrienj dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 13/07/2006, 21h53

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