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 VCL Delphi Discussion :

SynPDF : soucis avec GetDeviceCaps(aCanvas.Handle, PHYSICALWIDTH) = 0


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 222
    Par défaut SynPDF : soucis avec GetDeviceCaps(aCanvas.Handle, PHYSICALWIDTH) = 0
    Bonjour à tous,
    Bon, aujourd'hui (depuis longtemps) j'ai un soucis avec l'utilisation de synPDF.
    C'est vrai que ce n'est pas un composant VCL mais je ne savais pas trop ou mettre ma discussion ...
    C'est un outil qui a l'air super pour faire des PDF (gratuit, open source, communautaire ...) mais j'ai un soucis avec :
    ... et a priori je ne suis pas le seul : https://synopse.info/forum/viewtopic.php?id=1658

    Je génère une facture avec printer.canvas, tout va bien, cela fonctionne très bien avec l'imprimante ou une imprimante PDF virtuelle quelconque.
    J'ai décidé de travailler avec synPDF pour fabriquer directement un PDF, on travaille aussi avec un canvas, donc, peu de modif au niveau du code.
    Par contre, quand je travaille avec, l'impression ne se fait pas à la même échelle, c'est bien plus gros avec synPDF que sur les autres imprimantes.

    J'ai voulu travailler avec les paramètres donnés par l'API GetDeviceCaps (je travaille avec ça pour les imprimantes réelles et virtuelles) mais pour synPDF, GetDeviceCaps(aCanvas.Handle, PHYSICALWIDTH) donne la valeur 0
    idem pour PHYSICALHEIGHT. Donc impossible de faire quoi que ce soit avec.
    La déclaration de l'objet est faite comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
               //https://www.youtube.com/watch?v=hD6e6iGvBYE
     Var
       FichierEtat:String;
    begin
              lPdf:=TPdfDocumentGDI.Create(false,0,false);
               lPdf.GeneratePDF15File := true;
               lPdf.DefaultPaperSize := psA4;
               lPdf.DefaultPageLandscape := false;
               lPdf.CompressionMethod := cmFlateDecode;
               lPdfPage:=lPdf.AddPage;
               aCanvas:=lPdf.VCLCanvas;
               GetPrinterParameters(aCanvas);
    end;
    et
    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
    procedure TForm1.GetPrinterParameters(aCanvas : TCanvas);
    begin
       sPixelParPouceHorizontal := GetDeviceCaps(aCanvas.Handle, LOGPIXELSX);  // DPIx
       sPixelParPouceVertical   := GetDeviceCaps(aCanvas.Handle, LOGPIXELSY);  // DPIy
     
       sPixelParPouceHorizontalEcran := Screen.PixelsPerInch;  // DPIx
       sPixelParPouceVerticalEcran   := Screen.PixelsPerInch;  // DPIy
     
       sDimensionPixelZoneImpressionUtileHorizontale := GetDeviceCaps(aCanvas.Handle, HORZRES);
       sDimensionPixelZoneImpressionUtileVerticale   := GetDeviceCaps(aCanvas.Handle, VERTRES);
     
       sDimensionMilimetreZoneImpressionUtileHorizontale := GetDeviceCaps(aCanvas.Handle, HORZSIZE);
       sDimensionMilimetreZoneImpressionUtileVerticale := GetDeviceCaps(aCanvas.Handle, VERTSIZE);
     
       sLargeurPixelPagePhysique := GetDeviceCaps(aCanvas.Handle, PHYSICALWIDTH);
       sHauteurPixelPagePhysique := GetDeviceCaps(aCanvas.Handle, PHYSICALHEIGHT);
     
       sEchelleX := GetDeviceCaps(aCanvas.Handle, SCALINGFACTORX);
       sEchelleY := GetDeviceCaps(aCanvas.Handle, SCALINGFACTORY);
     
       sMargeGauche := GetDeviceCaps(aCanvas.Handle, PHYSICALOFFSETX);
       sMargeHaute := GetDeviceCaps(aCanvas.Handle, PHYSICALOFFSETY);
       sMargeDroite := sLargeurPixelPagePhysique - sDimensionPixelZoneImpressionUtileHorizontale - sMargeGauche;
       sMargeBasse :=  sHauteurPixelPagePhysique - sDimensionPixelZoneImpressionUtileVerticale - sMargeHaute;
     
    end;
    Cet après midi j'ai trouvé un bout de code sur le net, j'ai fait des essais et en tâtonnant j'ai trouvé les bords de la feuille A4 virtuelle de synPDF :
    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
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Math, DateUtils, SynCommons, SynPDF,
      Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
     lPdf   : TPdfDocument;
     lPage  : TPdfPage;
    begin
      lPdf := TPdfDocument.Create;
      try
        lPdf.Info.Author        := 'Tester';
        lPdf.Info.CreationDate  := Now;
        lPdf.Info.Creator       := 'Tester';
        lPdf.DefaultPaperSize   := psA4;
        lPage := lPDF.AddPage;
        lPDF.Canvas.SetFont('Helvetica',10.0,[]);
        lPDF.Canvas.SetLeading(lPDF.Canvas.Page.FontSize);
        lPDF.Canvas.SetLineWidth(0.1);
     
        //lPdf.Canvas.BeginText;             //                       
        lPdf.Canvas.TextOut( 0, 0,  '1');    // Gauche Bas        
        lPdf.Canvas.TextOut( 0, 835,  '2');  // Gauche Haut       
        lPdf.Canvas.TextOut( 590, 835,  '3');// Droite Haut      
        lPdf.Canvas.TextOut( 590, 0,  '4');  // Droite Bas      
                                             //                   
        lPdf.Canvas.TextOut( 295, 418,  'X');// Milieu           
     
        //lPdf.Canvas.EndText;
        lPdf.SaveToFile('c:\temp\test.pdf');
      finally
        lPdf.Free;
      end;
    end;
    end.
    ... et on constate que le bord 0,0 est en bas à gauche et non en haut à gauche dans ce code.


    Quelqu'un bosse avec cette librairie pour me donner de l'info ?
    Merciiiiiiii

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Bonjour,

    je l'utilise sans problème pour transformer une impression Printer en PDF

    voici le code que j'ai ajouté pour que cela fonctionne

    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
     
        FPdfDocument := TPdfDocumentGDI.Create;
        FPdfDocument.ScreenLogPixels := Screen.PixelsPerInch;
        FPdfDocument.DefaultPaperSize := psA4;
        FPdfDocument.DefaultPageLandscape := False;
        FPdfDocument.AddPage; // nécessaire pour avoir le VCLCanvas
     
    // utilisation du Canvas
       Canvas := FPdfDocument.VCLCanvas;
     
    // Hauteur de page
       if FPdfDocument = nil then
          Result := Printer.PageHeight
      else
        Result := FPdfDocument.VCLCanvasSize.Height;
     
    // LArgeur de page
      if FPdfDocument = nil then
        Result := Printer.PageWidth
      else
        Result := FPdfDocument.VCLCanvasSize.Width;
    moralité, je ne passe par GetDeviceCaps() que pour l'imprimante
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre éclairé

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 222
    Par défaut
    Super, Merci Paul,
    Fonctionne parfaitement.

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

Discussions similaires

  1. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 19h13
  2. SOucis avec une reequete imbriquee
    Par Ni4k dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/03/2004, 09h56
  3. souci avec un algorithme
    Par slider16 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2004, 18h17
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 17h52
  5. Réponses: 4
    Dernier message: 16/02/2003, 13h16

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