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.043
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.043
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.043
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
  #7  
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
Ahora regresa un PDF en blanco

La pagina que debo de imprimir es esta: https://siat.sat.gob.mx/app/qr/faces..._BIHE8804258H1

No se si a ti te regrese el pdf con el contenido
Responder Con Cita
  #8  
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.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
A mí me dice: "Printer is not currently printing".
Supongo que será porque no tengo impresora.
Responder Con Cita
  #9  
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.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Vale, parece que va por buen camino, he conseguido crear un pdf, aunque con el contenido "raro"
Imágenes Adjuntas
Tipo de Archivo: pdf archivo.pdf (26,8 KB, 2 visitas)
Responder Con Cita
  #10  
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
Vale, parece que va por buen camino, he conseguido crear un pdf, aunque con el contenido "raro"
Intente hacerlo con fastReport soltando un objeto tipo HTML e ingresando el código y el contenido se visualiza perfecto pero el requerimiento es que venga tal cual el sitio

No se como hacerlo porque el sitio contiene css y demas, vi que guardando el sitio en formato .MHTML si se mantiene todo en archivo, el tema es como imprimir ese MHTML

Responder Con Cita
  #11  
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.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Desconozco ese tema
Por probar, he preguntado al chatgpt y dice esto:
Código Delphi [-]
uses
  ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
  FileName: string;
begin
  // Ruta completa al archivo MHTML que deseas imprimir
  FileName := 'C:\ruta\al\archivo.mhtml';

  // Cargar el archivo MHTML en el TWebBrowser
  WebBrowser1.Navigate('file://' + FileName);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  OLECMDID_PRINT2: Integer;
  OLECMDEXECOPT_DONTPROMPTUSER: Integer;
begin
  // Constantes específicas para impresión en MHTML
  OLECMDID_PRINT2 := 6;
  OLECMDEXECOPT_DONTPROMPTUSER := 2;

  // Imprimir el contenido del TWebBrowser
  if WebBrowser1.OleObject.DocumentLoaded then
  begin
    WebBrowser1.OleObject.ExecWB(OLECMDID_PRINT2, OLECMDEXECOPT_DONTPROMPTUSER);
  end;
end;
Responder Con Cita
  #12  
Antiguo 06-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
Desconozco ese tema
Por probar, he preguntado al chatgpt y dice esto:
Código Delphi [-]
uses
  ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
  FileName: string;
begin
  // Ruta completa al archivo MHTML que deseas imprimir
  FileName := 'C:\ruta\al\archivo.mhtml';

  // Cargar el archivo MHTML en el TWebBrowser
  WebBrowser1.Navigate('file://' + FileName);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  OLECMDID_PRINT2: Integer;
  OLECMDEXECOPT_DONTPROMPTUSER: Integer;
begin
  // Constantes específicas para impresión en MHTML
  OLECMDID_PRINT2 := 6;
  OLECMDEXECOPT_DONTPROMPTUSER := 2;

  // Imprimir el contenido del TWebBrowser
  if WebBrowser1.OleObject.DocumentLoaded then
  begin
    WebBrowser1.OleObject.ExecWB(OLECMDID_PRINT2, OLECMDEXECOPT_DONTPROMPTUSER);
  end;
end;
Esto funciono de maravilla, aunque no se si sea posible ocultar el dialog de guardar archivo que se genera y que en el PDF no se imprima en el header y en el footer información del navegador

Gracias por tu aporte casimiro!
Responder Con Cita
  #13  
Antiguo 06-07-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Sí que se puede, tienes que configurarlo en el navegador.
Cada navegador tiene opción de elegir una impresora predeterminada y que no pregunte.
Claro, ahí tendrás que configurar el que usa cada usuario.
Responder Con Cita
  #14  
Antiguo 06-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
Sí que se puede, tienes que configurarlo en el navegador.
Cada navegador tiene opción de elegir una impresora predeterminada y que no pregunte.
Claro, ahí tendrás que configurar el que usa cada usuario.
Listo, lo logre gracias a este programita: https://wkhtmltopdf.org/

Solamente hay que incluir la dll y el exe y mandarlo a llamar desde el cmd, seria algo así: wkhtmltopdf http://google.com google.pdf

Gracias por tu tiempo Casimiro
Responder Con Cita
  #15  
Antiguo 06-07-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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 14:41:52.


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