首页 文章

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

提问于
浏览
4

我正在进行数据迁移任务,我必须将一个稍大的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类和一些示例代码 .

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

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

或者我将Notes数据库Rich Text字段导出为HTML的选项有哪些?

额外信息:我使用的是IBM Lotus Domino Designer 8.5版

9 回答

  • 2

    我'd suggest looking at Midas' Rich Text LSX(http://www.geniisoft.com/showcase.nsf/MidasLSX

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

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

  • 0

    有一个相当未知的命令可以完全按照您的要求执行:使用命令OpenField检索URL .

    仅转换Body-field的示例:

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

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

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

  • 2

    以下是我使用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

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

  • 0

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

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

    你会想要这样做:

    • 创建一个仅包含要转换的富文本字段以及内容类型为HTML的表单

    • 为要转换的所有文档创建一个带有选择公式的视图,并使用表单公式计算新表单

    • 创建只是浏览视图的Java代理,并为每个文档获取其docid,以http://SERVER/your_database_path.nsf/NEW_VIEW/docid?openDocument形式打开URL,获取http响应并保存 .

    我在这里的类似SO帖子中提供了一些示例代码:

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

  • 5

    把事情简单化 .

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

    在editmode中打开doc . 保存 . 关 .

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

  • 8

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

  • 3

    如果您不需要专门从项目中获取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 "";
            }
        }
    

相关问题