2010-01-13 11 views
13

Je regarde en ligne depuis un certain temps maintenant, mais je n'ai toujours pas compris comment imprimer un fichier PDF en Delphi sans afficher le document lui-même, ou une boîte de dialogue d'impression. Je veux juste ouvrir un fichier sans le montrer et l'imprimer sur l'imprimante par défaut.Delphi: Comment imprimer un PDF sans le montrer?

J'essaye d'imprimer un lot de documents PDF, et il n'y a pas besoin d'interférence de l'utilisateur.

Répondre

15

Il existe différentes possibilités d'imprimer des PDF ... cela dépend si vous pouvez avoir besoin d'installer Adobe Reader (je ne sais pas si vous voulez distribuer votre outil ou simplement l'utiliser vous-même).

1) Il est possible de charger Vous pouvez imprimer des fichiers PDF avec Adobe Reader lui-même (qui pourrait être fait avec Foxit aussi)

le contrôle ActiveX d'Adobe Reader et de l'utiliser pour l'impression

pdfFile.src := 'filename.pdf'; 
pdfFile.LoadFile('filename.pdf'); 
pdfFile.print; 

2)

ShellExecute(0, 'open', 'acrord32', PChar('/p /h ' + FileName), nil, SW_HIDE); 

3) vous pouvez également utiliser Ghostview et Ghostprint

ShellExecute(Handle, 'open', 'gsprint.exe', PChar('"' + filename + '"'), '', SW_HIDE); 

4) Ou vous pouvez utiliser à Hird bibliothèque fête ... Il y a quelques disponibles, mais pas tous sont gratuits

+0

Thx! Je ne pense pas pouvoir utiliser les solutions shell. Le programme sur lequel je travaille est un ERP sur mesure et l'impression doit être effectuée côté client. Je suppose que la première option nécessite l'installation d'Adobe Reader? Les bibliothèques tierces sont très utiles aussi, mais seulement les essais sont gratuits bien sûr :) Je vais devoir parler à mon patron, mais nous avons un budget serré;) – Liezzzje

+0

Pour la solution ActiveX, Adobe Reader sera nécessaire aussi, oui. Mais quelles sont vos préoccupations à propos de la solution Shellexecute? Ce serait probablement la méthode la moins chère ... – Leo

+0

Excellent! N'oubliez pas d'ajouter ShellApi, Windows à votre clause uses. – JoeGalind

7

Voici un tas de routines je l'ai écrit dans mon libary. Si vous passez un fichier pdf en paramètre à PrintUsingShell, il devrait imprimer si un programme Acrobat Reader a été installé (il pourrait aussi fonctionner avec d'autres logiciels pdf s'ils s'enregistraient eux-mêmes dans le registre).

PrintUsingShell(x); 


    procedure PrintUsingShell(psFileName :string); 
    var s : string; 
     i : integer; 
    begin 
    if not FileExists(psFileName) 
    then 
     Exit; 

    s := FindShellPrintCmd(ExtractFileExt(psFileName)); 
    i := Pos('%1',s); 
    if i > 0 
    then begin 
     System.Delete(s,i,2); 
     System.Insert(psFileName,s,i); 
     Execute(s); 
    end; 
    end; 

    function FindShellCmd(psExtension:string;psCmd:string): string; 
    var r : TRegistry; 
     sName : string; 
    begin 
    psExtension := Trim(psExtension); 
    if psExtension = '' 
    then begin 
     Result := ''; 
     Exit; 
    end; 

    psCmd := Trim(psCmd); 
    if psCmd = '' 
    then 
     psCmd := 'OPEN' 
    else 
     psCmd := UpperCase(psCmd); 

    if psExtension[1] <> '.' 
    then 
     psExtension := '.' + psExtension; 

    r := TRegistry.Create(KEY_READ); 
    try 
     r.RootKey := HKEY_LOCAL_MACHINE; 
     r.OpenKeyReadOnly('software\classes\' + psExtension); 
     sName := r.ReadString(''); 
     r.CloseKey(); 

     r.OpenKeyReadOnly('software\classes\' + sName + '\Shell\' + psCmd + '\Command'); 
     Result := r.ReadString(''); 
     r.CloseKey(); 
    finally 
     FreeAndNil(r); 
    end; 
    end; 
    function FindShellOpenCmd(psExtension:string):string; 
    begin 
    Result := FindShellCmd(psExtension,'OPEN'); 
    end; 

    function FindShellPrintCmd(psExtension:string):string; 
    begin 
    Result := FindShellCmd(psExtension,'PRINT'); 
    end; 

    {$ifdef windows} 
    function LocalExecute(psExeName:string ; wait:boolean ; how:word):word; 
    var i : integer; 
     prog,parm:string; 
     msg:TMsg; 
     rc : word; 
    begin 

    i := pos(psExeName,' '); 
    if i = 0 
    then begin 
     prog := psExeName; 
     parm := ''; 
    end 
    else begin 
     prog := copy(psExeName,1,i-1); 
     parm := copy(psExeName,i+1,255); 
    end; 

    if pos(prog,'.') <> 0 
    then 
     prog := prog + '.exe'; 

    psExeName := prog + ' ' + parm + #0; 

    rc := WinExec(@psExeName[1] , how); 
    if wait 
    then begin 
     if (rc > 32) 
     then begin 
      repeat 
       if PeekMessage(Msg,0,0,0,PM_REMOVE) 
       then begin 
       TranslateMessage(Msg); 
       DispatchMessage(Msg); 
       end; 
      until (GetModuleUsage(rc) = 0) 
     end; 
    end; 
    end; { LocalExecute } 
    {$endif} 
    {$ifdef win32} 
    function LocalExecute32(FileName:String; Wait:boolean; Visibility : integer; 
          lWaitFor:Cardinal=INFINITE):integer; 
    var zAppName:array[0..512] of char; 
     zCurDir:array[0..255] of char; 
     WorkDir:String; 
     StartupInfo:TStartupInfo; 
     ProcessInfo:TProcessInformation; 
    begin 
    StrPCopy(zAppName,FileName); 
    GetDir(0,WorkDir); 
    StrPCopy(zCurDir,WorkDir); 
    FillChar(StartupInfo,Sizeof(StartupInfo),#0); 
    StartupInfo.cb := Sizeof(StartupInfo); 
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW; 
    StartupInfo.wShowWindow := Visibility; 
    if not CreateProcess(nil, 
     zAppName,      { pointer to command line string } 
     nil,       { pointer to process security attributes } 
     nil,       { pointer to thread security attributes } 
     false,       { handle inheritance flag } 
     CREATE_NEW_CONSOLE or   { creation flags } 
     NORMAL_PRIORITY_CLASS, 
     nil,       { pointer to new environment block } 
     nil,       { pointer to current directory name } 
     StartupInfo,     { pointer to STARTUPINFO } 
     ProcessInfo)     { pointer to PROCESS_INF } 
    then Result := -1 
    else begin 
     if Wait 
     then begin 
      Result := WaitforSingleObject(ProcessInfo.hProcess,lWaitFor); 
      GetExitCodeProcess(ProcessInfo.hProcess,LongWord(Result)); 
     end; 
    end; 
    end; 
    {$endif} 


    function Execute(psExeName:string):integer; 
    begin 
    {$ifdef windows} result := LocalExecute(psExeName, false , SW_SHOW); {$endif} 
    {$ifdef win32} result := LocalExecute32(psExeName, false , SW_SHOW); {$endif} 
    end; 

Note: s'il vous plaît les essayer sur votre version Delphi et système d'exploitation (je les ai développé sous Delphi 7 et les ont utilisés sous Windows XP).

Si vous voulez une impression native (sans Acrobat Reader - mais qui n'a pas installé Acrobat Reader ces jours-ci?), Vous pouvez utiliser le jeu de composants suivant: Pdft print components from WpCubed.

MISE À JOUR

Sur demande j'ai ajouté la fonction Execute de ma bibliothèque ...

+0

Nice. D'où vient la fonction "Exécuter"? – neves

+0

@neves Comme dit: ceci est le code d'une bibliothèque massive de routines Delphi et de classes que j'ai écrites moi-même au fil des années. J'ai ajouté le code 'Execute' (qui est le code que vous avez probablement déjà). – Edelcom

+0

@nevers, n'oubliez pas d'ajouter @ + edelcom lorsque vous commentez ... sinon je ne verrai peut-être pas vos commentaires (sauf si j'ouvre explicitement ce message, ce que j'ai fait à cause de votre upvote). – Edelcom

1

Il y a un shareware-prog appelé « AutoPrint » qui envoie tous les fichiers dans un dossier à une imprimante, coûte 35 dollars. (Si vous n'avez pas beaucoup de clients).

Sinon, il serait cool si quelqu'un pouvait réparer un code qui fait la même chose.

+2

Pouvez-vous modifier votre réponse pour inclure un lien le programme pertinent? Pourriez-vous également ajouter quelques informations sur votre utilisation de cela et si cela fonctionne comme prévu? –

1

L'impression d'un fichier PDF sur une imprimante sans utiliser Adobe Reader à partir de Delphi peut être effectuée à l'aide de Debenu Quick PDF Library, qui prend en charge toutes les versions de Delphi de 4 à XE8.Exemple de code pour l'impression d'un PDF sans programme pré-visualiser d'abord:

procedure TForm6.PrintDocumentClick(Sender: TObject); 
var 
iPrintOptions: Integer; 
begin 
    DPL := TDebenuPDFLibrary1115.Create; 
    try 
    UnlockResult := DPL.UnlockKey('...'); // Add trial license key here 
    if UnlockResult = 1 then 
     begin 
      // Load your file 
      DPL.LoadFromFile('test.pdf', ''); 

      // Configure print options 
      iPrintOptions := DPL.PrintOptions(0, 0, 'Printing Sample'); 

      // Print the current document to the default printing 
      // using the options as configured above 
      DPL.PrintDocument(DPL.GetDefaultPrinterName(), 1, 1, iPrintOptions); 
     end; 
    finally 
    DPL.Free; 
    end; 
end; 

Plus d'options d'impression avancées sont également disponibles à l'aide du customer printer functions. Ce n'est pas un SDK gratuit, mais il fera exactement ce que vous voulez.

+0

Ou utilisez la librairie Delphi Pdfium – MartynA

Questions connexes