A mí me sale error porque no tengo impresora, no sé si realmente funcionará.
De todas formas cambia algunas cosas, por probar que no quede:
Código Delphi
[-]unit Unit4;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, printers, RichEdit,
Vcl.OleCtrls, SHDocVw,MSHTML;
type
TForm4 = class(TForm)
Button1: TButton;
RichEdit1: TRichEdit;
WebBrowser1: TWebBrowser;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
var
RichEdit: TRichEdit;
HTMLDocument: IHTMLDocument2;
PrintRange: TFormatRange;
PrinterHandle: HDC;
FileName: string;
FileStream: TFileStream;
DPI: Integer;
begin
PrinterHandle := Printer.Canvas.Handle;
DPI := GetDeviceCaps(PrinterHandle, LOGPIXELSX);
RichEdit := TRichEdit.Create(Self);
try
RichEdit.Visible := False;
RichEdit.Parent := Self;
HTMLDocument := (WebBrowser1.Document as IHTMLDocument2);
RichEdit.PlainText := True;
RichEdit.Lines.Text := HTMLDocument.body.innerHTML;
FileName := 'C:\ruta\archivo.pdf';
FileStream := TFileStream.Create(FileName, fmCreate);
try
Printer.PrinterIndex := Printer.PrinterIndex; Printer.Title := FileName;
Printer.BeginDoc;
PrinterHandle := Printer.Canvas.Handle;
FillChar(PrintRange, SizeOf(PrintRange), 0);
PrintRange.hdc := PrinterHandle;
PrintRange.hdcTarget := PrinterHandle;
PrintRange.rc := Rect(0, 0,
Printer.PageWidth * DPI div 1440,
Printer.PageHeight * DPI div 1440);
PrintRange.rcPage := PrintRange.rc;
PrintRange.chrg.cpMax := -1;
SendMessage(RichEdit.Handle, EM_FORMATRANGE, 1, Longint(@PrintRange));
SendMessage(RichEdit.Handle, EM_FORMATRANGE, 0, 0);
Printer.EndDoc;
finally
FileStream.Free;
end;
finally
RichEdit.Free;
end;