Ottenere un file RTF da un file UTF8 e viceversa con le funzioni esterne del API di Librtfcomp

Da Gambas-it.org - Wikipedia.

La libreria Librtfcomp, scritta da J. A. Gow, consente di convertire in modo semplice un file UTF8 in un file RTF (Rich Text Format) e viceversa.

Per poter fruire in Gambas delle risorse fornite da questa libreria, bisogna installare e richiamare la libreria dinamica condivisa: "librtfcomp.so.0.0.0"


Convertire un file UTF8 in un file RTF

Per convertire un file UTF8 in un file RTF, potremo utilizzare questo codice:

Private HEADER As String = "\\ansi \\deff0{\\fonttbl{\\f0\\fnil\\fcharset0\\fprq0 Tahoma;}{\\f1\\froman\\fcharset2\\fprq2" &
                           "Symbol;}{\\f2\\fswiss\\fcharset204\\fprq2;}}{\\colortbl;\\red0\\green0\\blue0;\\red128\\green128" &
                           "\\blue128;\\red192\\green192\\blue192;\\red255\\green255\\blue255;\\red255\\green0\\blue0;\\red0" &
                           "\\green255\\blue0;\\red0\\green0\\blue255;\\red0\\green255\\blue255;\\red255\\green0\\blue255;" &
                           "\\red255\\green255\\blue0;\\red128\\green0\\blue0;\\red0\\green128\\blue0;\\red0\\green0" &
                           "\\blue128;\\red0\\green128\\blue128;\\red128\\green0\\blue128;\\red128\\green128\\blue0;}\x0a"

Library "librtfcomp:0.0.0"

Public Struct RTFOPTS
  lenOpts As Integer
  isCompressed As Integer
End Struct

' int LZRTFConvertUTF8ToRTF(unsigned char ** rtfout, unsigned int * lenOut, unsigned char * utfin, unsigned int len, unsigned char * rtfhdr, unsigned int hdrlen, RTFOPTS * options)
' Convert an UTF8-encoded string to a RTF encoded one.
Private Extern LZRTFConvertUTF8ToRTF(utfout As Pointer, lenout As Pointer, utfin As Byte[], lenI As Integer, rtfhdr As String, hdrlen As Integer, options As RTFOPTS) As Integer


Public Sub Main()

 Dim buffEx As Pointer
 Dim opt As New RTFOPTS
 Dim FileEn As String
 Dim outlen, ris As Integer
 Dim buffEn, bb As Byte[]
 Dim flEn As File
 Dim stEx As Stream
 
  FileEn = "/percorso/del/file/di/testo/UTF8"
   
  With opt
    .lenOpts = Object.SizeOf(RTFOPTS)
    .isCompressed = 0
  End With
   
  flEn = Open FileEn For Read
  buffEn = New Byte[Stat(FileEn).Size]
  buffEn.Read(flEn, 0, Stat(FileEn).Size)
 
  If buffEn.Count > 0 Then
    Print "Vi sono "; buffEn.Count; " byte in entrata da convertire in RTF"
 
    ris = LZRTFConvertUTF8ToRTF(VarPtr(buffEx), VarPtr(outlen), buffEn, buffEn.Count, HEADER, Len(HEADER), opt)
    If ris <> 0 Then Error.Raise("Impossibile effettuare la conversione !")

    Print "Conversione effettuata, byte in uscita: "; outlen

    bb = New Byte[outlen]
    stEx = Memory buffEx For Read Write
    bb.Read(stEx)

    File.Save("/percorso/del/file.rtf", bb.ToString(0, bb.Count))
  Else
    Error.Raise("Byte da convertire assenti !")
  Endif

' Va in chiusura:
  stEx.Close
  flEn.Close

End


Convertire un file RTF in un file UTF8

Per convertire un file RTF in un file UTF8, potremo utilizzare questo codice:

Library "librtfcomp:0.0.0"

Public Struct RTFOPTS
  lenOpts As Integer
  isCompressed As Integer
End Struct

' int LZRTFConvertRTFToUTF8(unsigned char ** utfout, unsigned int * utflen, unsigned char * rtfin, unsigned int rtflen, RTFOPTS * options)
' Convert an RTF-encoded string to a UTF-8 encoded one.
Private Extern LZRTFConvertRTFToUTF8(utfout As Pointer, utflen As Pointer, rtfin As Byte[], rtflen As Integer, options As RTFOPTS) As Integer


Public Sub Main()

 Dim buffEx As Pointer
 Dim opt As New RTFOPTS
 Dim FileEn As String
 Dim outlen, ris As Integer
 Dim buffEn, bb As Byte[]
 Dim flEn As File
 Dim stEx As Stream
      
  FileEn = "/percorso/del/file.rtf"
   
  With opt
    .lenOpts = Object.SizeOf(RTFOPTS)
    .isCompressed = 0
  End With
  
  flEn = Open FileEn For Read
  buffEn = New Byte[Stat(FileEn).Size]
  buffEn.Read(flEn, 0, Stat(FileEn).Size)
  
  If buffEn.Count > 0 Then
    Print "Vi sono "; buffEn.Count; " byte in entrata da convertire in UTF8"
     
    ris = LZRTFConvertRTFToUTF8(VarPtr(buffEx), VarPtr(outlen), buffEn, buffEn.Count, opt)
    If ris <> 0 Then Error.Raise("Impossibile effettuare la conversione !")
     
    Print "Conversion effettuata, byte in uscita: "; outlen
     
    bb = New Byte[outlen]
    stEx = Memory buffEx For Read Write
    bb.Read(stEx)
    
    File.Save("/percorso/del/file/UTF8", bb.ToString(0, bb.Count))
  Else
    Error.Raise("Byte da convertire assenti !")
  Endif

' Va in chiusura:
  stEx.Close
  flEn.Close

End