Imprimir PDF externo direto para impressora

Delphi

28/11/2024

Olá
Gostaria de alguma dica de como Imprimir PDF externo direto para impressora pádrão do windows usando Delphi.
Alberto

Alberto

Curtidas 0

Respostas

Natanael Ferreira

Natanael Ferreira

28/11/2024

Segue código de exemplo:

Coloque no form um botão e um combobox para listar as impressoras instaladas.

unit Unit4;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Printers, ShellApi, Vcl.StdCtrls;

type
  TForm4 = class(TForm)
    Button1: TButton;
    cbxImpressoras: TComboBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

function PrintFile(aFile: TFileName; iImpressora: integer): Boolean; // Funcao de impressao
var
  Device, Driver, Port: array [0 .. 255] of Char;
  S: string;
  hDeviceMode: THandle;
  pDevmode: PDeviceMode;
begin
  Printer.PrinterIndex := iImpressora;
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);

  // Imprimir somente frente "Simplex"
  if hDeviceMode <> 0 then
  begin
    pDevmode := GlobalLock(hDeviceMode);
    if pDevmode <> nil then
    begin
      try
        with pDevmode^ do
        begin
          dmDuplex := DMDUP_SIMPLEX;
          dmFields := dmFields or DM_DUPLEX;
        end;
      finally
        GlobalUnlock(hDeviceMode);
      end;
    end;
  end;

  S := Format('"%s" "%s" "%s"', [Device, Driver, Port]);

  Result := ShellExecute(Application.Handle, 'printto', PCHAR(aFile), PCHAR(S), nil, SW_HIDE) > 32;
end;

function GetDefaultPrinterName: string; // Pega nome da impressora padrão
begin
  if (Printer.PrinterIndex >= 0) then
    Result := Printer.Printers[Printer.PrinterIndex]
  else
    Result := EmptyStr;
end;

procedure TForm4.Button1Click(Sender: TObject);
begin
  if PrintFile('Arquivo.pdf', cbxImpressoras.ItemIndex) then // Imprimindo arquivo diretamente
   ShowMessage('Sucesso')
 else
   ShowMessage('Falha na impressao');
end;

procedure TForm4.FormCreate(Sender: TObject); // Preenche combobox com as impressoras instaladas e posiciona na padrao
begin
  cbxImpressoras.Clear;
  cbxImpressoras.Items.Assign(Printer.Printers);
  cbxImpressoras.ItemIndex := cbxImpressoras.Items.IndexOf(GetDefaultPrinterName);
end;

end.
GOSTEI 0
Alberto

Alberto

28/11/2024

Funciona, mas só se o adobe acrobat reader estiver instalado.
E tem o incoveniente (no meu caso) que o reader abre o documento PDF na tela.
Eu queria só imprimir, sem mostrar na tela.
GOSTEI 0
Raylan Zibel

Raylan Zibel

28/11/2024

Tente usar o fast report pra carregar o pdf de forma invisivel e jogar pra impressão.
GOSTEI 0
Natanael Ferreira

Natanael Ferreira

28/11/2024

Funciona, mas só se o adobe acrobat reader estiver instalado.
E tem o incoveniente (no meu caso) que o reader abre o documento PDF na tela.
Eu queria só imprimir, sem mostrar na tela.


Nos testes que fiz aqui funcionou corretamente. Imprimiu direto sem abrir o leitor de pdf.

Não tenho o Acrobat Reader instalado. Meu leitor de PDF é o SumatraPDF que é gratuito.

Não sei se para quem tem o Acrobat Reader instalado ele é aberto. Não tenho ele instalado para testar.
GOSTEI 0
POSTAR