[D7] Créer un postScript depuis une imprimante lambda

cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 - 19 nov. 2008 à 10:20
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 - 19 nov. 2008 à 15:28
Bonjour à tous,


Je cherche à créer un Fichier postScript valide qui pourra être distillé avec GhostScript.

Donc, je pend un fichier (Word, par exemple), je fait "Imprimer dans un
fichier", et ça me fait un fichier PRN que je renomme en PS, et ça
fonctionne très bien.

... Enfin, sur quelques imprimantes seulement. :-(


En effet, certaines imprimantes n'ont pas l'air de savoir faire du
PostScript standard, ça doit être un format propriétaire ou un truc
comme ça.

Et je ne veux pas installer d'imprimante PDF virtuelle (enfin, je ne
veux pas de procédure d'installation, tout gérer par le code).


J'ai donc été chercher le driver de l'imprimante PDF Adobe (ADIST5.PPD), et j'aimerais savoir comment soit:


- Créer par le code une imprimante virtuelle s'appuyant sur ce driver.

- Prendre une imprimante déjà installée et la faire pointer temporairement sur ce driver.

- Savoir générer un postScript standard avec une imprimante lambda.


Je cherche depuis un bout de temps et j'ai eu des pistes, genre:

New(pDriverInfo); // Neu Struktur erstellen
pDriverInfo^.pDataFile := PCHar(DataFile); // On peut mettre un fichier ppd ici

Ou alors

http://support.microsoft.com/kb/142057/fr

(Je n'arrive pas à le mettre en application... )


Mais ce sont des types d'instructions que je n'ai pas l'habitude de
manipuler... Je ne sais pas si ça peut vraiment résoudre mon pb.


Pouvez vous m'aider ?


Merci d'avance.

1 réponse

cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
19 nov. 2008 à 15:28
Bon, j'arrive à récupérer le fichier PPD pour chacune de mes imprimantes installées sur mon poste:

function SetPrinterOptions(NewFilePPD: String=''): String;
var ret: String;
  passe: Boolean;
  DeviceMode, hPrinter: THandle;
  Device, Driver, Port: array[0..MAX_PATH] of Char;
  DriverInfo2: PDriverInfo2;
  DriverInfo2Size: DWORD;
begin
  passe := False;
  ret := '';
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
  OpenPrinter(Device, hPrinter, nil);
  try
    GetPrinterDriver(hPrinter, nil, 2, nil, 0, DriverInfo2Size);
    GetMem(DriverInfo2, DriverInfo2Size);
    try
      GetPrinterDriver(hPrinter, nil, 2, DriverInfo2, DriverInfo2Size, DriverInfo2Size);
      //StrPCopy(Driver, ExtractFileName(StrPas(DriverInfo2^.PDriverPath)));
      ret := DriverInfo2^.pName+': '+#09+DriverInfo2^.pDataFile;
      if (Trim(NewFilePPD)<>'') and (FileExists(NewFilePPD)) then begin // Réaffecter le driver (RIEN NE MARCHE...)
        //StrPCopy(DriverInfo2^.PDriverPath, NewFilePPD);
        //DriverInfo2^.PDriverPath := PChar(NewFilePPD);
        //StrPCopy(Driver, StrPas(DriverInfo2^.PDriverPath));
        //StrPCopy(Driver, NewFilePPD);
        passe := True;
      end;
    finally
      FreeMem(DriverInfo2, DriverInfo2Size);
    end;
  finally
    ClosePrinter(hPrinter);
  end;
  if passe then
    Printer.SetPrinter(Device, Driver, Port, DeviceMode);
  Result := ret;
end;
 
procedure TForm1.btnGetImpClick(Sender: TObject);
var i, tmp: Integer;
  strTmp: String;
begin
  strTmp := '';
  Printer.Refresh;
  tmp := Printer.PrinterIndex;
  for i:=0 to Printer.Printers.Count-1 do begin
    Printer.PrinterIndex := i;
    strTmp := strTmp+sLineBreak+SetPrinterOptions();
  end;
  Printer.PrinterIndex := tmp;
  ShowMessage(strTmp);
end;
 
procedure TForm1.btnSetImpClick(Sender: TObject);
var strTmp: String;
begin
  strTmp := 'C:\WINNT\system32\spool\DRIVERS\W32X86\3\ADIST5.PPD';
  SetPrinterOptions(strTmp); // Ne fonctionne pas
  ShowMessage('Driver changé: '+IntToStr(Printer.PrinterIndex));
end;

Mais je n'arrive pas à le changer... Le SetPrinter ne prend pas en paramètre le DriverInfo2 qui contient l'info...


Avez vous une piste ?
0
Rejoignez-nous