Saludos amigos,
Tengo la siguiente unidad:
Código Delphi
[-]
unit uPrincipal;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Data.DB, Vcl.Grids, Vcl.DBGrids, System.NetEncoding,
Vcl.OleCtrls, SHDocVw;
type
TfrmPrincipal = class(TForm)
Label1: TLabel;
txtIDDoc: TEdit;
Label2: TLabel;
txtTituloPDF: TEdit;
Label3: TLabel;
btnAbrirPDF: TButton;
open: TOpenDialog;
Label4: TLabel;
gridArchivos: TDBGrid;
web: TWebBrowser;
Label5: TLabel;
procedure btnAbrirPDFClick(Sender: TObject);
procedure gridArchivosCellClick(Column: TColumn);
private
public
function PDFToBase64(const FilePath: string): string;
procedure ViewPDFInWebBrowser(WebBrowser: TWebBrowser; const Base64Str: string);
end;
var
frmPrincipal: TfrmPrincipal;
implementation
uses
uDM;
{$R *.dfm}
procedure TfrmPrincipal.ViewPDFInWebBrowser(WebBrowser: TWebBrowser; const Base64Str: string);
var
MemoryStream: TMemoryStream;
DataUrl: string;
ByteStream: TStringStream;
Bytes: TBytes;
begin
MemoryStream := TMemoryStream.Create;
Bytes := TEncoding.UTF8.GetBytes(Base64Str);
MemoryStream.Clear;
MemoryStream.WriteBuffer(Bytes[0], Length(Bytes));
MemoryStream.Position := 0;
try
ByteStream := TStringStream.Create;
try
MemoryStream.Position := 0;
ByteStream.LoadFromStream(MemoryStream);
DataUrl := 'data:application/pdf;base64,' + TNetEncoding.Base64.EncodeBytesToString(ByteStream.Bytes);
WebBrowser.Navigate('about:blank');
WebBrowser.OleObject.Document.Write(VarArrayOf([DataUrl])); WebBrowser.Refresh;
finally
ByteStream.Free;
end;
finally
MemoryStream.Free;
end;
end;
function TfrmPrincipal.PDFToBase64(const FilePath: string): string;
var
FileStream: TFileStream;
Bytes: TBytes;
begin
FileStream := TFileStream.Create(FilePath, fmOpenRead or fmShareDenyWrite);
try
SetLength(Bytes, FileStream.Size);
FileStream.ReadBuffer(Bytes[0], FileStream.Size);
Result := TNetEncoding.Base64.EncodeBytesToString(Bytes);
finally
FileStream.Free;
end;
end;
procedure TfrmPrincipal.btnAbrirPDFClick(Sender: TObject);
var
insertedOk: boolean;
Base64PDF: string;
begin
if open.Execute then
begin
Base64PDF := PDFToBase64(open.FileName);
try
dm.q_SavePDF.Close;
dm.q_SavePDF.Params[0].AsInteger := StrToInt(txtIDDoc.Text);
dm.q_SavePDF.Params[1].AsString := Trim(txtTituloPDF.Text);
dm.q_SavePDF.Params[2].AsString := Base64PDF;
dm.q_SavePDF.ExecSQL;
insertedOk := True;
except
insertedOk := False;
end;
if not insertedOk then
begin
ShowMessage('Error: No se pudo Insertar el Registro');
Exit;
end
else
begin
ShowMessage('Ok: Registro Insertado!');
end;
end;
end;
procedure TfrmPrincipal.gridArchivosCellClick(Column: TColumn);
begin
ViewPDFInWebBrowser(web, gridArchivos.DataSource.DataSet.FieldByName('docPDF').AsString);
end;
end.
La grabacion funciona bien, cuando quiero ver el PDF haciendo clic en la grilla me aparece un error en la linea:
Código Delphi
[-]WebBrowser.OleObject.Document.Write(VarArrayOf([DataUrl]));
Alguien me daría una mano?
Atte
Americo