Что нового

Извлечение текстовых данных из формата RTF(raw)

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Доброго времени суток.

Требуется извлекать только текстовые данные из RTF(raw), пример:
Код:
События А1…Аn не могут быть случаями, если они 
События А…Ане могут быть случаями, если они 
{\rtf1\ansi\ansicpg1251\deff0{\fonttbl{\f0\froman\fprq2\fcharset204{\*\fname Times New Roman;}Times New Roman CYR;}}
\viewkind4\uc1\pard\lang1049\f0\fs28\'d1\'ee\'e1\'fb\'f2\'e8\'ff \i\'c0\sub 1\nosupersub\'85\'c0\lang1033\sub n\lang1049\nosupersub\i0  \'ed\'e5 \'ec\'ee\'e3\'f3\'f2 \'e1\'fb\'f2\'fc \'f1\'eb\'f3\'f7\'e0\'ff\'ec\'e8, \'e5\'f1\'eb\'e8 \'ee\'ed\'e8 \par
}
Строка 1: Требуемый результат
Строка 2: Текущий результат ( не верный )
Далее >: RTF(raw)

В спешке написал следующую функцию, но ее недостаточно (возвращает данные вида Строка 2):
Код:
Func _RtfToStr( $sRtf_raw )
	Local $aExp, $sRet, $Idx
	; ---
	$aExp = StringRegExp( $sRtf_raw, "\'([^\\]+)\\", 3, StringInStr( $sRtf_raw, "\fs28\" ) )
	For $Idx = 0 To UBound( $aExp ) - 1 Step 1
		If StringRegExp( $aExp[$Idx], '^[0-9a-f]{2}' ) Then
			$sRet &= BinaryToString( "0x" & StringLeft( $aExp[$Idx], 2 ) ) & StringTrimLeft( $aExp[$Idx], 2 )
		Else
			$sRet &= $aExp[$Idx]
		EndIf
	Next
	Return StringRegExpReplace( $sRet, "(\\|[\r\n]*)", "" )
EndFunc


Ранее я не сталкивался лоб в лоб с этим форматом... и разбираться сейчас в нем нет ни времени, ни желания. Может у кого есть наработки? Заранее благодарю.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Откройте в WordPad'е "сырой" rtf и заберите чистый текст.
Код:
$FileName = "raw.rtf"
Run(@ProgramFilesDir & "\Windows NT\Accessories\wordpad.exe " & @ScriptDir & "\" & $FileName)
$Text = ControlGetText(WinWaitActive($FileName), "", "RICHEDIT50W1")
WinClose($FileName)
ConsoleWrite($Text & @CRLF)
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
InnI
Боюсь это невозможно. Исходного текста слишком много ( весь в RTF, местами подключены изображения ), более того - он упакован ( расшифровывается в процессе работы программы ). На вход поступает маска, исходя из которой нужно найти связанное содержимое.

Не вариант в процессе поиска открывать >1к строк в WordPad'е. Нужно именно извлечение текстовых данных.
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Код:
$aExp = StringRegExp( $sRtf_raw, "\'([^\\]+)\\|sub (.+?)\\|([ ])\\", 3, StringInStr( $sRtf_raw, "\fs28\" ) )

Но не факт, что это ещё на чём-нибудь не вспоткнётся.
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
InnI
Как раз только прочитал ту тему.

Маска генерируется из другого RichEdit. Ранее я получал текст через WM_GETTEXT ( ибо для реализации StreamToVar(внешнее приложение )) придется изрядно попотеть. Теперь:

Ctrl+A
Ctrl+C
Код:
Func _PetsPwned_GetRtfRaw()
	If Not _ClipBoard_Open(0) Then _
		Return 0

	Local $iFormat, $hMemory, $pBuffer, $iBufSize, $tData, $sRet
	; ---
	$iFormat = _ClipBoard_RegisterFormat("Rich Text Format")
	$hMemory = _ClipBoard_GetDataEx($iFormat)
	Do
		If Not $hMemory Then _
			ExitLoop

		$pBuffer = _MemGlobalLock($hMemory)
		If Not $pBuffer Then _
			ExitLoop
		; *
		$iBufSize = _MemGlobalSize($hMemory)
		If $iBufSize Then
			$tData = DllStructCreate( "char Buf[" & $iBufSize & "]", $pBuffer )
			$sRet = $tData.Buf
		EndIf

		_MemGlobalUnlock($hMemory)
	Until True
	_ClipBoard_Close()
	; ---
	Return $sRet
EndFunc


И уже в таком виде маску гораздо легче видоизменять.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
#include <GuiRichEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hForm1 = GUICreate("", 320, 165, -1, -1)
$hRichEdit = _GUICtrlRichEdit_Create($hForm1, "", 10, 10, 300, 100, _
            BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
$iButton = GUICtrlCreateButton("Open", 235, 130, 75, 25)
GUISetState()

While 1
   $iMsg = GUIGetMsg()
   Switch $iMsg
	  Case $GUI_EVENT_CLOSE
		 GUIDelete()
		 Exit
	  Case $iButton
		 _GUICtrlRichEdit_SetText($hRichEdit, "")
		 _GUICtrlRichEdit_StreamFromFile($hRichEdit, @ScriptDir &"\18571.rtf")
		 ConsoleWrite(StringStripWS(_GUICtrlRichEdit_GetText($hRichEdit),3) & @CR)
   EndSwitch
WEnd
 

Вложения

  • 18571.zip
    20.5 КБ · Просмотры: 7
Верх