以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- RTF文件结构分析及其应用 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=56853) |
-- 作者:卷积内核 -- 发布时间:12/17/2007 1:46:00 PM -- RTF文件结构分析及其应用 RTF是一种非常流行的文件结构,很多文字编辑器都支持它,VB等开发工具 甚至还提供了Richtxtbox的控件。编写通用工具的程序员应该考虑在自己的软 件中加入读写RTF文件的功能,这样就需要对RTF的结构有充分的了解。而现在 最重要的信息发布手段莫过于WWW了,在编辑软件中提供RTF到HTML的转换也是程 序员应该考虑的事情。尽管WORD中已经有这个功能,但不能因此就对您的顾客 说:“先用我的程序存成RTF,然后再用WORD......”。 下面将对RTF文件结构分析及其应用进行讨论。 一、RTF文件结构分析 RTF的结构并不复杂,但内容繁多,本文不可能一一说明,只能从总体上讨 {\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;} 开始时用\colortbl标明大括号内是颜色表,接着是\red0\green0\blue0, 二、算法分析 本节介绍的算法虽然是针对RTF的读写,但也是一般文件过滤器通用的方 三、难点分析 在开发过程中我们遇到了不少问题,其中有两个问题特别有意思。 第一个问题是中文的表示方式。在RTF中中文用命令的形式表示: \'b5\'e7\'d7\'d3\'d3\'eb\'b5\'e7\'c4\'d4 第二个是图片的问题,这也是本文的重点。RTF中图片以两种方式存在:第 void WmfToBmp(int width,int height,char *metafile) { //width为图片宽度,height为图片高度,*metafile为元文件名 static HMETAFILE hmf; char num[4]; FILE *fh; HDC hMemDC; HBITMAP hbmp,hold; BITMAPFILEHEADER hdr; LPBITMAPINFOHEADER lpbmpih; HGLOBAL hg;
BitmapCount++; if(BitmapCount==3) { width=128; height=132; } if(BitmapCount==1) { width=80; height=50; } ToString10(BitmapCount,num); //把字符串转换成数字的函数 lstrcpy(bmpFile,FilePath); lstrcat(bmpFile,num); lstrcpy(gifFile,bmpFile); lstrcat(bmpFile,".bmp"); lstrcat(gifFile,".gif"); hmf=GetMetaFile(metafile); hDisplayDC=CreateDC("DISPLAY",NULL,NULL,NULL); hMemDC=CreateCompatibleDC(hDisplayDC); hg=GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)); lpbmpih=(LPBITMAPINFOHEADER)GlobalLock(hg); lpbmpih->biSize=sizeof(BITMAPINFOHEADER); lpbmpih->biWidth=width; lpbmpih->biHeight=height; lpbmpih->biPlanes=1; lpbmpih->biBitCount=8; lpbmpih->biCompression=0; hbmp=CreateCompatibleBitmap(hDisplayDC,width,height); GlobalUnlock(hg); GlobalFree(hg); hold=SelectObject(hMemDC,hbmp); SetMapMode(hMemDC,MM_ANISOTROPIC); SetWindowOrgEx(hMemDC,0,0,NULL); SetViewportExtEx(hMemDC,width,height,NULL); PlayMetaFile(hMemDC,hmf); hbmp=SelectObject(hMemDC,hold); if((fh=fopen(bmpFile,"w+b"))==NULL) { return; } hdr.bfType=0x4d42; hdr.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)+width*height; hdr.bfReserved1=0; hdr.bfReserved2=0; hdr.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD); fwrite((LPSTR)&hdr,sizeof(BITMAPFILEHEADER),1,fh); hg=GlobalAlloc(GHND,sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)); lpbmpih=(LPBITMAPINFOHEADER)GlobalLock(hg); lpbmpih->biSize=sizeof(BITMAPINFOHEADER); lpbmpih->biWidth=width; lpbmpih->biHeight=height; lpbmpih->biPlanes=1; lpbmpih->biBitCount=8; lpbmpih->biCompression=0; lpbmpih->biSizeImage=width*height; lpbmpih->biClrUsed=256; lpbmpih->biClrImportant=0; j=GetDIBits(hMemDC,hbmp,0,height,NULL,(BITMAPINFO*)lpbmpih,DIB_RGB_COLORS); lpbmpih->biSize=sizeof(BITMAPINFOHEADER); fwrite(lpbmpih,sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD),1,fh); GetDIBits(hMemDC,hbmp,0,height,(LPSTR)FileBuffer,(BITMAPINFO*)lpbmpih,DIB_RGB_COLS); fwrite(FileBuffer,width*height,1,fh); GlobalUnlock(hg); GlobalFree(hg); fclose(fh); DeleteDC(hMemDC); DeleteDC(hDisplayDC); DeleteObject(hbmp); DeleteObject(hold); DeleteMetaFile(hmf); }//end function WmfToBmp() 用这种方法还有一个好处,那就是当你从最底层开始开发RTF阅读器时,只 四.RTF格式的扩展 最后讨论一下RTF格式的扩展。RTF格式作为一个标准应该是统一的,但在 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
3,916.992ms |