Bonjour,
Je ne sais pas trop s'il faut que je poste ce message sur le forum Delphi ou celui de C# alors je le mets ici car le code Delphi est standard et fonctionne pour d'autres DLL.
Ne trouvant pas de librairie en Delphi pour convertir du RTF en HTML, j'ai essayer d'appeler une librairie C# depuis un programme Delphi.
Cette librairie peut être téléchargée à l'adresse suivante : https://code.msdn.microsoft.com/wind...F-and-aaa02a6e
Pour ne pas modifier cette librairie j'ai créé une petite DLL qui l'appelle et sur laquelle j'ai ouvert l'interop.
Si ça peut servir, j'ai ajouté un log (bien dégueulasse) pour tracer ce qui se passe et le résultat est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 using MarkupConverter; using System; using System.Globalization; using System.IO; using System.Runtime.InteropServices; namespace XXX.YYY.Services.Converter { public interface IComMarkupConverter { String RtfToHtml(String rtfText); } [Guid("708F0B54-3BD1-428E-8905-FE79383B37FF")] [ComVisible(true)] public class MarkupConverterService : IComMarkupConverter { /// <summary> /// Constructeur par défaut /// </summary> public MarkupConverterService() { } /// <summary> /// Méthode de conversion d'un contenu RTF vers du HTML /// </summary> /// <param name="rtfText">Contenu RTF</param> /// <returns>Contenu HTML</returns> public String RtfToHtml(String rtfText) { Log("Entering RtfToHtml()"); Log("RTF Content :" + Environment.NewLine + rtfText); Log("Creating converter..."); IMarkupConverter converter = new MarkupConverter.MarkupConverter(); Log("Converter successfully created"); String result = String.Empty; try { Log("Calling RTF to HTML conversion method..."); result = converter.ConvertRtfToHtml(rtfText); Log("Method return this HTML content :" + Environment.NewLine + result); } catch (Exception ex) { String message = "Method return an exception :" + Environment.NewLine + "Exception message : " + Environment.NewLine + ex.Message + Environment.NewLine + "Exception stack trace : " + Environment.NewLine + ex.StackTrace; Log(message); } return result; } /* CA 1822 : * Mark members as static */ static void Log(String log) { String logFileName = Path.Combine(Path.GetTempPath(), @"Converter\LogConverter.txt"); if (File.Exists(logFileName)) File.AppendAllText(logFileName, String.Format(CultureInfo.InvariantCulture, "{0} => {1}", DateTime.Now.ToLongTimeString(), log) + Environment.NewLine); } } }
Le même RTF (disponible sur la troisième ligne du log précédent) dans une application Windows Form en C# fonctionne avec uniquement ce code.15:59:06 => Entering RtfToHtml()
15:59:06 => RTF Content :
{\rtf1\ansi\ansicpg1252\deff0\deflang1036{\fonttbl{\f0\fnil\fcharset0 Calibri;}}{\colortbl ;\red255\green0\blue0;}{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sl240\slmult1\lang12\f0\fs22 Bonjour,\par Test en \cf1 couleur\cf0 , en \b gras\b0 , et en \i italique \i0 sur une m\'eame ligne.\par }
15:59:06 => Creating converter...
15:59:06 => Converter successfully created
15:59:06 => Calling RTF to HTML conversion method...
15:59:06 => Method return an exception :
Exception message :
Overflow or underflow in the arithmetic operation.
Exception stack trace :
at System.Windows.Thickness.op_Equality(Thickness t1, Thickness t2)
at System.Windows.Thickness.Equals(Object obj)
at System.Object.Equals(Object objA, Object objB)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
at System.Windows.StyleHelper.ApplyStyleOrTemplateValue(FrameworkObject fo, DependencyProperty dp)
at System.Windows.StyleHelper.InvalidateContainerDependents(DependencyObject container, FrugalStructList`1& exclusionContainerDependents, FrugalStructList`1& oldContainerDependents, FrugalStructList`1& newContainerDependents)
at System.Windows.StyleHelper.DoThemeStyleInvalidations(FrameworkElement fe, FrameworkContentElement fce, Style oldThemeStyle, Style newThemeStyle, Style style)
at System.Windows.StyleHelper.UpdateThemeStyleCache(FrameworkElement fe, FrameworkContentElement fce, Style oldThemeStyle, Style newThemeStyle, Style& themeStyleCache)
at System.Windows.FrameworkContentElement.OnThemeStyleChanged(DependencyObject d, Object oldValue, Object newValue)
at System.Windows.StyleHelper.GetThemeStyle(FrameworkElement fe, FrameworkContentElement fce)
at System.Windows.FrameworkContentElement.UpdateThemeStyleProperty()
at System.Windows.FrameworkContentElement.OnInitialized(EventArgs e)
at System.Windows.FrameworkContentElement.TryFireInitialized()
at System.Windows.FrameworkContentElement.ChangeLogicalParent(DependencyObject newParent)
at System.Windows.FrameworkContentElement.AddLogicalChild(Object child)
at System.Windows.LogicalTreeHelper.AddLogicalChild(DependencyObject parent, Object child)
at System.Windows.Documents.TextContainer.InsertElementInternal(TextPointer startPosition, TextPointer endPosition, TextElement element)
at System.Windows.Documents.TextElement.RepositionWithContent(TextPointer textPosition)
at System.Windows.Documents.TextElementCollection`1.Add(TextElementType item)
at System.Windows.Controls.RichTextBox..ctor(FlowDocument document)
at System.Windows.Controls.RichTextBox..ctor()
at MarkupConverter.RtfToHtmlConverter.ConvertRtfToXaml(String rtfText)
at MarkupConverter.RtfToHtmlConverter.ConvertRtfToHtml(String rtfText)
at MarkupConverter.MarkupConverter.ConvertRtfToHtml(String rtfText)
at XXX.YYY.Services.Converter.MarkupConverterService.RtfToHtml(String rtfText) in c:\Users\ABCDEFGH\Documents\Visual Studio 2013\Projects\Converter\MarkupConverterService.cs:line 66
J'ai pensé au fait que le type String n'est pas le même et que ça pouvait poser problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 IMarkupConverter converter = new MarkupConverter.MarkupConverter(); return converter.ConvertRtfToHtml(rtfText);
Cependant, en regardant le log généré, la chaîne à l'air de parfaitement passer.
J'ai d'ailleurs une autre DLL C# appelée depuis Delphi avec une chaîne en paramètre et qui fonctionne parfaitement.
Cette DLL est inscrit dans la base de registre avec la ligne de commande suivante :
Code DOS : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "C:\Users\ABCDEFGH\Documents\Visual Studio 2013\Projects\Converter\bin\D ebug\XXX.YYY.Services.Converter.dll"
Si ça peut aider voici le code Delphi appelant :
Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 function ExistComObject(Const Identifier : String) : Boolean; function ExistGUID(GuidIdentifier : TGUID) : Boolean; var ComObject : IUnknown; begin Result := Succeeded(CoCreateInstance(GuidIdentifier, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, ComObject)); end; var Guid : TGUID; begin Result := False; FillChar(Guid,SizeOf(TGUID), #0); if Succeeded(CLSIDFromProgID(PWideChar(WideString(Identifier)), GUID)) then Result:=ExistGUID(GUID); end; procedure TTestForm.RtfToHtmlButtonClick(Sender: TObject); var ConverterOleVariant : Variant; RtfText, HtmlText : String; begin RtfText := Rtf.Text; if (ExistComObject('XXX.YYY.Services.Converter.MarkupConverterService')) then begin RtfText := StringReplace(RtfText,#$D#$A,'',[rfReplaceAll]); try ConverterOleVariant := CreateOleObject('XXX.YYY.Services.Converter.MarkupConverterService'); HtmlText := ConverterOleVariant.RtfToHtml(RtfText); ConverterOleVariant := Unassigned; Html.Text := HtmlText; except on E : Exception do begin ShowMessage(E.Message); end; end; end; end;
Partager