Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Imprimir en "Microsoft to PDF" pasando nombre del archivo (https://www.clubdelphi.com/foros/showthread.php?t=97941)

LDD 13-12-2025 19:30:11

Imprimir en "Microsoft to PDF" pasando nombre del archivo
 
Hola, tengo mi propio sistema de impresión que imprime en el canvas de la impresora que se haya elegido.
Necesito generar el PDF de las facturas que imprimo pero sin que windows me pida el archivo de destino, quiero definirlo antes de imprimir.

¿Se puede hacer?

Garada 13-12-2025 20:41:20

En mis notas tengo esto:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
    PrtIndex   : Integer;
    DeviceMode : THandle;
    Device,
    Driver,
    Port       : array [0..255] of Char;
begin
    // Warning: The printer name is case sensitive
    PrtIndex := Printer.Printers.IndexOf('Microsoft Print to PDF');
    if PrtIndex < 0 then
        raise Exception.Create('Printer not found');
    Printer.PrinterIndex := PrtIndex;
    Printer.GetPrinter(Device, Driver, Port, DeviceMode);
    Printer.SetPrinter(Device, Driver, 'C:\Temp\TestPrintToPdf.pdf', 0);
    Printer.BeginDoc;
    Printer.Canvas.TextOut(100, 100, 'Hello World');
    Printer.EndDoc;
end;

Desde //stackoverflow.com/questions/64063302/set-default-folder-when-print-to-a-pdf-file>

LDD 13-12-2025 21:46:22

Perfecto, gracias
 
Muy bien, muchas gracias. Funciona a la perfección

Sólo he tenido que hacer un ajuste.
Si le paso el nombre del fichero en una variable (vNombrePDF) la he de convertir a pWIDECHAR

Printer.SetPrinter(Device, Driver, pWideChar(vNombrePDF), 0);

seccion_31 14-12-2025 09:26:20

Para otras aplicaciones desde Impresoras, conectas el microsoft print pdf a un puerto local, donde indicas la ruta completa y el nombre de un archivo.pdf por ejemplo c:\mispdfs\archivo.pdf y listo.

LDD 15-12-2025 20:15:03

Gracias pero...
 
Muchas gracias, pero ...

Es muy raro . En mi ordenador funciona perfectamente pero al instalar mi programa en otros ordenadores me dice "Printer is not printing"

Garada 16-12-2025 19:28:18

Ni idea.

El código nunca lo había probado, es de esas cosas que me apunto cuando lo veo por si hace falta algún día. 😅

Lo he probado en Delphi 2010, he hecho las mismas adaptaciones que tú (el widechar) y funciona bien en un equipo con W11 y otro con W10.
Revisa en los otros equipos si la impresora está instalada, se llama igual, etc.
Prueba también con un código más simple, como el ejemplo, por si hay algo que cause el error en otra parte del código de tu aplicación.

El código de mi prueba, un form y un botón:
Código Delphi [-]
uses
  Printers, ShellAPI;

procedure TForm1.btn1Click(Sender: TObject);
var
  PrtIndex: Integer;
  DeviceMode: Cardinal;
  Device,
  Driver,
  Port: array [0..255] of WideChar;
  PdfFileName: string;
begin
  PdfFileName := ExtractFilePath(Application.ExeName) + 'p.pdf';

  PrtIndex := Printer.Printers.IndexOf('Microsoft Print to PDF');
  if PrtIndex < 0 then
      raise Exception.Create('Printer not found');

  Printer.PrinterIndex := PrtIndex;
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
  Printer.SetPrinter(Device, Driver, PWideChar(PdfFileName), 0);
  Printer.BeginDoc;
  Printer.Canvas.TextOut(100, 100, 'Hello World ' + DateTimeToStr(Now));
  Printer.EndDoc;

  ShellExecute(0, 'open', PWideChar(PdfFileName), nil, nil, 0);
end;


La franja horaria es GMT +2. Ahora son las 06:32:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi