存档

2009年6月 的存档

备份Outlook邮件为CHM文件

2009年6月16日 魏 拾俊 2 条评论

Microsoft Outlook是常用的电子事务管理软件,在使用几年以后,Outlook里的邮件会越来越多。大部分旧邮件不需要经常阅读,却又不想随便删除它们,不少人为此发愁。要是有一款可以方便的将Outlook导出为易于浏览、检索的归档文件的工具该多好呀。

WizBrother 公司出品的 Outlook2CHM 系列软件正是这样一种工具。他可以方便的将Outlook中的历史邮件导出为CHM格式的文档,CHM格式是微软默认支持的帮助文档格式,不但在所有Windows系统中能打开浏览,还很好的支持了内容的全文检索。

现在,就将我们的历史邮件导出成CHM归档吧:

第1步: 获得软件

下载最新版本的Outlook2CHM
访问 http://wizbrother.com/outlook2chm/index.html
点击下载链接下载

第2步: 安装与启动

将下载下来的zip文件解压到您的硬盘
在确保您的机器上安装有Microsoft Outlook 2000 XP 2003或2007其中的一个版本后
执行其中的Outlook2CHM.exe,见到如下界面

第3步:选择和设置

软件启动后会自动侦测Microsoft Outlook的邮件目录设置,在列表上,你可以选择哪些目录你需要导出备份

2个可选项选中后,可以在归档邮件前列出发信日期和发送人名,以便于浏览

你可以在下图这个界面上设置生成的归档文件的参数,选择全文检索选项,即可方便操作。

注意,因为CHM格式的限制,归档文件需要小于2G,如果你有超过2G的邮件时,备份前,最好做分目录备份,如每一年一个备份

第4步:开始备份

点击开始按钮后,就开始备份了。所有操作就是这么简单。

注意,软件在访问Outlook邮件时,会被Outlook安全警告,请在警告框内选择允许访问,并设置最长访问时间,选择Yes确定

程序工作完成后,将生成你需要的CHM格式文件。如下方式管理你的历史邮件

支持:目录索引、全文检索,HTML格式邮件保存、附件完整保存

技巧:

1:为便于浏览,将你要备份的邮件按类别放在不同的目录下,分别备份目录

2:GMail、Hotmail等网络邮箱均可以打开POP收信选项,你可以将网络邮件收取到本地后,进行归档备份
Gmail设置Outlook收信方法:
http://mail.google.com/support/bin/answer.py?hl=en&ctx=mail&answer=12103
Hotmail设置Outlook收信方法:
http://windowslivehelp.com/solutions/settings/archive/2009/01/06/send-and-receive-windows-live-hotmail-emails-from-a-mail-client.aspx

除了Outlook2CHM,WizBrother公司还有 OutlookExpress2CHM、WindowMail2CHM、LiveMail2CHM邮件备份工具,可分别从Outlook Express、Windows Mail、Live Mail客户端管理的邮件中备份出CHM历史邮件归档。

 

分类: Email Backup 标签:

删除CyberArticle书籍中的导入的附件URL(文件名)

2009年6月16日 魏 拾俊 2 条评论

问题

导入的附件能不能搞个选项,可以选择要不要包含哪个URL呀,因为就本人而言有很多附件都是在本地导入的,我不想把这附件的原始路径显示出来,去又去不掉,实在是碍眼呀。

解决办法

下载解压缩附件,然后安装这个宏,就可以了。在CyberArticle里面,选中一个书籍,然后执行这个宏。可以将书籍中所有导入的附件(也就是附件URL是本地文件),URL全部清空。

宏代码

var objCA = new ActiveXObject(“CyberArticle.CAAutomationApp”);
//
var objSelectedNodes = objCA.SelectedNodes;
if (objSelectedNodes != null && objSelectedNodes.Count > 0)
{
    var objSelectedNode = objSelectedNodes.Item(0);
    var objBook = objSelectedNode.Book;
    var attachments = objBook.Attachments;
    for (var i = 0; i < attachments.Count; i++)
    {
        var att = attachments.Item(i);
        var url = att.URL;
        if (0 == url.indexOf(“http://”))
            continue;
        //
        att.url = “”;
    }
}

 

 

分类: CyberArticle 标签:

利用CyberArticle定时自动下载保存博客的新文章

2009年6月15日 魏 拾俊 5 条评论

利用CyberArticle的二次开发功能,可以很容易的写一个下载博客文章的脚本。然后利用计划任务,定时运行,就可以自动下载保存任意博客的文章了。

下面就是脚本代码:(善用佳软的例子)

/*
功能:
定期将博客中新增的文章,保存到 [博客集合] 书籍中。

注意:
对于Windows Vista/7系统,如果您开启了账户控制,第一次运行本脚本的时候,请这样操作:
1:资源管理器,找到CyberArticle安装目录,例如:C:\Program Files\WizBrother\CyberArticle
2:找到regfiles.bat文件,然后在上面点击鼠标右键,选择“以管理员运行”(Run as Administrator)


其他操作系统,不需要这个操作。

使用说明:
请修改以下参数:
BOOK_NAME:默认的书籍名称。您可以修改这个参数,将数据保存到您指定的书籍中。也可以不作修改,CyberArticle会自动创建这个书籍。
BLOG_NAME:博客名称,例如善用佳软,魏拾俊的博客等等。
RSS_URL:博客的RSS地址。

注意:

每个博客,只保存一次,即使有新的回复,也不会重新保存。新保存的文章,保存在 博客集合\博客名称\XXXX年\X月\X日 文件夹内

使用:
双击运行这个脚本就可以了。运行后会自动将新的文章保存到书籍中。

技巧:

您可以将这个脚本放在程序的启动组里面,每次启动电脑后,可以自动运行。
或者添加到计划任务中,在每天空闲的时刻,例如中午吃饭时间运行。吃完饭后,就可以看到最新的文章了。
如果您同时喜欢看很多的博客,您可以利用这个脚本,制作多个这样的脚本,然后加入计划任务,自动运行,每天都可以自动将所有的博客自动保存。
//
http://weishijun.com/
*/

//
//—————————————————-
//博客定时保存脚本参数
//注意:引号必须是英文半角
//书籍名称
var BOOK_NAME = “博客集合”;
//Blog名称
var BLOG_NAME = “善用佳软”;
//Blog的RSS地址
var RSS_URL = “http://feed.xbeta.info/”
//
//
//
//—————————————————-
var objShell = new ActiveXObject(“WScript.Shell”);
var objCommonUI = new ActiveXObject(“CyberArticleCommonUI.CACommonUI”);
function jsAlert(msg)
{
    return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
//获得MyBooks文件夹。如果是绿色版本,则默认保存在安装目录下面的My Books文件夹
function GetMyBooksPath()
{
    var strMyBooksPath = objShell.RegRead(“HKEY_CURRENT_USER\\Software\\WizBrother\\CyberArticle\\MyBooksFolder”);
    if (strMyBooksPath == null || strMyBooksPath == “”)
    {
        var objCyberArticleAppPath = objCommonUI.CyberArticleAppPath;
        return objCyberArticleAppPath + “My Books\\”;
    }
    //
    if (strMyBooksPath[strMyBooksPath.length - 1] != ‘\\’)
        strMyBooksPath = strMyBooksPath + “\\”;
    //
    return strMyBooksPath;
}
//有些系统无法正常创建BookBuilder对象,先注册BookBuilder.exe
function RegBookBuilder()
{
    var objCyberArticleAppPath = objCommonUI.CyberArticleAppPath;
    var filename = objCyberArticleAppPath + “bookbuilder.exe”;
    var commandline = “\”" + filename + “\” /RegServer”
    //
    objShell.Exec(commandline);
    //等待2秒钟
    WScript.Sleep(2000);
}
/*
function RunBookBuilder()
{
    RegBookBuilder();
    //
    var objCyberArticleAppPath = objCommonUI.CyberArticleAppPath;
    var filename = objCyberArticleAppPath + “bookbuilder.exe”;
    //
    var oExec = objShell.Exec(filename);
    //
    //等待2秒钟
    WScript.Sleep(2000);
}
*/

//找到channel
function GetItemNodes()
{
    var objXml = new ActiveXObject(“MSXML.DOMDocument”);
    objXml.async = false;
    objXml.load(RSS_URL);
    //
    var channelNode = objXml.selectSingleNode(“/rss/channel”);
    //
    return channelNode.childNodes;
}
 
//c查找书籍,按照书籍名称
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
var bookguid = null;
for (var i = 0; i < objBookCollection.Count; i++)
{
    if (objBookCollection.BookName(i) == BOOK_NAME)
    {
        bookguid = objBookCollection.GUID(i);
        break;
    }
}
//如果没有找到,新增
if (bookguid == null || bookguid.length == 0)
{
    var strNewBookFileName = GetMyBooksPath() + BOOK_NAME + “.xbook”;
    var objBookTools = new ActiveXObject(“CyberArticleBookTools.CABookTools”);
    bookguid = objBookTools.CreateAccessBook(strNewBookFileName);
}
//打开书籍
var objBook = new ActiveXObject(“CyberArticleBook.CABook”);
objBook.Open(bookguid);
//
var myDate=new Date();
var year = myDate.getFullYear();
var month = myDate.getMonth() + 1;
var day = myDate.getDate();
//
var folderpath = BLOG_NAME + “\\” + year + “年\\” + month + “月\\” + day + “日\\”;
//
//
var arrayLinks = new Array();
//
var nodes = GetItemNodes();
for (var i = 0; i < nodes.length; i++)
{
    var node = nodes[i];
    //
    if (node.nodeType != 1)
        continue;
    //
    if (node.nodeName != “item”)
        continue;
    //
    var linkNode = node.selectSingleNode(“link”);
    if (null == linkNode)
        continue;
    //
    //
    var link = linkNode.text;
    if (link == null || link.length == 0)
        continue;
    //
    try
    {
        //检查是否已经保存,如果保存,继续
        var nodesBook = objBook.NodesFromURL(link);
        if (nodesBook != null && nodesBook.Count > 0)
            continue;
    }
    catch (e)
    {
    }
    //
    var titleNode = node.selectSingleNode(“title”);
    var title = null;
    if (titleNode != null)
        title = titleNode.text;
    if (title == null)
        title = “”;
    //
    arrayLinks.push(link);
    arrayLinks.push(title);
}
//下载任务
if (arrayLinks.length > 0)
{
    RegBookBuilder();
    //
    var objCABookBuilder = new ActiveXObject(“CyberArticle.CABookBuilderAutomationApp”);
    //
    for (var i = 0; i < arrayLinks.length; i += 2)
    {
        var link = arrayLinks[i];
        var title = arrayLinks[i + 1];
        //
        if (title.length == 0)
        {
            objCABookBuilder.AddJob(bookguid, folderpath, link, title, “Default”, 0, false, true, 0);
        }
        else
        {
            objCABookBuilder.AddJob(bookguid, folderpath, link, title, “Default”, 0, true, true, 0);
        }
    }
    //
    objCABookBuilder.StartDownload();
}

附件是我制作的三个脚本,您可以拿来进行修改。以满足您的需求。

如果您制作了其它的脚本,可以到这里共享给其他用户。

http://cn.wizbrother.net/forum-23-1.html

 

 

分类: CyberArticle 标签:

CyberArticle无法新建,打开任何书籍的解决办法

2009年6月5日 魏 拾俊 2 条评论

如果CyberArticle无法新建,打开任何书籍,通常的情况,就是Windows 的MDAC组件出现了问题。您可以尝试按照下面的方法解决:

下载最新版本的MDAC组件。目前最新版本是MDAC 2.8 Sp1。可以在这里下载:

http://www.microsoft.com/downloadS/details.aspx?FamilyID=78cac895-efc2-4f8e-a9e0-3a1afbd5922e&displaylang=en&Hash=7iG6%2fL1eUIgbqwEyEiYifTT3X6Q7PVXVYueAuSKgnDqRhQy4OJm%2bRR8HawEPrNPH3bCCsozX9iMOsQLbv3PAuA%3d%3d

您也可以自己到微软的网站,搜索合适的版本,然后下载。

下载后可以直接运行安装。如果提示无法安装,如下图:

按照下面的方法解决:

在我的电脑里面,找到您下载的文件,在MDAC_TYP.exe上面点击右键,然后选择用压缩软件解压缩(WinZip, WinRAR, 7-Zip)都可以进行解压缩

解压缩后,进入解压缩后的目录,找到mdacxpak.inf文件,然后在上面点击右键,选择安装(Install)。

通常情况下,就可以安装然后提示重新启动系统。重新启动后,CyberArticle可以恢复正常。(我在WinXP sp2下面测试通过)。

如果仍然不能安装,您可以按照下面的方式处理:

1. 在前面的目录里面,找到MDACXPAK.CAB,然后解压缩这个文件到任意一个文件夹(WinZip, WinRAR, 7-Zip都可以解压缩)。

2. 在解压缩后的目录里面,建立一个批处理文件MAKEDIRS.BAT,然后运行。 批处理内容如下:
md ADO
copy /b MSADER15.DLL ADO\*.*
copy /b MSADO15.DLL ADO\*.*
copy /b MSADO20.TLB ADO\*.*
copy /b MSADO21.TLB ADO\*.*
copy /b MSADOMD.DLL ADO\*.*
copy /b MSADOR15.DLL ADO\*.*
copy /b MSADOX.DLL ADO\*.*
copy /b MSADRH15.DLL ADO\*.*
copy /b MSJRO.DLL ADO\*.*

md MSADC
copy /b MSADCE.DLL MSADC\*.*
copy /b MSADCER.DLL MSADC\*.*
copy /b MSADCF.DLL MSADC\*.*
copy /b MSADCFR.DLL MSADC\*.*
copy /b MSADCO.DLL MSADC\*.*
copy /b MSADCOR.DLL MSADC\*.*
copy /b MSADCS.DLL MSADC\*.*
copy /b MSADDS.DLL MSADC\*.*
copy /b MSADDSR.DLL MSADC\*.*
copy /b MSDAPRSR.DLL MSADC\*.*
copy /b MSDAPRST.DLL MSADC\*.*
copy /b MSDAREM.DLL MSADC\*.*
copy /b MSDAREMR.DLL MSADC\*.*
copy /b MSDFMAP.DLL MSADC\*.*

md “OLE DB”
copy /b MSDADC.DLL “OLE DB\*.*”
copy /b MSDAENUM.DLL “OLE DB\*.*”
copy /b MSDAER.DLL “OLE DB\*.*”
copy /b MSDAORA.DLL “OLE DB\*.*”
copy /b MSDAOSP.DLL “OLE DB\*.*”
copy /b MSDAPS.DLL “OLE DB\*.*”
copy /b MSDASC.DLL “OLE DB\*.*”
copy /b MSDASQL.DLL “OLE DB\*.*”
copy /b MSDASQLR.DLL “OLE DB\*.*”
copy /b MSDATL2.DLL “OLE DB\*.*”
copy /b MSDATT.DLL “OLE DB\*.*”
copy /b MSDAURL.DLL “OLE DB\*.*”
copy /b MSXACTPS.DLL “OLE DB\*.*”
copy /b OLEDB32.DLL “OLE DB\*.*”
copy /b OLEDB32R.DLL “OLE DB\*.*”
copy /b OLEDB32X.DLL “OLE DB\*.*”

3. 复制三个字文件夹(ADO,MSADC,OLE DB)到C:\Program Files\Common Files\System\,覆盖存在的文件和文件夹。

注意,如果您的操作系统没有安装在C盘,则需要自己修改上面的路径。

4. 在C:\Program Files\Common Files\System\文件夹里面,创建一个 REGFILES.BAT,然后运行。内容如下:

regsvr32 /u /s ADO\msado15.dll
regsvr32 /u /s ADO\msador15.dll
regsvr32 /u /s ADO\msadrh15.dll
regsvr32 /u /s ADO\msadomd.dll
regsvr32 /u /s ADO\msadox.dll
regsvr32 /u /s ADO\msjro.dll
regsvr32 /u /s MSADC\msadce.dll
regsvr32 /u /s MSADC\msadcf.dll
regsvr32 /u /s MSADC\msadco.dll
regsvr32 /u /s MSADC\msadds.dll
regsvr32 /u /s MSADC\msdaprst.dll
regsvr32 /u /s MSADC\msdarem.dll
regsvr32 /u /s MSADC\msdfmap.dll
regsvr32 /u /s “OLE DB\oledb32.dll”
regsvr32 /u /s “OLE DB\msxactps.dll”
regsvr32 /u /s “OLE DB\msdaenum.dll”
regsvr32 /u /s “OLE DB\msdaurl.dll”
regsvr32 /u /s “OLE DB\msdatt.dll”
regsvr32 /u /s “OLE DB\msdasql.dll”
regsvr32 /u /s “OLE DB\msdaosp.dll”
regsvr32 /u /s “OLE DB\msdaora.dll”
regsvr32 /u /s “OLE DB\msdaps.dll”

regsvr32 /s ADO\msado15.dll
regsvr32 /s ADO\msador15.dll
regsvr32 /s ADO\msadrh15.dll
regsvr32 /s ADO\msadomd.dll
regsvr32 /s ADO\msadox.dll
regsvr32 /s ADO\msjro.dll
regsvr32 /s MSADC\msadce.dll
regsvr32 /s MSADC\msadcf.dll
regsvr32 /s MSADC\msadco.dll
regsvr32 /s MSADC\msadds.dll
regsvr32 /s MSADC\msdaprst.dll
regsvr32 /s MSADC\msdarem.dll
regsvr32 /s MSADC\msdfmap.dll
regsvr32 /s “OLE DB\oledb32.dll”
regsvr32 /s “OLE DB\msxactps.dll”
regsvr32 /s “OLE DB\msdaenum.dll”
regsvr32 /s “OLE DB\msdaurl.dll”
regsvr32 /s “OLE DB\msdatt.dll”
regsvr32 /s “OLE DB\msdasql.dll”
regsvr32 /s “OLE DB\msdaosp.dll”
regsvr32 /s “OLE DB\msdaora.dll”
regsvr32 /s “OLE DB\msdaps.dll”

以上操作,如果您的系统是Vista或者Win7,您需要使用管理员身份运行。

经过操作后,应该就可以恢复正常了。

参考文章:

http://www.trinet.co.uk/support/kb.aspx?kbid=000027

 

分类: CyberArticle 标签:

如何修复Access格式的书籍

2009年6月5日 魏 拾俊 9 条评论

如果Access格式的书籍无法打开,例如突然断电,或者不正常关机引起数据损坏,可以通过ODBC管理工具来修复,或者使用专用工具提取里面的文章。

判断书籍是否损坏

如果可以建立新的书籍,也可以打开其它书籍,那么可以基本断定,无法打开的书籍出现了问题。

通过ODBC修复Access数据库:

打开控制面板。开始菜单->控制面板

切换到经典模式,然后选择管理工具,ODBC,如下图:

双击打开ODBC

点击 添加按钮(Add)

选择Access (Driver do Microsoft Access (*mdb))。

点击里面的修复按钮(Repair)

文件类型,选择全部,然后找到损坏的书籍:

点击确定按钮,等待一段时间后,就会提示修复成功

如果数据损坏失败,则会提示修复失败,并提示原因。

如果仍然无法,可以使用专用的工具,把数据提取出来。

通过专用的程序提取书籍里面的HTML文件

下载附件的程序,然后解压缩,运行CyberArticle5DumpAccessBook.exe

点击左上角的按钮,选择您的书籍文件。然后点击开始按钮,就可以把书籍里面的HTML提取出来。如下图:

如果通过以上两种方式,仍然无法恢复,说明您的书籍损坏比较严重,可以直接和我们联系。

注意

如果您格式化或者删除了书籍,然后通过恢复软件进行恢复,那么恢复出来的书籍,一般来说都会有问题,无法通过上面这两种方式进行修复。

 

分类: CyberArticle 标签:

CyberArticle二次开发手册 – 5、CyberArticle 文章

2009年6月4日 魏 拾俊 没有评论

每一个CyberArticle文章,都是一个HTML文件。CyberArticle将HTML以及所包含的图片等资源,打包并压缩成一个zip数据包,保存在数据库的Nodes.Article字段内。

文章节点,都有一个Article属性,可以获得HTML文章对象(ICAArticle)。

ICAArticle对象的主要属性和方法

  • SaveAsHTML:保存成一个HTML文件。采用unicode编码。
  • SaveAsHTMLAnsi:保存成一个HTML文件,采用ansi或者多字节编码,例如gb2312,utf-8等编码。具体编码,由html文件里面原始的编码指定。如果原始编码是unicode,则保存后采用utf-8编码。
  • SaveAsHTMLAnsiEx:保存成HTML文件,采用ansi或者多字节编码。可以指定是否允许使用utf-8编码。如果不允许使用utf-8,则会采用当前系统的默认字符集老保存那些unicode文件。
  • SaveAsMime:保存成mime文件,扩展名一般是.mht。
  • Children属性:或者HTML资源(ICAArticleResourceCollection)。

ICAArticleResourceCollection说明

ICAArticleResourceCollection是一个文章资源集合,除了具有Count和Item两个属性外,还有其它几个重要的方法。利用这个对象,可以删除或者更新某一个文章资源,例如更新或者删除里面的某一个图片。

  • Count:获得HTML资源的数量。包括HTML代码本身。
  • Item:活的某一个资源。Item(0)就是文章的HTML代码(ICAArticleResource)。
  • ItemFromName:通过资源名称,获得某一个资源。按照名称查找的时候,不区分大小写。
  • BeginUpdate:开始更新资源。如果要删除或者更新某一个资源,在删除或者更新之前,需要调用该方法。
  • EndUpdate:结束更新资源。如果要删除或者更新某一个资源,在删除或者更新之后,需要调用该方法。调用之后,会把修改后的数据保存到数据库。
  • GetArticleSourceCode:获得文章的HTML代码。在调用GetArticleSourceCode之前,不需要调用BeginUpdate。
  • SetArticleSourceCode:设置文章的HTML代码。在调用SetArticleSourceCode之前,也需要调用BeginUpdate。之后调用EndUpdate,才会保存数据。

ICAArticleResourceCollection对象主要的功能,就是可以单独更新或者删除某一个资源。

ICAArticleResource对象主要属性和方法

通过ICAArticleResourceCollection.Item,可以获得每一个文章资源。文章资源对象就是ICAArticleResource。

  • Name:资源名称,就是保存成HTML之后的文件名(不包含路径)
  • URL:资源的URL,例如HTML里面的某一个图片的原始URL。
  • Size:资源的大小。
  • SaveToStream:将资源数据,保存到一个IStream里面。

例子

下面的代码,我们在一个书籍内建立一个新的文章,然后把文章保存成HTML文件,并且获得其中的每一个文章资源,显示出文章资源的名称和URL。

var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
    return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
function Test()
{
    var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
    for (var i = 0; i < objBookCollection.Count; i++)
    {
        var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
        //
        var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
        try
        {
            objBook.Open(guidBook); //打开书籍
        }
        catch (e)
        {
            continue;
        }
        //…
        var nodeRoot = objBook.RootNode;
        //
        var nodeArticle = objBook.CreateArticle(nodeRoot, “My Article”); //创建文章
        //文章html
        var htmlText = “<html><head><title>My First SDK Article</title></head><body><h1>My First SDK Article</h1><p>Test text…</p><img src=http://www.wizbrother.com/screenshots/cyberarticle.png></img></body></html>”;
        //创建一个profile
        var objProfile = new ActiveXObject(“CyberArticleBook.CAProfile”);
        objProfile.Name = “Test”;
        objProfile.IncludeImages = true;
        objProfile.DownloadItems = true;
        //使用html文字设置文章内容
        nodeArticle.InitArticle(htmlText, “”, objProfile);
        //
        var objArticle = nodeArticle.Article;   //获得ICAArticle对象
        objArticle.SaveAsHTML(“T:\\temp\\1.htm”);   //保存成HTML文件
        //
        var objArticleResourceCollection = objArticle.Children; //获得ICAArticleResourceCollection
        for (var iResource = 0; iResource < objArticleResourceCollection.Count; iResource++)
        {
            var objArticleResource = objArticleResourceCollection.Item(iResource);
            //
            if (0 == iResource)
            {
                //第一个资源,显示HTML代码
                jsAlert(objArticleResourceCollection.GetArticleSourceCode());
            }
            else
            {
                //显示资源名称和URL
                jsAlert(objArticleResource.Name + “\n” + objArticleResource.URL);
            }
        }
        //…
        objBook.Close();
        //
        return;
    }
}
Test();

程序运行后的效果如下图:

Item(0),显示文章HTML代码。注意看里面有一个%ResourceFilePath% / cyberarticle[1].png。在CyberArticle保存后的HTML代码里面,%ResourceFilePath%代表了HTML资源所在的子目录名称,例如xxx_files。在保存成html的时候,CyberArticle会自动替换。

下面显示了资源的名称和URL(就是初始化html的时候引用的图片)。

从上面的的例子中可以看到,通过文章对象,可以轻松的操作CyberArticle里面的文章。

CyberArticle二次开发手册 – 4、CyberArticle 节点

2009年6月4日 魏 拾俊 没有评论

CyberArticle书籍内最重要的元素就是节点(ICANode)。无论是文件夹还是文章,都是一个节点。

节点的主要属性和方法

  • ID:节点的ID。书籍内每一个节点都有一个唯一的ID。
  • ParentID:节点的父节点ID。除了根节点,每一个节点,都有一个父节点。
  • ParentNode:节点的父节点。除了根节点,每一个节点,都有一个父节点。
  • Type:节点类型:0是文件夹,1是文章
  • Pos:位置。在同一级别的节点位置,按照从小到大排序。
  • DateCreated:创建时间
  • Color:文字颜色
  • BgColor:背景颜色
  • IconIndex:图标索引。>=0,是系统图标;<0:自定义图标
  • Title:标题
  • Owner:节点所有者。就是创建节点的CyberArticle所在的计算机的名称。
  • MoveTo:移动节点到另外一个节点。父节点,回收站不能移动。
  • MoveToRecycleBin:移动节点到回收站。如果节点已经在回收站,则彻底删除。
  • Delete:删除
  • GetPrevSiblingNode:获得当前节点的前一个同级别节点。
  • GetNextSiblingNode:获得当前节点的下一个同级别节点。
  • Attribute:扩展属性。可以用来存储任何数据。属性名称长度最大为50个字符,属性值的最大长度为255个字符。
  • Book:获得节点所在的书籍。
  • Size:文章或者文件夹的大小。
  • IsIn:可以判断一个节点是否在另外一个节点内。

文件夹独有的属性和方法

  • Children:获得文件夹的子节点。
  • FindChildNode:通过标题查找一个子节点。

文章独有的属性和方法

  • DateModified, DateAccessed:最后一次修改,访问文章时间。
  • Unread:文章是否未读
  • FileType:文件类型。对于保存的网页,是.htm,对于导入的文件,则是.doc, .pdf等等,保存了文件的扩展名。
  • Author:作者
  • Keywords:关键字
  • Label1, Label2, Label3, Label4, Label5:标签1-5
  • URL:文章的网址,或者导入的文件原始路径
  • Coments:注释
  • Text:文章里面的文字。如果是网页,则保存的网页里面的文字内容。
  • Article:获得文章对象(ICAArticle)。
  • Attachments:文件附件。(ICAAttachmentCollection)
  • InitArticle:设置文章内容。可以通过一个HTML字符串和一个网址,来初始化或者修改文章内容。
  • AddAttachment:添加附件。

书籍内的重要节点

  • 根节点。任何一个书籍都有一个根节点。在创建书籍的时候,系统会自动创建根节点。根节点的名称就是书籍的名称,根节点的ID为0。
  • 回收站。任何一个书籍都有一个回收站。在创建书籍的时候,系统会自动创建回收站。回收站的ID为-1。

关于节点对象的详细定义,请参考开发人员手册

书籍内创建节点,创建文件夹和文章,并且给文章设置内容。

下面是一个例子,用来打开每一个书籍,然后在根节点下面,查找 “I love CyberArticle” 这个文件夹。如果没有找到,则建立这个文件夹。然后在这个文件夹下面创建一个文章,并且用一段HTML文字来设置文章内容。

var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
    return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
    var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
    //
    var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
    try
    {
        objBook.Open(guidBook); //打开书籍
    }
    catch (e)
    {
        continue;
    }
    //…
    var nodeRoot = objBook.RootNode;
    //
    var nodeILoveCyberArticle = null;
    try
    {
        nodeILoveCyberArticle = nodeRoot.FindChildNode(“I love CyberArticle”);  //根节点下面查找文件夹
    }
    catch (e)
    {
        //如果找不到,会有一个异常,我们在这里捕获这个异常。
    }
    //
    if (!nodeILoveCyberArticle || nodeILoveCyberArticle.Type != 0)  //如果没有找到,后者不是文件夹
    {
        nodeILoveCyberArticle = objBook.CreateFolder(nodeRoot, “I love CyberArticle”);  //创建一个新的文件夹
    }
    if (nodeILoveCyberArticle)
    {
        var nodeArticle = objBook.CreateArticle(nodeILoveCyberArticle, “My First SDK Article”);//创建文章
        //文章html
        var htmlText = “<html><head><title>My First SDK Article</title></head><body><h1>My First SDK Article</h1><p>Test text…</p><img src=http://www.wizbrother.com/screenshots/cyberarticle.png></img></body></html>”;
        //创建一个profile
        var objProfile = new ActiveXObject(“CyberArticleBook.CAProfile”);
        objProfile.Name = “Test”;
        objProfile.IncludeImages = true;
        objProfile.DownloadItems = true;
        //使用html文字设置文章内容
        nodeArticle.InitArticle(htmlText, “”, objProfile);
    }
    //…
    objBook.Close();
}

从上面的例子可以看到如何通过书籍获得根节点,然后在节点下面查找文件夹,创建子文件夹和文章,并且用一段HTML文字来初始化文章。HTML里面可以用用图片等等资源,CyberArticle会自动将图片也保存到书籍中,就和在浏览器内保存网页是一样的效果。

结果如下图:

通过这种方式,如果定义好一个模板,只需要输入一些文字,然后格式化成HTML文件,保存到书籍里面,我们就可以非常容易的批量的生成大量格式相同的文章,例如公文等等。而且由于HTML本身的公开和易用,使得控制格式,也非常简单。如果用C#或者其它高级语言编写一个这样的程序,用于生成公文之类的文章,相信应该非常有用。同时利用CyberArticle WebShare组件,将文章发布出去,就是一个简单易用的文档生成和发布系统。

 

给CyberArticle命令自定义快捷键

2009年6月4日 魏 拾俊 1 条评论

CyberArticle命令分为两类

1:内置命令,CyberArticle内置的功能。例如新建文章,打开书籍等等

2:插件命令,通过插件来实现的功能。例如文章合并,编辑文章里面的插入日期,批量插入图片,插入链接等等。

这两类命令,需要分别自定义快捷键。

内置命令自定义快捷键

1、在工具栏上面点击右键,选择自定义

2、切换到键盘

选择相应的命令,然后可以指定新的热键,定义好后,关闭对话框即可。

CyberArticle主窗口,编辑文章窗口,都可以通过这种方式指定新的热键。注意:插件命令在这个对话框里面无法找到,因为插件命令是动态生成的。

插件命令自定义热键

1、CyberArticle主菜单->工具->选项->工具->插件

2、点击快捷键按钮

可以给插件命令设置快捷键。因为插件命令是动态生成的,无法指定任意的快捷键。

通过这两种方式,可以给CyberArticle所有的命令重新指定快捷键

分类: CyberArticle 标签:

CyberArticle二次开发手册 – 3、CyberArticle 书籍

2009年6月3日 魏 拾俊 没有评论

CyberArticle的资料,都保存在一个一个的书籍中。一个书籍,对应于一个数据库。CyberArticle的书籍,分为本地书籍和远程书籍。

  • 本地书籍:使用桌面数据库系统,例如Access,SQL Server Express或者SQLite数据库。书籍的文件,保存在安装CyberArticle的电脑上面。每一个书籍,对应一个(Access/SQLite)或者多个书籍文件(SQL Server Express)。
  • 远程书籍:使用大型数据库,例如SQL Server,MySQL数据库。数据保存在数据库服务器上面(当然也可以保存在本机)。

CyberArticle通过OLEDB方式连接这些数据库。同样,您也可以使用其它软件,例如各种数据库软件的管理工具,来打开相应的数据库。

CyberArticle通过ICABook对象,来封装了各种数据库的链接,打开和关闭等操作。使用ICABook,您不需要关心不同数据库之间的区别,甚至您根本不需要关心数据库。

ICABookCollection对象

CyberArticle把所有的书籍的一些数据库信息,都保存在Books.xml文件里面(数据库连接串被加密,以防用户名,密码等信息泄露)。同时,CyberArticle提供了ICABookCollection这个对象来访问这个文件。

下面的代码,创建了一个ICABookCollection对象,然后通过循环,显示了书籍列表里面,每一个书籍的名称。将下面的脚本保存成*.js文件,然后双击运行,就可以看到效果。

var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
    return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);    //ICABookCollection
for (var i = 0; i < objBookCollection.Count; i++)
{
    var bookname = objBookCollection.BookName(i);    //获得书籍名称
    jsAlert(bookname);
}

通过ICABookCollection对象,您可以获得每一个书籍的相关信息,例如GUID(用来标示每一个书籍),数据库连接串,书籍名称,书籍文件名(如果有的话),图标索引,分类等信息。

同时,通过ICABookCollection,你还可以添加书籍和删除书籍。具体功能,请参看开发人员手册

ICABook对象

ICABook对象,提供了大量的属性和方法,主要有以下几类:

  • 打开和关闭书籍
  • 书籍属性,例如GUID,名称,图标索引
  • 节点信息,例如获得根节点,回收站,创建文件夹,文章,获得某一个指定的节点,获得某一类节点等等
  • 搜索书籍
  • 获得书籍内其它的元素,例如附件,图标,标签等等
  • 其它操作,例如压缩,备份等等

打开和关闭书籍

下面的代码,演示了如何打开书籍。通过循环,获得每一个书籍的GUID,然后调用ICABook对象的Open函数来打开书籍。如果无法打开,则显示一个对话框,提示不能打开某一个书籍。

var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
    return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
    var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
    var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
    try
    {
        objBook.Open(guidBook); //打开书籍
        
//…
        objBook.Close();
    }
    catch (e)
    {
        var bookname = objBookCollection.BookName(i); //打开失败
        jsAlert(“不能打开书籍:” + bookname);
    }
}

获得书籍属性

下面的代码,可以显示每一个书籍的名称:通过ICABook对象获得,而不是在Books.xml文件里面保存的书籍名称(ICABookCollection)。

var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
    return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
    var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
    var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
    try
    {
        objBook.Open(guidBook); //打开书籍
        jsAlert(objBook.Name);
        //…
        objBook.Close();
    }
    catch (e)
    {
        var bookname = objBookCollection.BookName(i); //打开失败
        jsAlert(“不能打开书籍:” + bookname);
    }
}

节点信息

下面的代码,显示了每一个书籍的节点数量,同时在每一个书籍的根节点下面,创建了一个叫做 “I love CyberArticle”的文件夹。

var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
    return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
    var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
    var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
    try
    {
        objBook.Open(guidBook); //打开书籍
        //…
        jsAlert(objBook.Nodes.Count);
        var objNewNode = objBook.CreateFolder(objBook.RootNode, “I love CyberArticle”);  //在书籍根节点下面,创建一个新的节点。
        //…
        objBook.Close();
    }
    catch (e)
    {
        var bookname = objBookCollection.BookName(i); //打开失败
        jsAlert(“不能打开书籍:” + bookname);
    }
}

搜索书籍

下面的代码,在每一个书籍中,搜索”CyberArticle”,然后显示出搜索结果的一个节点标题(如果有的话):

var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
    return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
    var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
    var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
    try
    {
        objBook.Open(guidBook); //打开书籍
        //…
        var objResult = objBook.Search(“CyberArticle”, 1 + 2, 100); //搜索书籍
        if (objResult && objResult.Count > 0)   //如果搜索到
        {
            jsAlert(objResult.Item(0).Title);   //显示第一个节点的标题
        }
        //…
        objBook.Close();
    }
    catch (e)
    {
        var bookname = objBookCollection.BookName(i); //打开失败
        jsAlert(“不能打开书籍:” + bookname);
    }
}

获得书籍其它元素信息

下面的代码,可以显示出,每一个书籍里面,附件的数量。如果有附件的话,显示第一个附件的名称。

var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
    return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
    var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
    var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
    try
    {
        objBook.Open(guidBook); //打开书籍
        //…
        var objAttachments = objBook.Attachments;   //获得书籍内所有附件
        if (objAttachments)
        {
            jsAlert(objAttachments.Count); //显示书籍数量
            if (objAttachments.Count > 0)
            {
                jsAlert(objAttachments.Item(0).Name);   //显示第一个附件的名称
            }
        }
        //…
        objBook.Close();
    }
    catch (e)
    {
        var bookname = objBookCollection.BookName(i); //打开失败
        jsAlert(“不能打开书籍:” + bookname);
    }
}

压缩/备份书籍

下面的代码,可以压缩每一个书籍

var objShell = new ActiveXObject(“WScript.Shell”);
function jsAlert(msg)
{
    return objShell.Popup(msg, 10000, “CyberArticle”, 0);
}
var objBookCollection = new ActiveXObject(“CyberArticleBook.CABookCollection”);
for (var i = 0; i < objBookCollection.Count; i++)
{
    var objBook = new ActiveXObject(“CyberArticleBook.CABook”); //创建ICABook对象
    var guidBook = objBookCollection.GUID(i);   //获得书籍的GUID
    try
    {
        objBook.Open(guidBook); //打开书籍
        //…
        objBook.Compress();
        //…
        objBook.Close();
    }
    catch (e)
    {
        var bookname = objBookCollection.BookName(i); //打开失败
        jsAlert(“不能打开书籍:” + bookname);
    }
}

从上面的例子可以看出,只要获得了ICABook对象,您可以对书籍做任何操作。关于书籍的其它操作,请参考开发人员手册。

 

CyberArticle二次开发手册 – 2、CyberArticle COM对象

2009年6月3日 魏 拾俊 没有评论

要对CyberArticle进行二次开发,主要的方式,就是通过调用COM对象,而二次开发的核心内容,也就是COM对象的使用。

CyberArticle的COM对象主要分为以下几类:

1、书籍和节点相关的对象

CyberArticle的数据,都保存在书籍中,而书籍里面的基本元素就是节点。

  • 书籍:ICABook
  • 节点:ICANode
  • 文章:ICAArticle

通过ICABook,可以打开,关闭一个书籍,或者获得书籍里面的节点等信息。

ICANode是书籍里面的节点。文件夹,文章,统一称为节点。无论是文件夹,还是文章,都是一个节点。通过ICANode的相关信息,可以获得节点的信息,例如类型,标题等等。

ICAArticle则是文章节点所包含的文章数据对象。通过ICAArticle,可以将文章保存成HTML文件,或者更新一个文章等等。通过ICANode可以获得ICAArticle。

其他相关对象:

  • ICALabel:标签
  • ICAAttachment:附件
  • ICAArticleResource:文章资源。CyberArticle文章是一个HTML文件。HTML文件不但有HTML代码本身,还包括里面引用的CSS,图片,Flash等等资源。
  • ICAProfile:用来保存文章的配置文件,可以设置是否包含图片,包含脚本等等。
  • ICABookmark:书签。一个书签可以代表一个书签文件夹或者一篇文章
  • ICAIcon:图标。书籍内的自定义图标。
  • ICACommand:保存网页的命令。
  • ICADatabase:CyberArticle数据库对象
  • ICADBError:CyberArticle数据库操作错误对象
  • ICANodeHistory:结点历史纪录对象

2、集合对象

通常节点,书籍等等,都可能需要一个类似数组的集合,例如获得一个文件夹下面的文章,就需要一个集合。CyberArticle里面,对象的集合,都是ICAXXXCollection这样的对象。

  • ICABookCollection:书籍集合
  • ICANodeCollection:节点集合
  • ICALabelCollection:标签集合
  • ICAAttachmentCollection:附件集合
  • ICAArticleResourceCollection:文章资源集合
  • ICAProfileCollection:配置文件集合
  • ICABookmarkCollection:书签集合
  • ICAIconCollection:图标集合
  • ICANodeHistoryCollection:节点历史数据集合

每一个Collection对象,都至少具有以下两个属性:

    [propget, id(1), helpstring("property Count")] HRESULT Count([out, retval] LONG* pVal); 
    [propget, id(2), helpstring("property Item")] HRESULT Item([in] LONG nIndex, [out, retval] IDispatch** pVal);
  • 属性Count:返回集合的元素数量。
  • 属性Item:获得某一个元素。

下面是一个使用的例子:

C++ 例子

ICANodeCollection* pNodeCollection(pDisp);
//
long nCount = 0;
pNodeCollection->get_Count(&nCount);//获得节点数量
//
for (long i = 0; i < nCount; i++)
{
    CComPtr<IDispatch> spDispNode = NULL;
    if (FAILED(pNodeCollection->get_Item(i, &spDispNode)))//获得一个节点
        continue;
    //
    CComQIPtr<ICANode> spNode(spNodeDisp);//转换为ICANode
    //
    CComBSTR bstrTitle;
    spNode->get_Title(&bstrTitle);//获得标题
    AfxMessageBox(CString(bstrTitle));//显示标题
}

VBScript 例子

For i = 0 To objNodeCollection.Count - 1 Step 1
    Dim objNode
    Set objNode = objNodeCollection.item(i)
    MsgBox(objNode.Title)
Next

JavaScript例子

objBook.Open(guidBook);
var childNodes = objBook.RootNode.Children;
for (var i = 0; i < childNodes.Count; i++)
{
   jsAlert(childNodes.Item(i).Title);
}

3、UI相关对象

  • ICABookTools:书籍工具,可以显示创建/打开书籍对话框等等
  • ICACommonUI:通用UI,可以显示书籍,节点属性等对话框。
  • ICAHelper:可以用来在IE里面保存网页,并显示保存网页对话框
  • ICAContextMenu:IE右键菜单
  • ICAToolButton:IE工具栏按钮
  • ICAImportHTML,ICAImportHTMLData,ICAImportHTMLDataCollection:用来批量导入文件

4、CyberArticle用户交互

  • ICAAutomationApp:可以获得正在正在运行的CyberArticle的一些相关信息,例如用户正在打开的文章,选中的节点等等。

5、BookBuilder批量下载保存网页

  • ICABookBuilderAutomationApp:可以调用BookBuilder,批量下载网页。

6、通用对象,和CyberArticle没有关系,可以在任何地方使用

  • IWizBubbleWnd:一个消息框,通常用来显示一个信息。如果用户没有操作,一段时间后,自动消失
  • IWizURLDownloader:可以用来下载文件并获得下载后的文件
  • IWizProgressWnd:一个进度对话框
  • IWizRtf2Html:RTF2HTML,将RTF转换为HTML
  • IWizMessageBoxWnd:一个消息对话框,可以显示“不再提示”复选框。
  • IWizCommonUI:可以显示一些常用的对话框,例如输入文字对话框等等。
  • IWizMimeMessage:用来打开,保存,转换mime文件的工具。

以上这些,就是CyberArticle公开的COM对象。这些COM对象,全部都可以通过脚本语言(JsvaScript/VBScript),高级语言(C/C++/Delphi),.NET语言(C#/VB.NET)等等调用,只要这些语言支持COM自动化技术即可。

CyberArticle,也可以看作一个Shell程序,通过调用这些对象,来实现某些特定的功能。