Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-07-2023
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 264
Poder: 2
pgranados Va por buen camino
Exportar pagina de WebBrowser a PDF

Buen día, busco exportar el contenido de un WebBrowser a un archivo PDF, tengo esta función pero el PDF que me descarga esta roto, directamente no abre (pero si tiene tamaño mayor a 0kb)

Código Delphi [-]
uses ActiveX;

function TForm1.PDF(Ruta:String):boolean;
var
  Stream : TFileStream;
  StreamAdapter: IStream;
  PersistStreamInit: IPersistStreamInit;

begin
 if not Assigned(Navegador.Document) then
  Exit;
 if Navegador.Document.QueryInterface(IPersistStreamInit, PersistStreamInit) = S_OK then
  begin
   Stream := TFileStream.Create(Ruta, fmCreate);
   try
    StreamAdapter := TStreamAdapter.Create(Stream);
    PersistStreamInit.Save(StreamAdapter, True);
   finally
    Stream.Free;
   end;
  end;
end;

A la función le paso la ruta destino del PDF, ¿alguna alternativa? Intenté con fastreport pero se ve feo porque la pagina también tiene CSS no solo HTML.

Saludos!
Responder Con Cita
  #2  
Antiguo 05-07-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Puede servir algo así?
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  RichEdit: TRichEdit;
  HTMLDocument: IHTMLDocument2;
  PrintRange: TFormatRange;
  PrinterHandle: HDC;
  FileName: string;
  FileStream: TFileStream;
begin
  RichEdit := TRichEdit.Create(Self);
  try
    RichEdit.Visible := False;
    RichEdit.Parent := Self; // Puedes ajustar esto según tu formulario o diseño.

    // Obtener el documento HTML del WebBrowser.
    HTMLDocument := (WebBrowser1.Document as IHTMLDocument2);

    // Copiar el contenido del documento HTML al RichEdit.
    RichEdit.PlainText := True;
    RichEdit.Lines.Text := HTMLDocument.body.innerHTML;

    // Imprimir el contenido del RichEdit en un archivo PDF.
    FileName := 'C:\ruta\archivo.pdf';
    FileStream := TFileStream.Create(FileName, fmCreate);
    try
      Printer.PrinterIndex := Printer.PrinterIndex; // Configurar la impresora actual.
      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 * Printer.PixelsPerInch div 1440,
        Printer.PageHeight * Printer.PixelsPerInch 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;
end;
Responder Con Cita
  #3  
Antiguo 05-07-2023
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 264
Poder: 2
pgranados Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Puede servir algo así?
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  RichEdit: TRichEdit;
  HTMLDocument: IHTMLDocument2;
  PrintRange: TFormatRange;
  PrinterHandle: HDC;
  FileName: string;
  FileStream: TFileStream;
begin
  RichEdit := TRichEdit.Create(Self);
  try
    RichEdit.Visible := False;
    RichEdit.Parent := Self; // Puedes ajustar esto según tu formulario o diseño.

    // Obtener el documento HTML del WebBrowser.
    HTMLDocument := (WebBrowser1.Document as IHTMLDocument2);

    // Copiar el contenido del documento HTML al RichEdit.
    RichEdit.PlainText := True;
    RichEdit.Lines.Text := HTMLDocument.body.innerHTML;

    // Imprimir el contenido del RichEdit en un archivo PDF.
    FileName := 'C:\ruta\archivo.pdf';
    FileStream := TFileStream.Create(FileName, fmCreate);
    try
      Printer.PrinterIndex := Printer.PrinterIndex; // Configurar la impresora actual.
      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 * Printer.PixelsPerInch div 1440,
        Printer.PageHeight * Printer.PixelsPerInch 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;
end;
Gracias por tu respuesta Casimiro, pero no me funciono en Delphi 10.4, de entrada no me reconoce la propiedad Printer.PixelsPerInch
Código Delphi [-]
PrintRange.rc := Rect(0, 0,
              Printer.PageWidth * Printer.PixelsPerInch div 1440,
              Printer.PageHeight * Printer.PixelsPerInch div 1440);

Modifique un poco el código que me diste y como quiera sigue sin cumplirse el objetivo, me imprime el html (codigo) en el documento.

¿Sabrás si hay otra forma de hacerlo? Saludos.
Responder Con Cita
  #4  
Antiguo 05-07-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Has añadido "printers" al "uses"?
Responder Con Cita
  #5  
Antiguo 05-07-2023
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 264
Poder: 2
pgranados Va por buen camino
Si, ¿el código te funciona a ti en Delphi 10,4?
Responder Con Cita
  #6  
Antiguo 05-07-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
    { Private declarations }
  public
    { Public declarations }
  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; // Puedes ajustar esto según tu formulario o diseño.

    // Obtener el documento HTML del WebBrowser.
    HTMLDocument := (WebBrowser1.Document as IHTMLDocument2);

    // Copiar el contenido del documento HTML al RichEdit.
    RichEdit.PlainText := True;
    RichEdit.Lines.Text := HTMLDocument.body.innerHTML;

    // Imprimir el contenido del RichEdit en un archivo PDF.
    FileName := 'C:\ruta\archivo.pdf';
    FileStream := TFileStream.Create(FileName, fmCreate);
    try
      Printer.PrinterIndex := Printer.PrinterIndex; // Configurar la impresora actual.
      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;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cambia pagina de error de WebBrowser? wolfran_hack Internet 1 03-07-2013 15:53:31
exportar datos de una página web a delphi utopico Internet 7 23-02-2011 12:51:56
WebBrowser no me recarga pagina hmrvivas Internet 0 10-08-2010 06:45:18
una imagen y una pagina en webbrowser cadina Internet 0 03-06-2008 22:20:14
Bajar una página sin un WebBrowser sarackganda Internet 2 29-06-2003 19:58:33


La franja horaria es GMT +2. Ahora son las 16:14:35.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi