Imprimir PDF externo direto para impressora
Olá
Gostaria de alguma dica de como Imprimir PDF externo direto para impressora pádrão do windows usando Delphi.
Gostaria de alguma dica de como Imprimir PDF externo direto para impressora pádrão do windows usando Delphi.
Alberto
Curtidas 0
Respostas
Natanael Ferreira
28/11/2024
Segue código de exemplo:
Coloque no form um botão e um combobox para listar as impressoras instaladas.
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
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.
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
28/11/2024
Tente usar o fast report pra carregar o pdf de forma invisivel e jogar pra impressão.
GOSTEI 0
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.
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