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

Composants FMX Delphi Discussion :

[XE2] Fichiers PDF suite.


Sujet :

Composants FMX Delphi

  1. #1
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut [XE2] Fichiers PDF suite.
    Bonjour à toutes et à tous,

    Suite de mes tribulations pour produire du PDF sous FMX.
    J'ai réussi ! Enfin presque...

    J'ai repris le portage pour Free Pascal fait par Jean Patrick à partir de la classe PHP FPDF de Olivier PLATHEY...
    J'en ai retiré tout ce qui concerne les images car elles utilisent les librairies équivalentes à la VCL (LCL) qui ne compile pas sous FMX, je m'y attaquerai après.
    Pour l'instant, j'ai un autre soucis, le codage du fichier de sortie. Voici grosso modo le code permettant de créer le fichier :

    Le contenu (ce qui sera sauvé dans le fichier PDF) est défini come ça :
    la focntion permettant d'ajouter du texte est définie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TJPFpdf._out(sText: string);
    begin
      //Add a line to the document
      if (Self.state = 2) then
        Self.pages[Self.page] += sText + #10
      else
      begin
        sText := sText + #10;
        Self.buffer.Write(Pointer(sText)^, Length(sText) * SizeOf(char));
      end;
    end;
    et l'enregistremenet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TJPFpdf.SaveToFile(vFile: string);
    begin
      if (Self.state < 3) then
      begin
        Close;
      end;
      //Save file locally
      try
        Self.buffer.SaveToFile(vFile);
      except
        Error('Unable to create output file: ' + vFile);
      end;
    end;
    de ce que j'ai pu comprendre, la propriété "state" vaut "1" lors de la création du doc (quand on appelle "_BeginDoc" qui écrit la première ligne _out('%PDF-1.7'); ), "3" après la fin de la constitution du doc (appel de "_EndDoc" : _out('%%EOF'); ) et donc vaudrait "2" en cours de remplissage du document...

    A ce stade, ca fonctionne sauf que :
    lorsque je tente d'ouvrir le fichier pdf produit (avec juste un texte "Texte épuré"), j'ai une erreur de Adobe quime dit que le format n'est pas reconnu, et pour cause, il semble que chaque caractère soit suivi d'un espace (genre encodage en Unicode sur 20 octets...
    Si j'ouvre le fichier sous Notepad++, les espaces n'apparaissent pas, mais aucun encodage n'est sélectionné. Si je sélectionne un encodage ANSI et que je sauve, ça marche le fichier est reconnu par Adobe reader.

    J'avoue completement sécher sur cette notion d'unicode, d'UTF-8 et UTF16 et tout ça.

    J'ai cru lire dans les (rares) docs embarcadero que Delphi gérait en interne totues ses chaines en unicode (le format String serait une dérivation d'un formati Wide string en unicode 16 apparemment.

    D'où ma question : comment je fais pour avoir un fichier directement produit en UTF-8 ou ANSI ou je sais pas trop quoi, mais qui puisse contenir des caractères accentués (je vous raconte pas comment est sorti "épuré") et qui soit lisible...

    la page de site ou on peut télécharger le code complet :
    http://fpdf.org/, ensuite "télécharger" poru al versino PHP? et dans la section "liens" pour Free Pascal .


    Merci à tous !
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 087
    Points : 21 258
    Points
    21 258
    Par défaut
    sText en String c'est donc UnicodeString

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Self.buffer.Write(Pointer(sText)^, Length(sText) * SizeOf(char))
    Ton code écrit presque* parfaitement la chaine en gérant la taille du Char qui est un WideChar
    Voir Unicode dans RAD Studio

    presque* si BMP, peu de risque d'avoir une langue qui dépasse cette première table unicode

    ton buffer reçoit 'Salut' dans sText,
    tu verras qu'il contient 'S 00 a 00 l 00 u 00 t 00' !

    Une solution radicale serait de déclarer sText en AnsiString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TJPFpdf._out(const sText: AnsiString);
    begin
      //Add a line to the document
      if (Self.state = 2) then
        Self.pages[Self.page] += sText + #10
      else
      begin
        sText := sText + #10;
        Self.buffer.Write(Pointer(sText)^, Length(sText) * StringElementSize(sText));
      end;
    end;
    ElementSize est une méthode de String en C++Builder,
    StringElementSize est son équivalent Delphi
    L'avantage par rapport à SizeOf(AnsiChar) c'est que l'on vérifie le contenu de la chaine et non un contenu théorique

    Pour l'UTF8, voici la variante

    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
     
    procedure TJPFpdf._out(const sText: String);
    var
      sTextUTF8: RawByteString; // voir aussi ce que donne UTF8String
    begin
      sTextUTF8 := Utf8Encode(sText);
     
      //Add a line to the document
      if (Self.state = 2) then
        Self.pages[Self.page] += sText + #10
      else
      begin
        sText := sText + #10;
        Self.buffer.Write(Pointer(sTextUTF8)^, Length(sTextUTF8) * StringElementSize(sTextUTF8));
      end;
    end;
    il existe aussi WideBytesOf et System.SysUtils.BytesOf et System.SysUtils.TEncoding.GetBytes

    On devrait pouvoir écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TBytes BArray = TUTF8Encoding.GetBytes(sText);
    Ne l'ayant jamais expérimenté, il doit falloir faire quels essais pour mieux comprendre son utilisation
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    Merci Shaï...
    Du coup je risque pas de perdre les accents et autres caractères français ?

    Et pour les appels, faudrait que je les fasse comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.writer(AnsiString('Toto'));
    Il semble que les fichiers PDF soient en Ansi et pas en unicode, quand je fais un "type" d'un fichier PDF sous DOS j'ai ça au début :

    D:\xxxxx\USERS>type 6A00022815316pdf.pdf | more
    %PDF-1.4
    %ÔÒ¤Ë
    1 0 obj <</Filter/FlateDecode/Type/XObject/Length 47567/BitsPerComponent 4/Heigh
    t 1240/ColorSpace[/Indexed/DeviceRGB 15(
    Si le fichier était du Unicode je devrais avoir normalement le bloc des 3 caractères au début c'est bien ça ?
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 087
    Points : 21 258
    Points
    21 258
    Par défaut
    Citation Envoyé par arkhamon Voir le message
    Merci Shaï...
    Du coup je risque pas de perdre les accents et autres caractères français ?
    Avec AnsiString, c'est du Windows1252 sur un OS Français, normalement pas de soucis !
    Avec UTF8, tu pourrais gérer même du russe et chinois dans la même chaine


    Citation Envoyé par arkhamon Voir le message
    Si le fichier était du Unicode je devrais avoir normalement le bloc des 3 caractères au début c'est bien ça ?
    le BOM = Byte Mark Order
    La Taille et les valeurs du BOM dépendent du type !
    3 caractères c'est 0xEF,0xBB,0xBF = UTF8
    2 caractères comme FF FE = UTF-16 (Little Endian)

    le BOM c'est pour du texte !
    un code source par exemple ou certains XML
    Pour le PDF, il doit avoir son propre standard à ce sujet, son préfixe "PDF Version" doit toujours être au début

    Citation Envoyé par arkhamon Voir le message
    Et pour les appels, faudrait que je les fasse comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.writer(AnsiString('Toto'));
    essaye déjà les codes fourni avec Stream.Write sans ce genre de transypage sauvage
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Avec AnsiString, c'est du Windows1252 sur un OS Français, normalement pas de soucis !
    PC et MAC ça marchera ?

    Citation Envoyé par ShaiLeTroll Voir le message
    le BOM c'est pour du texte !
    un code source par exemple ou certains XML
    Pour le PDF, il doit avoir son propre standard à ce sujet, son préfixe "PDF Version" doit toujours être au début
    Bien joué. Je suis un boulet...

    Citation Envoyé par ShaiLeTroll Voir le message
    essaye déjà les codes fourni avec Stream.Write sans ce genre de transypage sauvage
    En fait la fonction Writer de la classe permet d'ajouter uen ligne de texte (avec éventuellement toute la quincaillerie du fomat post script du PDF)...

    Donc si à l'intérieur je définis toutes mes variables en AnsiString, ça devrait marcher ? Sosu réserve à chaque fois de faire le transtypage ?
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 087
    Points : 21 258
    Points
    21 258
    Par défaut
    Même pas besoin de faire de transtypage !
    Une affectation d'une String (UnicodeString) vers AnsiString fait automatiquement la conversion !
    Affectation aussi bien via := ou passage de paramètre

    Mieux vaut affecter une seule fois que de multiplier plusieurs transtypage !

    Windows1252 c'est la version Windows du Latin-1, le caractère "oe" est l'un des seuls qui différe et qui peut poser problème dans coeur, oedeme, ... à part ça !
    Voir Jeux de caractères
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    Donc si je comprends bien, le seul fait de transformer l'ancienne déclaration de méthode en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TJPFpdf._out(const sText: AnsiString);
    va me permettre de régler mon soucis de caractères dans mon fichier PDF et de le lire ? Génlail.

    En espérant que mes fichiers de Donjons et Dragons ne contiennent pas trop de "oe"...

    JE fais un essai dès que possible et je vous donne le resultat.
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 087
    Points : 21 258
    Points
    21 258
    Par défaut
    Citation Envoyé par arkhamon Voir le message
    Donc si je comprends bien, le seul fait de transformer l'ancienne déclaration de méthode en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TJPFpdf._out(const sText: AnsiString);
    va me permettre de régler mon soucis de caractères dans mon fichier PDF et de le lire ?
    Si tu corrige le SizeOf en StringElementSize, oui cela sera suffisant !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    Ca marche !
    Merci Shai ! T'es un chef...

    Il me reste un tout petit soucis avec les minuscules accentuées, mais je pense que ça doit venir du fichier de définition de la police, car en fait les caractères ont disparu. Je vais creuser ce de cote la...

    En tout cas pour le reste c'est bon.
    Merci !
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  10. #10
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    Bon après tests multiples, il s'avère que ce sont les appels du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stext := UTF8Encode(stext);
    qui dégomment les minuscule accentuées. Pareil avec UTF8ToString (puisque UTF8Decode ewst "deprecated").
    Depuis que j'ai enlevé toutes ces lignes, et que j'ai complètement désactivé l'UTF-8, ça marche nickel j'ai les accents...

    J'ai plus qu'à m'attaquer à l'ajout de polices et d'images et ça sera tout bon.
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 087
    Points : 21 258
    Points
    21 258
    Par défaut
    Attention !
    N'utilise pas le même stext !
    Il te faut DEUX chaines lorsque tu fais ce genre de manip !
    l'original en String ou UnicodeString
    la version altéré en RawByteString ou AnsiString

    UTF8Decode est DEPRECATED car utilise du WideString (ça c'est utilisé en lecture du fichier)
    UTF8Encode ne semble pas être marqué (ça tu l'utilise en écriture)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TJPFpdf._out(const sText: String);
    var
      sTextUTF8: RawByteString; // voir aussi ce que donne UTF8String
    begin
      sTextUTF8 := Utf8Encode(sText);
      ...
    end;

    Enfin, si cela fonctionne SANS UTF8Encode\UTF8Decode, c'est que PDF accepte un code ANSI basique
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : janvier 2006
    Messages : 621
    Points : 1 259
    Points
    1 259
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Attention !
    N'utilise pas le même stext !
    Il te faut DEUX chaines lorsque tu fais ce genre de manip !
    l'original en String ou UnicodeString
    la version altéré en RawByteString ou AnsiString
    Oh le con
    Transtypage de transtypage pour revenir à la situation de base... Bon ben je crois que j'ai besoin de vacances moi...
    Citation Envoyé par ShaiLeTroll Voir le message
    Enfin, si cela fonctionne SANS UTF8Encode\UTF8Decode, c'est que PDF accepte un code ANSI basique
    Semblerait que oui.
    Je continue mes tests et je vous tiens au courant. Il me reste surtout à intégrer les images, ça ça va être plus sport...
    "L'incohérence de ceux qui dirigent et l'incompétence de ceux qui critiquent sont un vibrant hommage à ceux qui exécutent."
    Général George S. PATTON. Messine 1943.

  13. #13
    Membre expérimenté
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2005
    Messages : 828
    Points : 1 721
    Points
    1 721
    Par défaut
    Bonjour arkhamon,

    Je viens aussi de prendre cette librairie pour l'utiliser avec FMX.
    J'ai aussi travaillé pour l'instant que sur le texte, cela fonctionne bien mais je ne me suis pas occupé de la fonction 'UTF8ToUTF16' qui vient il me semble, de Free Pascal.

    Est ce que tu l'a utilisé ?
    Merci

    PS: je vais bientôt attaquer la partie image.

  14. #14
    Membre expérimenté
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2005
    Messages : 828
    Points : 1 721
    Points
    1 721
    Par défaut
    Citation Envoyé par arkhamon Voir le message
    Il me reste surtout à intégrer les images, ça ça va être plus sport...
    Je viens de le faire et cela n'est pas trop compliqué, il suffit de modifier la méthode GetInfoImage pour encoder l'image au format désiré.

    Pour ma part, je travaille avec des images en mémoire ( elles ne proviennent pas d'un fichier ) mais le principe reste le même et j'ai donc modifié comme suit :

    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
    function TFMXpdf.GetInfoImage(P_Image: TBitmap): ty_TJPImageInfo;
    var
      l_Surface : TBitmapSurface;
     
    begin
      try
        Result.imgSource := TMemoryStream.Create;
        l_Surface := TBitmapSurface.Create;
        l_Surface.Assign(P_Image);
        TBitmapCodecManager.SaveToStream(Result.imgSource, l_Surface, 'jpg');
        Result.w := P_Image.Width;
        Result.h := P_Image.Height;
        Result.bpc := 8;
        Result.f := 'DCTDecode'; 
        Result.cs := 'DeviceRGB';
     
      finally
        l_Surface.Free;
      end;
    end;
    Voila, TBitmapCodecManager permet d'encoder ton image au format voulu, je n'utilise que le jpg mais on peut utiliser d'autres formats comme png ( par exemple ).
    Dans ce cas, je pense qu'il faut aussi modifier la valeur de Result.f car 'DCTDecode' correspond au format jpeg.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/09/2014, 15h25
  2. Afficher fichier pdf suite à une recherche par mot clé
    Par Tibao2b dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 17/05/2013, 12h11
  3. Imprimer à la suite plusieurs fichiers pdf
    Par mariesouil dans le forum Documents
    Réponses: 8
    Dernier message: 17/10/2008, 09h11
  4. Streaming fichier PDF
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 22/05/2003, 22h14
  5. [XMLRAD] Fichier PDF
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 09/01/2003, 10h19

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