|
Per salvare una pagina internet nel formato mht (tutto
incluso in un unico file) si può ricorrere ad una delle funzionalità incluse in
CDO.
Bene CDO = Collaborative Data Objects, e non è che ho chiarito tanto le cose ...
In sostanza si tratta di un insieme di oggetti COM che consentono la creazione
la manipolazione e l' invio di messaggi internet; basta dire che è in qualche
modo l' evoluzione delle MAPI (Messaging API) che vengono da anni utilizzate
fondamentalmente per l' invio di messaggi di posta elettronica. Bene, quando
creiamo un messaggio di posta elettronica possiamo inserire, oltre al testo,
immagini, html, allegati, etc... Il tutto viene ingabbiato in un unico file. La
tecnica per la creazione di tale file è la stessa che porta al salvataggio di
pagine internet nel formato mht da Internet Explorer. CDO prevede naturalmente
dei metodi per la creazione di messaggi email composti da immagini allegati,
etc... Utilizzeremo quindi CDO per salvare una pagina internet nel formato
mht. Incominciamo creando la unit pascal di import di CDO:
Project
Import type library
selezionare "Microsoft CDO for Windows 2000 Library (Version 1.0)
togliamo la spunta a "Generate Component Wrapper" e vai
col "Create Unit"
otteniamo la unit CDO_TLB.pas e la unit ADODB_TLB.pas
la interface principale che dovremo usare è IMessage che consente appunto la
manipolazione di messaggi.
La cosa migliore è passare subito alla definizione della
procedura di salvataggio di una pagina internet nel formato mht:
procedure Indirizzo2MHT(Indirizzo: String; NomeFile: string);
var
Messaggio: IMessage;
ConfigurazioneMessaggio: IConfiguration;
CorpoMessaggio: _Stream;
//_Stream è un tipo definito in ADO_TLB. Per questo che la unit CDO_TLB include
//la unit ADO_TLB
begin
//creo un messaggio
Messaggio := CoMessage.Create;
//creo la configurazione del messaggio
ConfigurazioneMessaggio := CoConfiguration.Create;
try
//assegno al messaggio la sua configurazione (fondamentale)
Messaggio.Configuration := ConfigurazioneMessaggio;
//vado a definire il CORPO del messaggio utilizzando il contenuto della pagina
//all' url Indirizzo: vengono aggregte tra loro le varie risorse a cui si fa
//riferimento nella pagina (immagini, etc...). Il CORPO del messaggio viene
//salvato in uno stream; vogliamo includere tutte le risorse a cui si fa
//riferimento nella pagina e quindi il 2° parametro del metodo IMessage.CreateMHTMLBody
//(tipo enumerativo Flags) va settato a CdoSuppressNone;
//gli ultimi 2 parametri sono rispettivamente utenza e password eventuali previste
//per l' accesso alla pagina;
//I valori che può assumere il tipo enumerativo CdoMHTMLFlags sono i seguenti
//CdoSuppressNone
//Valore = 0
//Inserisci nel file qualsiasi elemento (immagini, etc...) trovato nell' html
//dell' indirizzo (naturlamente non in maniera ricorsiva)
//CdoSuppressImages
//Valore = 1
//Non inserisce risorse nel tag IMG
//CdoSuppressBGSounds
//Valore = 2
//Non inserisce risorse nel tag BGSOUND.
//CdoSuppressFrames
//Valore = 4
//Non inserisce risorse nel tag FRAME.
//CdoSuppressObjects
//Valore = 8
//Non inserisce risorse nel tag OBJECT.
//CdoSuppressStyleSheets
//Valore = 16
//Non inserisce risorse nel tag LINK
//CdoSuppressAll
//Valore 31
//Non inserisce risorse (in pratica scarica solo l' html della pagina)
Messaggio.CreateMHTMLBody(Indirizzo, CdoSuppressNone, '', '');
//Ottengo lo stream che contiene il CORPO del messaggio
CorpoMessaggio := Messaggio.GetStream;
//salviamo lo stream su un file utilizzando il metodo SaveToFile della interface
//_Stream definita in ADO_TLB; adSaveCreateOverWrite significa che se il file è
//già esistente verrà sovrascritto
CorpoMessaggio.SaveToFile(NomeFile, adSaveCreateOverWrite);
finally
Messaggio := nil;
ConfigurazioneMessaggio := nil;
CorpoMessaggio := nil;
end;
end;
A questo punto si possono fare delle prove variando il valore del tipo enumerativo CdoHtmlFlags. Su www.codeproject.com viene descritto un altro metodo per il salvataggio in mht: è una vera e propria genialata; non è tanto utile in sè per il salvataggio in formato mht (l' esempio appena fatto è semplicissimo e rapidissimo) quanto per l' idea che può in effetti aprire il varco a tante soluzioni. Uno di questi giorni voglio trovare il tempo per descriverlo dettagliatamente e per farne una versione in Delphi; per chi se lo volesse guardare subito l' url è Automated IE SaveAs MHTML
|