【问题标题】:How to convert HTML to RTF and vice versa in Windows 10 UWP?如何在 Windows 10 UWP 中将 HTML 转换为 RTF,反之亦然?
【发布时间】:2016-04-29 10:38:14
【问题描述】:

我正在开发 Windows 10 UWP 中的 RichEditBox 控件,以允许用户使用一些格式选项。我从服务器获取 HTML,我想将其转换为 RTF 以在 RichEditBox 中显示。同样,我想在用户完成编辑后再次将其转换为 HTML。我进行了搜索,但我得到了样本,但它们没有帮助。我发现其中之一是为 RichTextBlock 工作,而不是 RichEditBox

HTML to RTF

我也试过下面的 URL(RTF 到 HTML),但它没有给出正确的输出

RTF to HTML

请有人建议如何使用 RichEditBox 实现我的要求,因为它是唯一允许格式化选项如粗体、斜体、项目符号等的控件。

【问题讨论】:

  • 如果您有钱购买第三方图书馆,那将是微不足道的。搜索文档转换器。
  • 你能推荐一些吗?
  • 我只使用了[文本控件](www.textcontrol.com/html5),但这不仅仅是一个转换器。看看 Aspose,gnostice
  • 会检查,但我不为此付费。
  • @Kinjan 我也有同样的情况,你有转换器吗?或任何解决方案?

标签: c# windows-10-universal


【解决方案1】:

我在 this link 中找到了要转换的基本概念,并创建了以下方法将 rtf 转换为 html 。它可以正确转换文本格式选项。

这是将rtf转换为html的方法,你可以根据你的需要编辑

 public static string ConvertToHtml(RichEditBox richEditBox)
    {
        string text, strColour, strFntName, strHTML;
        richEditBox.Document.GetText(TextGetOptions.None, out text);
        ITextRange txtRange = richEditBox.Document.GetRange(0, text.Length);
        strHTML = "<html>";

        int lngOriginalStart = txtRange.StartPosition;
        int lngOriginalLength = txtRange.EndPosition;
        float shtSize = 11;

        // txtRange.SetRange(txtRange.StartPosition, txtRange.EndPosition);

        bool bOpened = false, liOpened = false, numbLiOpened = false, iOpened = false, uOpened = false, bulletOpened = false, numberingOpened = false;

        for (int i = 0; i < text.Length; i++)
        {
            txtRange.SetRange(i, i + 1);

            if (i == 0)
            {
                strColour = txtRange.CharacterFormat.ForegroundColor.ToString();
                shtSize = txtRange.CharacterFormat.Size;
                strFntName = txtRange.CharacterFormat.Name;
                strHTML += "<span style=\"font-family:" + strFntName + "; font-size: " + shtSize + "pt; color: #" + strColour.Substring(3) + "\">";
            }


            if (txtRange.CharacterFormat.Size != shtSize)
            {
                shtSize = txtRange.CharacterFormat.Size;
                strHTML += "</span><span style=\"font-family: " + txtRange.CharacterFormat.Name + "; font-size: " + txtRange.CharacterFormat.Size + "pt; color: #" + txtRange.CharacterFormat.ForegroundColor.ToString().Substring(3) + "\">";
            }

            if (txtRange.Character == Convert.ToChar(13))
            {
                strHTML += "<br/>";
            }

            #region bullet
            if (txtRange.ParagraphFormat.ListType == MarkerType.Bullet)
            {
                if (!bulletOpened)
                {
                    strHTML += "<ul>";
                    bulletOpened = true;
                }

                if (!liOpened)
                {
                    strHTML += "<li>";
                    liOpened = true;
                }

                if (txtRange.Character == Convert.ToChar(13))
                {
                    strHTML += "</li>";
                    liOpened = false;
                }
            }
            else
            {
                if (bulletOpened)
                {
                    strHTML += "</ul>";
                    bulletOpened = false;
                }
            }

            #endregion

            #region numbering
            if (txtRange.ParagraphFormat.ListType == MarkerType.LowercaseRoman)
            {
                if (!numberingOpened)
                {
                    strHTML += "<ol type=\"i\">";
                    numberingOpened = true;
                }

                if (!numbLiOpened)
                {
                    strHTML += "<li>";
                    numbLiOpened = true;
                }

                if (txtRange.Character == Convert.ToChar(13))
                {
                    strHTML += "</li>";
                    numbLiOpened = false;
                }
            }
            else
            {
                if (numberingOpened)
                {
                    strHTML += "</ol>";
                    numberingOpened = false;
                }
            }

            #endregion

            #region bold
            if (txtRange.CharacterFormat.Bold == FormatEffect.On)
            {
                if (!bOpened)
                {
                    strHTML += "<b>";
                    bOpened = true;
                }
            }
            else
            {
                if (bOpened)
                {
                    strHTML += "</b>";
                    bOpened = false;
                }
            }
            #endregion

            #region italic
            if (txtRange.CharacterFormat.Italic == FormatEffect.On)
            {
                if (!iOpened)
                {
                    strHTML += "<i>";
                    iOpened = true;
                }
            }
            else
            {
                if (iOpened)
                {
                    strHTML += "</i>";
                    iOpened = false;
                }
            }
            #endregion

            #region underline
            if (txtRange.CharacterFormat.Underline == UnderlineType.Single)
            {
                if (!uOpened)
                {
                    strHTML += "<u>";
                    uOpened = true;
                }
            }
            else
            {
                if (uOpened)
                {
                    strHTML += "</u>";
                    uOpened = false;
                }
            }
            #endregion

            strHTML += txtRange.Character;
        }


        strHTML += "</span></html>";

        return strHTML;
    }

我还没有开始将 html 反向转换为 rtf,一旦我完成了,我也会发布那个答案。

希望这会有所帮助。

谢谢,

诺鲁尔。

【讨论】:

  • 谢谢。一定会试一试的。
  • 否,但会尝试,如果有效,会将答案标记为已接受。另外,如何处理项目符号和名称列表?你试过吗?
  • 是的,我忘记通知了。即使我被困在那里,项目符号点也没有转换,目前我正在推进这个简单的转换,因为我需要尽快完成它。稍后我也会添加项目符号的转换,并将编辑答案。
  • 是的,你可以。它提供了样式选项。如果您删除它,您需要为此添加一些替代品,或者不使用样式选项。
  • @Noorul 为了帮助其他人,您可能希望在原始帖子中添加一行,说明您的解决方案还包括转换项目符号和编号的功能。在阅读了用户的评论后,我首先忽略了您的解决方案,该评论不包括项目符号和编号。但是后来我不得不浏览了这篇文章的所有内容,后来发现你确实也涵盖了这两个功能。
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2011-07-27
  • 2021-06-10
  • 2012-03-24
  • 2018-06-28
  • 2010-12-04
相关资源
最近更新 更多