Convertendo HTML em PDF
Finalmente, depois de muito suar a camisa, nessa batalha com o pré-histórico Delphi 5, consegui algo q me satisfez.
O Componente chama-se Document Creator e pode ser utilizado para outras linguagens além do Delphi. Como fazer o processo?
-Instale o componente, o executável, atente que ele deve estar instalado nas máquinas em que o software que irá fazer a conversão. Pois ele emula uma impressora q imprime em arquivo.
- Após instalado, no diretório padrão da intalação C:/Arquivos de Programas/Neevia.com/document creator vai ser descarregada uma dll docCreator.dll.
Abra o Delphi 5, vá no menu Project/Instal type library e instale a dll;
- Adicione o componente ao formulário, ou faça a referência.
- Como o .exe deve estar instalado em todas as máquinas que fazem uso da funcionalidade, devemos jogar o arquivo cr.exe em algum lugar da rede que possa ser acessado. a partir daí tem que ver como executar o programa sem q o usuário perceba ou o mais muquiado possível;
- No Delphi para executar outro programa, temos a função ShellExecute, adicione na cláusula USES a seguinte API, shellapi.
var
Erro : Integer;
...
Erro := ShellExecute( Application.Handle, 'open', PChar ( ExtractFileDir(Application.ExeName) + '\cr.exe' ),PChar( '/VERYSILENT /user="MAURICIO" /company="ROBERTO" /serial="B1A86829A183JA31DH"' ), Nil, SW_NORMAL);
Essa instalação está com os parâmetros de execução para que a instalação não seja vista pelo usuário, e os parâmetros de licença já foram devidamente crackeados...hehehehe ;-)
function ConverteHtmlPdf(Arquivo, NUPED:string):string;
var
DC,
IE : Variant;
RVal : Integer;
docToConvert,
resultado,
defPrinter : String;
begin
// Documento a ser convertido
docToConvert := Arquivo;
try
DC := CreateOleObject('docCreator.docCreatorClass');
DC.DocumentOutputFormat:= 'PDF';
DC.DocumentResolution:= 300;
// Nome do documento de saída
DC.DocumentOutputName:= 'P' + NUPED;
// Endereço de saída
DC.DocumentOutputFolder:= RelInfo.Localtmp;
RVal:= DC.StartPrinting;
defPrinter:= DC.GetDefaultPrinter;
If (RVal <> 0) Then
begin
ShowMessage('Erro na chamada do método StartPrinting!!!');
exit
end;
try
IE:= CreateOleObject('InternetExplorer.Application');
DC.doSleep(100);
IE.Visible:=false;
IE.navigate2(docToConvert);
While (IE.ReadyState<>4) or (IE.Busy) do
begin
DC.doSleep(100);
Application.ProcessMessages;
end;
DC.SetDefaultPrinter(DC.NewPrinterName);
IE.ExecWB(6,2,emptyparam,emptyparam);
RVal := DC.Create; // Cria documento de saída
IE.Quit; // finaliza InternetExplorer
If (RVal <> 0) Then
ShowMessage('Erro ao criar documento!!! Código: ' + IntToStr(RVal) )
else
//ShowMessage('Documento html convertido para pdf!!!');
DC.SetDefaultPrinter(defPrinter);
resultado := RelInfo.Localtmp + 'P216739' + '.pdf';
except
on E: Exception do
ShowMessage(E.Message);
end
finally
RVal:= DC.StopPrinting;
//if (RVal <> 0) Then ShowMessage('Erro ao chamar o método StopPrinting!!');
DC:= Unassigned;
IE:= Unassigned;
end;
Result := resultado;
end;
Basicamente isso aí hehehe, o mais difícil foi achar o componente e legalizar... :) e viva o SoftwareLivre!
Mas como eu já tinha dito em post anterior, isso é responsabilidade da ADOBE, ela deveria ter uma API pra conversão...como não tem, um abraço!
[]'s