Page 1 of 1

Recover the Filename of Picture when Html Saving

Posted: Fri Aug 01, 2008 2:34 pm
by remixtech
Hello,

I would like to recover the filename of picture (background of a table)... and i don't know how to recover it...

This code showme the location of image in the document

Code: Select all

procedure Tf_ecriture.editeurHTMLSaveImage(Sender: TCustomRichView;
  RVData: TCustomRVData; ItemNo: Integer; const Path: string;
  BackgroundColor: TColor; var Location: string; var DoDefault: Boolean);
begin
showmessage('SaveImage : ' + location);
if location <> '' then      begin

    Location := '';
    DoDefault := False;
end;

end;
And to recover the filename of the picture in the table background, i am using this : But messagebox show me 'Saveimage2 : , ,'

How to recover the filename (and the location) of the picture ?

Code: Select all

procedure Tf_ecriture.editeurSaveImage2(Sender: TCustomRichView;
  Graphic: TGraphic; SaveFormat: TRVSaveFormat; const Path,
  ImagePrefix: string; var ImageSaveNo: Integer; var Location: string;
  var DoDefault: Boolean);
begin
  if SaveFormat = rvsfHTML then
  begin
  showmessage('SaveImage2 : ' + location+','+imageprefix+','+path);
    Location := '';
    DoDefault := False;
  end;
end;
Thanks a lot

Posted: Fri Aug 01, 2008 7:29 pm
by remixtech
I had picture like this : (for the test)

Code: Select all

var
  lafenetre: tf_dlpicture;
  gr: TGraphic;
  pic: TPicture;
  generatefilename: string;
  fs: tfilestream;
begin
  randomize;
  lafenetre := tf_dlpicture.Create(self);
  try

    if lafenetre.ShowModal = mrOk then
    begin
      generatefilename := rightstr(lafenetre.ed_url.Text, length(lafenetre.ed_url.Text) - invpos('/', lafenetre.ed_url.text));

      while fileexists(f_principale.chemin + 'temp\' + generatefilename) do
        generatefilename := inttostr(random(10)) + generatefilename;

      try
        fs := tfilestream.Create(f_principale.chemin + 'temp\' + generatefilename, fmcreate);

        DownloadHTTP(lafenetre.ed_url.Text, tstream(fs));

      finally
        fs.Free;

      end;
      try
        pic := TPicture.Create;
        try

          pic.LoadFromFile(f_principale.chemin + 'temp\' + generatefilename);
          gr := RV_CreateGraphics(TGraphicClass(pic.Graphic.ClassType));
          gr.Assign(pic.Graphic);
        finally
          pic.Free;
          deletefile(f_principale.chemin + 'temp\' + generatefilename);
        end;
        if gr <> nil then
          editeur.InsertPicture(lafenetre.ed_url.text, gr, rvvaBaseLine);
      except
        Application.MessageBox(PChar('Cannot read picture from file.'), 'Error',
          MB_OK or MB_ICONSTOP);
      end;

    end;

  finally
    lafenetre.Free;
  end;

Posted: Fri Aug 01, 2008 7:31 pm
by Sergey Tkachenko
All these events occur BEFORE image saving. At this point, the location of the image is not defined yet.
Location is an output parameter in these events. In OnHTMLSaveImage, it is not empty only if vsoUseItemImageFileNames is included in the Options parameter of SaveHTML/SaveHTMLEx, and rvespImageFileName property of the image item is not empty.
There is no event occuring after the image saving, when Location is defined. If you want to know a list of images in this HTML, you need write code for saving pictures yourself in one of these events (you can use Sender.SavePicture method).

Can you explain what do you want to implement? I'll try to help.

Posted: Fri Aug 01, 2008 7:51 pm
by remixtech
With trichviewaction i add some pictures on the documents, i add also other pictures from the web like this:

Code: Select all

editeur.InsertPicture(lafenetre.ed_url.text, gr, rvvaBaseLine); 
I would like to change all the filename or URL (because with this function i store URL) with Content id (i am developping a mail client)..

In the editeurHTMLSaveImage i recover the real url or filename, and i replace it to the real content id...

Exemple
Moon.jpg will become cid:djsgkjfdkjgdfs@onkeysoft in the html file
and i store in the attachment file moon.jpg

Have you understand ?

Thanks

Posted: Fri Aug 01, 2008 7:53 pm
by remixtech
This is my function :

Code: Select all

function tf_ecriture.givemecid: string;
var
  buffer: string;
begin
  randomize;
  buffer := inttostr(random(9999999999)) + 'IMAIL' + inttostr(random(9999999999)) + '@onkeysoft';

  while liste_cid.IndexOf(buffer) <> -1 do
    buffer := inttostr(random(9999999999)) + 'IMAIL' + inttostr(random(9999999999)) + '@onkeysoft';

  result := buffer;
end;

procedure Tf_ecriture.editeurHTMLSaveImage(Sender: TCustomRichView;
  RVData: TCustomRVData; ItemNo: Integer; const Path: string;
  BackgroundColor: TColor; var Location: string; var DoDefault: Boolean);
var
  cid: string;
begin

  if location <> '' then
  begin

    location := trim(location);
    if uppercase(leftstr(location, 7)) <> 'HTTP://' then
    begin
     if liste_images.IndexOf(location) <>-1 then begin
              cid := liste_cid.Strings[liste_images.IndexOf(location)];

      Location := 'cid:' +cid;

     end else begin


      cid := givemecid;
      liste_images.Add(location);
      liste_cid.Add(cid);
      Location := 'cid:' +cid;

     end;


    end;

    DoDefault := False;
  end;

end;

Posted: Fri Aug 01, 2008 8:42 pm
by remixtech
Hum after investigation :

I have found some solutions :

Code: Select all

  rvActionInsertPicture1.StoreFileName := true;
  rvActionTableProperties1.StoreImageFileName := true;

editeur.SetCurrentItemExtraStrProperty(rvespImageFileName,lafenetre.ed_url.text,true);
Do you have any other solutions ?

Posted: Fri Aug 01, 2008 9:11 pm
by remixtech
Hum it's okay for a lot of thing, but for background... It is impossible to add a rvespImageFileName...

Is there a solution or must I implement it ?

Thanks a lot,

Posted: Tue Aug 05, 2008 3:45 pm
by Sergey Tkachenko
Yes, if image file name is specified in the proper property for picture, table or table cell, it is assigned as a default value of Location parameter in OnHTMLSaveImage.
But for the main background, file name is not stored. You must store it somewhere yourself.
This event stores the main background if (RVData=Sender.RVData) and (ItemNo<0).

Posted: Wed Aug 06, 2008 3:18 pm
by remixtech
Okay ;) thanks,