如何使用LotusScript从Notes中将Rich Text字段导出为HTML?

时间:2009-12-10 11:59:46

标签: export lotus-notes lotus-domino lotusscript

我正在进行数据迁移任务,我必须将一个稍大的Lotus Notes应用程序导出到博客平台。我的第一个任务是将Lotus Notes中的文章导出为CSV文件。

我在LotusScript中创建了一个代理,用于将数据导出为CSV文件。我使用此IBM DeveloperWorks forum post的修改版本。它基本上完成了这项工作。但Rich Text字段的内容将被删除任何格式。这不是我想要的,我希望Rich Text字段呈现为HTML。

documentation for the GetItemValue方法明确指出文本呈现为纯文本。所以我开始研究能够检索HTML的东西。我在IBM文章How To Access HTML in a Rich Text Field Using LotusScript中找到了NotesMIMEEntity类和一些示例代码。

但是,对于上述文章中描述的技术,Rich Text字段需要具有“将内容存储为HTML和MIME”属性。我的Lotus Notes数据库不是这种情况。我试图在有问题的字段上设置属性,但它没有做到这一点。

是否可以在添加内容后使用NotesMIMEEntity并将“将内容存储为HTML和MIME”属性,以导出呈现为HTML的字段?

或者我将Notes数据库Rich Text字段导出为HTML的选项是什么?

奖励信息:我使用的是IBM Lotus Domino Designer 8.5版

10 个答案:

答案 0 :(得分:8)

这个相当未知的命令可以完全按照您的意愿执行:使用命令OpenField检索URL。

仅转换Body-field的示例:

http://SERVER/your%5Fdatabase%5Fpath.nsf/NEW%5FVIEW/docid/Body?OpenField

答案 1 :(得分:5)

如果升级到Notes Domino 8.5.1,则可以使用ConvertToMIME类的新NotesDocument方法。请参阅docs。这应该做你想要的。

另外,让Domino服务器呈现RichText的最简单方法是通过url调用实际检索它。设置一个只有RichText字段的简单表单,然后使用您喜欢的HTTP API来拉入页面。那么拔出身体应该是非常直接的。

答案 2 :(得分:4)

我建议查看Midas的Rich Text LSX(http://www.geniisoft.com/showcase.nsf/MidasLSX

我没有亲自使用,但我记得他们多年前是使用Rich Text的最佳选择。我敢打赌,它可以为你节省很多麻烦。

对于NotesMIMEEntity类,我不相信有一种方法可以将RichText转换为MIME,只将MIME转换为RichText(或者在文档中保留MIME以用于电子邮件目的)。

答案 3 :(得分:4)

我是这样做的,使用OpenField命令,参见D.Bugger上面的帖子

Function GetHtmlFromField(doc As NotesDocument, fieldname As String) As String
    Dim obj
    Set obj = CreateObject("Microsoft.XMLHTTP")
    obj.open "GET", "http://www.metz.dk/shops/tilbud.nsf/0/" + doc.Universalid + "/" + fieldname + "?openfield&charset=utf-8", False, "", ""
    obj.send("")

    Dim html As String
    html = Trim$(obj.responseText)

    GetHtmlFromField = html
End Function

答案 4 :(得分:2)

您可以使用NotesDXLExporter类导出Rich Text并使用XSLT将输出转换为您需要的输出。

答案 5 :(得分:2)

我知道你提到过使用LotusScript,但是如果你不介意编写一个小的Java代理(在Notes客户端中),这可以很容易地完成 - 而且不需要修改现有的表单设计。

基本思想是让您的Java代码通过localhost http请求(在Java中很简单)打开特定文档,并让您的代码捕获该html输出并将其保存回该文档。你基本上允许Domino渲染引擎完成繁重的工作。

你想要这样做:

  1. 创建一个仅包含要转换的富文本字段且内容类型为HTML
  2. 的表单
  3. 为要转换的所有文档创建一个包含选择公式的视图,并使用表单公式计算新表单
  4. 创建仅浏览视图的Java代理,并为每个文档获取其docid,以http://SERVER/your_database_path.nsf/NEW_VIEW/docid?openDocument形式打开URL,获取http响应并保存。
  5. 我在这里的类似SO帖子中提供了一些示例代码:

    How to convert text and rich text fields in a document to html using lotusscript?

答案 6 :(得分:2)

保持简单。

将BODY字段更改为将内容存储为HTML和MIME

在editmode中打开doc。 保存。 关闭。

您现在可以使用NotesMIMEEntity从脚本中获取所需内容。

答案 7 :(得分:1)

在Domino 10中工作(未在9中进行测试)

HTMLStrings$ = NotesRichTextItem .Converttohtml([options] ) As String

请参阅文档:

https://help.hcltechsw.com/dom_designer/10.0.1/basic/H_CONVERTOHTML_METHOD_NOTESRICHTEXTITEM.html

答案 8 :(得分:0)

Casper上面的建议很有效,但请确保ACL允许匿名访问,否则您的HTML将是登录表单中的HTML

答案 9 :(得分:0)

如果您不需要专门从项目中获取Richtext,您可以使用?OpenDocument,至少在此处记录:https://www.ibm.com/developerworks/lotus/library/ls-Domino_URL_cheat_sheet/ https://www.ibm.com/support/knowledgecenter/SSVRGU_9.0.1/com.ibm.designer.domino.main.doc/H_ABOUT_URL_COMMANDS_FOR_OPENING_DOCUMENTS_BY_KEY.html

OpenDocument还允许你扩展部分(我不确定OpenField是否这样做)

语法是: http://Host/Database/View/DocumentUniversalID?OpenDocument

但是一定要包含charset参数 - 如果没有指定utf-8作为字符集,则日文文档是不可读的。

这是我使用的方法,它接受NotesDocument并以字符串形式返回doc的HTML。

    private string ConvertDocumentToHml(Domino.NotesDocument doc, string sectionList = null)
    {
        var server = doc.ParentDatabase.Server.Split('/')[0];
        var dbPath = doc.ParentDatabase.FilePath;
        string viewName = "0";
        string documentId = doc.UniversalID.ToUpper();

        var ub = new UriBuilder();
        ub.Host = server;
        ub.Path = dbPath.Replace("\\", "/") + "/" + viewName + "/" + documentId;

        if (string.IsNullOrEmpty(sectionList))
        {
            ub.Query = "OpenDocument&charset=utf-8";
        }
        else
        {
            ub.Query = "OpenDocument&charset=utf-8&ExpandSection=" + sectionList;
        }

        var url = ub.ToString();

        var req = HttpWebRequest.CreateHttp(url);
        try
        {
            var resp = req.GetResponse();
            string respText = null;

            using (var sr = new StreamReader(resp.GetResponseStream()))
            {
                respText = sr.ReadToEnd();
            }
            return respText;
        }
        catch (WebException ex)
        {
            return "";
        }
    }