如何使用JavaScript将HTML转换为RTF

时间:2015-03-27 11:27:10

标签: javascript html plugins rtf

我有一个带页眉和页脚的输入HTML文件。 它需要转换为RTF。应在结果RTF文件中重复HTML的页眉/页脚。

是否有任何插件仅使用 JavaScript ??

HTML转换为RTF

4 个答案:

答案 0 :(得分:2)

您可以使用this converter

然而,它没有解决要点(ul,li元素)

function convertHtmlToRtf(html) {
  if (!(typeof html === "string" && html)) {
      return null;
  }

  var tmpRichText, hasHyperlinks;
  var richText = html;

  // Singleton tags
  richText = richText.replace(/<(?:hr)(?:\s+[^>]*)?\s*[\/]?>/ig, "{\\pard \\brdrb \\brdrs \\brdrw10 \\brsp20 \\par}\n{\\pard\\par}\n");
  richText = richText.replace(/<(?:br)(?:\s+[^>]*)?\s*[\/]?>/ig, "{\\pard\\par}\n");

  // Empty tags
  richText = richText.replace(/<(?:p|div|section|article)(?:\s+[^>]*)?\s*[\/]>/ig, "{\\pard\\par}\n");
  richText = richText.replace(/<(?:[^>]+)\/>/g, "");

  // Hyperlinks
  richText = richText.replace(
      /<a(?:\s+[^>]*)?(?:\s+href=(["'])(?:javascript:void\(0?\);?|#|return false;?|void\(0?\);?|)\1)(?:\s+[^>]*)?>/ig,
      "{{{\n");
  tmpRichText = richText;
  richText = richText.replace(
      /<a(?:\s+[^>]*)?(?:\s+href=(["'])(.+)\1)(?:\s+[^>]*)?>/ig,
      "{\\field{\\*\\fldinst{HYPERLINK\n \"$2\"\n}}{\\fldrslt{\\ul\\cf1\n");
  hasHyperlinks = richText !== tmpRichText;
  richText = richText.replace(/<a(?:\s+[^>]*)?>/ig, "{{{\n");
  richText = richText.replace(/<\/a(?:\s+[^>]*)?>/ig, "\n}}}");

  // Start tags
  richText = richText.replace(/<(?:b|strong)(?:\s+[^>]*)?>/ig, "{\\b\n");
  richText = richText.replace(/<(?:i|em)(?:\s+[^>]*)?>/ig, "{\\i\n");
  richText = richText.replace(/<(?:u|ins)(?:\s+[^>]*)?>/ig, "{\\ul\n");
  richText = richText.replace(/<(?:strike|del)(?:\s+[^>]*)?>/ig, "{\\strike\n");
  richText = richText.replace(/<sup(?:\s+[^>]*)?>/ig, "{\\super\n");
  richText = richText.replace(/<sub(?:\s+[^>]*)?>/ig, "{\\sub\n");
  richText = richText.replace(/<(?:p|div|section|article)(?:\s+[^>]*)?>/ig, "{\\pard\n");

  // End tags
  richText = richText.replace(/<\/(?:p|div|section|article)(?:\s+[^>]*)?>/ig, "\n\\par}\n");
  richText = richText.replace(/<\/(?:b|strong|i|em|u|ins|strike|del|sup|sub)(?:\s+[^>]*)?>/ig, "\n}");

  // Strip any other remaining HTML tags [but leave their contents]
  richText = richText.replace(/<(?:[^>]+)>/g, "");

  // Prefix and suffix the rich text with the necessary syntax
  richText =
      "{\\rtf1\\ansi\n" + (hasHyperlinks ? "{\\colortbl\n;\n\\red0\\green0\\blue255;\n}\n" : "") + richText +  "\n}";

  return richText;
}

答案 1 :(得分:1)

没有这样的事我害怕。我在查找任何 HTML到RTF转换器时检查了这一点。不幸的是,它们是一种罕见的物品。

您唯一的选择是根据RTF规范制作一个。 https://msdn.microsoft.com/en-us/library/aa140277(v=office.10).aspx

答案 2 :(得分:1)

经过一番搜索,我找到了一个工作正常的解决方案。

https://www.npmjs.com/package/html-to-rtf

使用html-to-rtf转换很容易(我把一段代码基于browserify):

var html

ToRtf  = require("html-to-rtf");
var htmlText = "<div>...</div>"; //or whatever html you want to transform
var htmlAsRtf = htmlToRtf.convertHtmlToRtf(htmlText); // html transformed to rtf

这个解决方案对我有用。如果没有browserify,你必须在下载的模块中找到隐含的js,并将它们链接到你的html页面。

希望这有帮助

答案 3 :(得分:0)

我应用了@Samra解决方案,它运行良好。但是后来我在输出中发现一个错误:一些文本被截断了。经过大量调查,似乎与HTML注释(<!-- xxxx -->)处理不当有关。我的解决方案是将此richText转换添加为第一个:

// Delete HTML comments
richText = richText.replace(/<!--[\s\S]*?-->/ig,"");