Ver Mensaje Individual
  #2  
Antiguo 13-07-2012
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Reputación: 21
ozsWizzard Va por buen camino
Hola compañeros de Delphi, tengo exactamente este mismo problema, no soy capaz de imprimir un pdf con el componente de acrobat (TAcroPdf).

He utilizado Print, PrintAll, ... todo, vaya, y ésto no imprime.

He comprobado que si meto el componente en un Form, el "Print" funciona correctamente. Iba a tirar por el camino, un tanto chapucero, siguiente:

Como quién se encarga de imprimir es un objeto instanciado(instado según el DRAE) de una clase declarada por mí, iba a ponerle una propiedad del tipo TAcroPdf, y asignarla antes de llamar al procedimiento que se encarga de imprimir.

Pues nada, no me imprime tampoco.

Tengo el "Rad Studio X2 Delphi" y el adobe acrobat 10.0.

El código sería más o menos esto:

Código Delphi [-]
//DECLARACIÓN DE LA CLASE
TMiClase = class
  private
     FPdf:       TAcroPdf;
     FNombreDoc: String;

     procedure Ejecutar(const Accion: String);
  public
     property NombreDoc: String read FNombreDoc;
     property Pdf: TAcroPdf read FPdf write FPdf;

     procedure visualizar;
     procedure Imprimir;

     constructor Create(Id: String);
end;

Código Delphi [-]
//IMPLEMENTACION DE LA CLASE
{ TMiClase }

constructor TMiClase.Create(Id: String);
begin
   inherited Create;

   //Proceso que calcula NombreDoc con el Id, pongamos que le calcula lo siguiente
   FNombreDoc :=  'Fichero.pdf';
end;

procedure TMiClase.Ejecutar(const Accion: String);
var
  ExecInfo : TShellExecuteInfo;
  Fichero: TFichero;
  ExitCode: DWord;
begin
   //La clase "TFichero" se usa para codificar y descodificar ficheros. la idea es que los ficheros se guardan codificados, al abrirlos, los 
   //descodifico en un fichero temporal, que es el que intenta imprimir.
   //Parámetros del Create de TFichero (ruta, documeto, nombre del fichero temporal
    Fichero := TFichero.Create(ExtractFilePath(Application.ExeName),
                               NombreDoc, 'documento.pdf');
    try
      Application.ProcessMessages;
      Fichero.Descodificar;

      if Accion = 'print' then
      begin
         Pdf.LoadFile(WideString(Fichero.Temporal));
         Pdf.Print;
      end
      else begin
         ExecInfo.cbSize := SizeOf(ExecInfo);
         ExecInfo.fMask  := SEE_MASK_NOCLOSEPROCESS;
         ExecInfo.Wnd    := Handle;
         ExecInfo.lpVerb := PWideChar(Accion);
         ExecInfo.lpFile := pChar(Fichero.Temporal);
         ExecInfo.lpParameters := nil;
         ExecInfo.lpDirectory  := nil;
         ExecInfo.nShow  := SW_SHOW;
         ShellExecuteEx(@ExecInfo);

         repeat
            Application.ProcessMessages;
            GetExitCodeProcess(ExecInfo.hProcess, ExitCode) ;
         until (ExitCode <> STILL_ACTIVE);
      end;
    finally
       Fichero.Free;
    end;
end;

procedure TMiClase.Imprimir;
begin
   Ejecutar('print');
end;

procedure TMiClase.visualizar;
begin
   Ejecutar('open');
end;

Código Delphi [-]
//LLAMADA (más o menos)
procedure TForm.actImprimirExecute(Sender: TObject);
var
   MiObjeto: TMiClase;
begin
   //Obtengo el ID, supongamos que es 5
   MiObjeto := TMiClase.Create('5');
   try
      MiObjeto.Pdf := AcroPdf1;
      MiObjeto.Imprimir;
   finally
      MiObjeto.Free;
   end;
end;

Evidentemente, he tenido que quitar código, política de empresa, pero a groso modo esto es lo que hago.
__________________
La Madurez se llama...
~~~Gaia~~~

Última edición por ozsWizzard fecha: 13-07-2012 a las 10:42:41.
Responder Con Cita