Convert from RTF to Plain Text in SQL Server

2

I have a column in sql, where from an application I save data in rtf format, I would like to pass it to xml to use in a webservices. Is there any way to achieve this?

Here's the example rtf:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\fnil\fcharset0 MS Sans Serif;}}  {\colortbl;\red0\green0\blue0;\red255\green0\blue0;\red0\green132\blue125;\red8\green0\blue0;}  {\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\qj\cf1\lang2058\b\f0\fs24 SALIDA  CIRCUITO : \cf2 Salidas diarias \par  \pard\fs18\par  \cf3\lang11274\fs22 D\'eda 01. CIUDAD DE M\'c9XICO\par  \cf1\b0 Recepci\'f3n en el Aeropuerto de la Ciudad de M\'e9xico y traslado al hotel de su elecci\'f3n. Tiempo libre. Alojamiento.\par  \par  \cf3\b D\'eda 02. CIUDAD DE M\'c9XICO \endash  VISITA DE CIUDAD Y MUSEO DE ANTROPOLOG\'cdA\par  \pard\qj\cf1\b0  Cita alrededor de las 09:00 hrs en el lobby del hotel. En seguida disfrutar\'e1 de un paseo por las principales calles de la ciudad, comenzando en el centro\par  hist\'f3rico donde estuvo asentado \ldblquote la gran Tenochtitl\'e1n\rdblquote del imperio azteca. Visitaremos el z\'f3calo, la catedral metropolitana, el palacio nacional, el palacio de bellas artes, entre otros. Nuestro recorrido seguir\'e1 sobre avenida reforma donde observar\'e1 diversos monumentos que le han dado forma e identidad a la ciudad como el \'e1ngel de la independencia, la diana cazadora y la columna del bicentenario. Llegada al museo de antropolog\'eda, uno de los museos m\'e1s importantes del mundo por albergar la m\'e1s vasta colecci\'f3n antropol\'f3gica delas culturas mesoamericanas.\par   Tarde libre o regreso al hotel. Alojamiento.\par  \cf2\lang2058\b\par  \pard\cf3\lang11274 D\'eda 03. CIUDAD DE MEXICO\par  \pard\qj\cf1\b0  Tiempo libre hasta el horario convenido para el traslado de salida.\cf2\lang2058\b\par  \pard\cf4\lang1033\b0\f1\fs17\par  }  
    
asked by npalle 29.01.2018 в 21:02
source

1 answer

4

** I found the solution **

1- Create the following function in the database

 SET ANSI_NULLS ON
 GO
 SET QUOTED_IDENTIFIER ON
 GO

 CREATE FUNCTION [dbo].[RTF2Text]
 (
  @rtf nvarchar(max)
 )
 RETURNS nvarchar(max)
 AS
BEGIN
  DECLARE @Pos1 int;
  DECLARE @Pos2 int;
  DECLARE @hex varchar(316);
  DECLARE @Stage table
  (
    [Char] char(1),
    [Pos] int
  );

INSERT @Stage
    (
       [Char]
     , [Pos]
    )
SELECT SUBSTRING(@rtf, [Number], 1)
     , [Number]
  FROM [master]..[spt_values]
 WHERE ([Type] = 'p')
   AND (SUBSTRING(@rtf, Number, 1) IN ('{', '}'));

SELECT @Pos1 = MIN([Pos])
     , @Pos2 = MAX([Pos])
  FROM @Stage;

DELETE
  FROM @Stage
 WHERE ([Pos] IN (@Pos1, @Pos2));

WHILE (1 = 1)
    BEGIN
        SELECT TOP 1 @Pos1 = s1.[Pos]
             , @Pos2 = s2.[Pos]
          FROM @Stage s1
            INNER JOIN @Stage s2 ON s2.[Pos] > s1.[Pos]
         WHERE (s1.[Char] = '{')
           AND (s2.[Char] = '}')
        ORDER BY s2.[Pos] - s1.[Pos];

        IF @@ROWCOUNT = 0
            BREAK

        DELETE
          FROM @Stage
         WHERE ([Pos] IN (@Pos1, @Pos2));

        UPDATE @Stage
           SET [Pos] = [Pos] - @Pos2 + @Pos1 - 1
         WHERE ([Pos] > @Pos2);

        SET @rtf = STUFF(@rtf, @Pos1, @Pos2 - @Pos1 + 1, '');
    END

SET @rtf = REPLACE(@rtf, '\pard', '');
SET @rtf = REPLACE(@rtf, '\par', '');
SET @rtf = STUFF(@rtf, 1, CHARINDEX(' ', @rtf), '');
SET @rtf = REPLACE(@rtf, '\ulnone', '');
SET @rtf = REPLACE(@rtf, '\ul', '');
SET @rtf = REPLACE(@rtf, '{', '');
SET @rtf = REPLACE(@rtf, 'Msftedit 5.41.21.2510;}', '');

WHILE (Right(@rtf, 1) IN (' ', CHAR(13), CHAR(10), '}'))
  BEGIN
    SELECT @rtf = SUBSTRING(@rtf, 1, (LEN(@rtf + 'x') - 2));
    IF LEN(@rtf) = 0 BREAK
  END

SET @Pos1 = CHARINDEX('\''', @rtf);

WHILE @Pos1 > 0
    BEGIN
        IF @Pos1 > 0
            BEGIN
                SET @hex = '0x' + SUBSTRING(@rtf, @Pos1 + 2, 2);
                SET @rtf = REPLACE(@rtf, SUBSTRING(@rtf, @Pos1, 4),
                CHAR(CONVERT(int, CONVERT (binary(1), @hex,1))));
                SET @Pos1 = CHARINDEX('\''', @rtf);
            END
    END

SET @rtf = @rtf + ' ';

SET @Pos1 = PATINDEX('%\%[0123456789][\ ]%', @rtf);

WHILE @Pos1 > 0
    BEGIN
        SET @Pos2 = CHARINDEX(' ', @rtf, @Pos1 + 1);

        IF @Pos2 < @Pos1
            SET @Pos2 = CHARINDEX('\', @rtf, @Pos1 + 1);

        IF @Pos2 < @Pos1
            BEGIN
                SET @rtf = SUBSTRING(@rtf, 1, @Pos1 - 1);
                SET @Pos1 = 0;
            END
        ELSE
            BEGIN
                SET @rtf = STUFF(@rtf, @Pos1, @Pos2 - @Pos1 + 1, '');
                SET @Pos1 = PATINDEX('%\%[0123456789][\ ]%', @rtf);
            END
    END

IF RIGHT(@rtf, 1) = ' '
    SET @rtf = SUBSTRING(@rtf, 1, LEN(@rtf) -1);

RETURN @rtf;
END

2-

SELECT [MiColumna], [dbo].[RTF2Text]([MiColumna]) AS [TextConvertidoRTF]
FROM [dbo].[Mitabla]
    
answered by 29.01.2018 / 22:02
source