Nell’esempio seguente, viene mostrato un modo per eseguire il parsing di un file RTF, andando ad estrarne le immagini contenute, e creando uno stream visualizzabile all’interno di un controllo di tipo PictureBox. I dettagli del funzionamento vengono riportati nei commenti a corredo.
Public
Class Form1
' ==========================================================================
' ==========================================================================
Public
Sub EstraiImmagine(rtfString
As
String, posImage
As
Integer========================================================================
, pBox
As
PictureBox)
' ============================================================================
Public
Function ConvertiBuffer(datiHex
As
' formato fruibile da un MemoryStream, ovvero un array di bytes
String)
As
Byte()
Dim numHex
As
Integer = datiHex.Length
For i
As
Integer = 0
To numHex - 1 End
Class
Imports System.Text
Private
Sub Form1_Load(sender
As
Object, e
As
EventArgs)
Handles
MyBase.Load
' Acquisiamo il testo di un ipotetico file RTF come stringa
' Il file deve contenere una o più immagini, ed eventualmente
altri elementi a piacere
Dim
rtfString As
String =
File.ReadAllText("c:\tmp\doc.rtf")
' Verifichiamo il numero di occorrenze del tag PICT, ovvero
il numero di immagini
' presenti nel file
Dim
occorrenze() As
Integer = PosOccorrenzeImmagini(rtfString)
' Visualizziamo una tra le immagini (nell'esempio la numero
0, ovvero la prima),
' presentandola in un ipotetico PictureBox di nome PictureBox1
EstraiImmagine(rtfString, occorrenze(0), PictureBox1)
End
Sub
' Funzione PosOccorrenzeImmagini
' Dato il testo RTF di un file, esegue il parsing dello stesso
alla ricerca
' di tag PICT, restituendo un array di posizioni di tali tag all'interno
del
' =as;color:black;background-color:white;"> ' Funzione PosOccorrenzeImmagini
Public
Function PosOccorrenzeImmagini(rtfString
As
String)
As
Integer()
Dim
_tIdx As
New
List(Of
Integer)
Dim
_tStr As
String = rtfString
While
_tStr.Length > 0
Dim
_tPos As
Integer = _tStr.IndexOf("{\pict\")
If
_tPos = -1 Then
Exit While
_tIdx.Add(_tPos)
_tStr = _tStr.Substring(_tPos + 1)
End
While
Return
_tIdx.ToArray
End
Function
' Funzione EstraiImmagine
' Dato il testo RTF di un file, il numero ordinale dell'immagine
da reperire
' ed il controllo PictureBox su cui visualizzare l'immagine, estrae
dal testo
' i dati dell'immagine, e ne effettua la rappresentazione grafica
' ==========================================================================
Dim
pictTagIdx As
Integer = posImage
Dim
startIndex As
Integer = rtfString.IndexOf("
", pictTagIdx) + 1
Dim
endIndex As
Integer = rtfString.IndexOf("}",
startIndex)
Dim buffer()
As
Byte = ConvertiBuffer(rtfString.Substring(startIndex, endIndex - startIndex))
Dim
mStream As
New
MemoryStream(buffer)
pBox.Image =
Image.FromStream(mStream)
mStream.Dispose()
End
Sub
' Funzione ConvertiBuffer
' Utilizzata da EstraiImmagine(): a fronte della lettura di una
serie di bytes
' in formato esadecimale, questa funzione ne esegue la conversione
verso un
' formato fruibile da un MemoryStream, ovvero un array di bytes
' ============================================================================
' ============================================================================
If
(datiHex.CompareTo(String.Empty) = 0)
Then
Return
Nothing
End
If
Dim
_size As
Integer = numHex / 2
Dim
_bit(_size) As
Byte
Dim
hex As
New
StringBuilder
Dim
pos As
Integer = 0
Dim
c As
Char = datiHex(i)
If
Char.IsWhiteSpace(c)
Then
Continue For
hex.Append(c)
If
hex.Length = 2 Then
_bit(pos) =
Byte.Parse(hex.ToString(), System.Globalization.NumberStyles.HexNumber)
pos += 1
hex.Remove(0, 2)
End
If
Next
Return
_bit
End
Function