Fórum Imprimir PDF externo direto para impressora #623596

28/11/2024

0

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

Alberto

Responder

Posts

29/11/2024

Natanael Ferreira

Segue código de exemplo:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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.
Responder

Gostei + 0

29/11/2024

Alberto

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.
Responder

Gostei + 0

02/12/2024

Raylan Zibel

Tente usar o fast report pra carregar o pdf de forma invisivel e jogar pra impressão.
Responder

Gostei + 0

02/12/2024

Natanael Ferreira

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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar