怎样把WORD的每一页转换成图片.(VC Automation.) 如题。我只能把第一页转换成BMP,不知怎样转换其它页。我的基本思想是把每一页复制到剪贴板,然后保存为BMP。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我给一个思路:1.在系统下建一PS(post script)彩色激光打印机,如 HP Color LaserJet 8500 PS 并设它的端口为打印到文件2.将你的word打印到该打印机上,它会生成post script文件3.将post script文件转成bmp----------------------------------------其中,2我已用程序实现:void CWordtobmpDlg::OnButton1() { // TODO: Add your control notification handler code here // TODO: Add your control notification handler code here CoInitialize(NULL); _Application oWord ; Documents oDocs; _Document oDoc; COleDispatchDriver oWordBasic; COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR); //For optional args COleVariant vFalse(short(false)); COleVariant vTrue(short(true)); //Start Word if(!(oWord.CreateDispatch("Word.Application", NULL))) { AfxMessageBox("Error starting Word.", MB_SETFOREGROUND); return; } //Open a document oDocs = oWord.GetDocuments(); oDoc = oDocs.Open(COleVariant("e:\\temp\\t.doc"),vFalse,vFalse,vFalse, vOpt, vOpt,vOpt, vOpt, vOpt, vOpt,vOpt,vOpt); oWordBasic = oWord.GetWordBasic();HRESULT hr; OLECHAR FAR* szMethod[3]; DISPID dispid[3]; //Retrieve the DISPIDs for the function as well as two of its named //arguments, Printer and DoNotSetAsSysDefault szMethod[0]=OLESTR("FilePrintSetup"); //method name szMethod[1]=OLESTR("Printer"); //argument name szMethod[2]=OLESTR("DoNotSetAsSysDefault"); //argument name hr = oWordBasic.m_lpDispatch->GetIDsOfNames(IID_NULL, szMethod, 3, LOCALE_USER_DEFAULT, dispid); //Invoke the FilePrintSetup function using named arguments. VARIANT vArgs[2]; DISPPARAMS dp; dp.cArgs = 2; dp.cNamedArgs = 2; dp.rgvarg = vArgs; dp.rgdispidNamedArgs=&(dispid[1]); vArgs[1].vt = VT_I2; vArgs[1].iVal = 1; //DoNotSetAsSysDefault = 1 vArgs[0].vt = VT_BSTR; vArgs[0].bstrVal = ::SysAllocString(OLESTR("HP Color LaserJet 8500 PS")); hr = oWordBasic.m_lpDispatch->Invoke(dispid[0], IID_NULL, LOCALE_USER_DEFAULT,DISPATCH_METHOD, &dp, NULL, NULL, NULL); ::SysFreeString(vArgs[0].bstrVal); //Print the document oDoc.PrintOut(COleVariant((short)false), vOpt, vOpt, COleVariant("e:\\temp\\t.ps"), vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vTrue, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt); // oDoc.PrintOut(1,2,3,4,5,6,7,8,9,10,11 oDoc.Close(COleVariant((short)false), vOpt, vOpt); //Clean-up oDoc.ReleaseDispatch(); oDocs.ReleaseDispatch(); // oWordBasic.ReleaseDispatch(); //Quit Word oWord.Quit(COleVariant((short)false), vOpt, vOpt); } 赞一个,我想到的办法也只有打印的方法,就象PDF一样实现打印到文件另外你可以参考一下PDF的开发包中是否还有其他接口 to:wuchi(风云)最后生成的ps文件含有页面信息,用gswiew可以一页页的存为bmp,只是在程序中,我以前用的一个dll找不到了 keiy:你可以给出ps->bmp的源程序吗?我不懂ps文件. 写一个虚拟打印的程序,直接把word往虚拟打印中送,出来的数据就可以自己处理了,例如写成BMP,jpg等等。 我现在以前用的也找不到ps->BMP的DLL程序了,只有用现成的应用软件gsview (很多网上有下的),实际上它也是调用公开源码的AFPL Ghostscript.它在http://sourceforge.net/project/showfiles.php?group_id=1897&release_id=160061有下载,研究一下. 如果你下载安装好了Ghostscript(我用的是8.51),可调用以下批处理(假定为ps2bmp):setlocalset gsdir=E:\Program Files\gsset gsver=gs8.51path=%gsdir%\%gsver%\bin;%gsdir%\%gsver%\lib;%gsdir%\fonts%~d1cd %~p1set ps2bmpoutfile=%~n1%%03dset ps2bmpinfile=%~nx1call gssetgs.batrem change parameter -r for dots/inch%GSC% -q -sDEVICE=bmp16m -r200 -dNOPAUSE -dBATCH -sOutputFile=%ps2bmpoutfile%.bmp %ps2bmpinfile%用system/winexec/shellexec/creatprocess执行以上批处理一个参数,为我楼上生成的ps文件(如t.ps)输出结果为t001.bmp(第一页) t002.ps(第一页) ...-----------------------------------------------这样就全部OK了 打错了:输出结果为t001.bmp(第一页) t002.bmp(第一页) ... 如何在Win7下以管理员方式运行程序 vc中怎样给.exe做链接 学习ATL 我创建了一个向导,但是不知道如何控制点下一步后进入哪个页面。 cannot execute program是为什么 动态链接库调用fgetc函数耗时比直接调用长的问题 进程间通信有那几种方法? 用socket的recv()获得ftp服务器的返回信息 如何让一个mainfrm一开始就最大化? 一个关于键盘输入的很难的问题 200分求一个从CArray类派生的类的源代码,最少要重载了“=”和“[]”操作符 请教#import
1.在系统下建一PS(post script)彩色激光打印机,如
HP Color LaserJet 8500 PS
并设它的端口为打印到文件
2.将你的word打印到该打印机上,它会生成post script文件
3.将post script文件转成bmp
----------------------------------------
其中,2我已用程序实现:
void CWordtobmpDlg::OnButton1()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here
CoInitialize(NULL); _Application oWord ;
Documents oDocs;
_Document oDoc;
COleDispatchDriver oWordBasic;
COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR); //For optional args COleVariant vFalse(short(false));
COleVariant vTrue(short(true)); //Start Word
if(!(oWord.CreateDispatch("Word.Application", NULL))) {
AfxMessageBox("Error starting Word.", MB_SETFOREGROUND);
return;
} //Open a document
oDocs = oWord.GetDocuments(); oDoc = oDocs.Open(COleVariant("e:\\temp\\t.doc"),vFalse,vFalse,vFalse,
vOpt, vOpt,vOpt, vOpt, vOpt, vOpt,vOpt,vOpt); oWordBasic = oWord.GetWordBasic();HRESULT hr;
OLECHAR FAR* szMethod[3];
DISPID dispid[3]; //Retrieve the DISPIDs for the function as well as two of its named
//arguments, Printer and DoNotSetAsSysDefault
szMethod[0]=OLESTR("FilePrintSetup"); //method name szMethod[1]=OLESTR("Printer"); //argument name
szMethod[2]=OLESTR("DoNotSetAsSysDefault"); //argument name hr = oWordBasic.m_lpDispatch->GetIDsOfNames(IID_NULL, szMethod, 3,
LOCALE_USER_DEFAULT, dispid); //Invoke the FilePrintSetup function using named arguments.
VARIANT vArgs[2];
DISPPARAMS dp;
dp.cArgs = 2; dp.cNamedArgs = 2;
dp.rgvarg = vArgs;
dp.rgdispidNamedArgs=&(dispid[1]); vArgs[1].vt = VT_I2;
vArgs[1].iVal = 1; //DoNotSetAsSysDefault = 1
vArgs[0].vt = VT_BSTR;
vArgs[0].bstrVal = ::SysAllocString(OLESTR("HP Color LaserJet 8500 PS")); hr = oWordBasic.m_lpDispatch->Invoke(dispid[0], IID_NULL,
LOCALE_USER_DEFAULT,DISPATCH_METHOD, &dp, NULL, NULL, NULL); ::SysFreeString(vArgs[0].bstrVal); //Print the document
oDoc.PrintOut(COleVariant((short)false), vOpt, vOpt, COleVariant("e:\\temp\\t.ps"),
vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vTrue,
vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt);
// oDoc.PrintOut(1,2,3,4,5,6,7,8,9,10,11
oDoc.Close(COleVariant((short)false), vOpt, vOpt); //Clean-up
oDoc.ReleaseDispatch();
oDocs.ReleaseDispatch();
// oWordBasic.ReleaseDispatch(); //Quit Word
oWord.Quit(COleVariant((short)false), vOpt, vOpt);
}
另外你可以参考一下PDF的开发包中是否还有其他接口
最后生成的ps文件含有页面信息,用gswiew可以一页页的存为bmp,只是在程序中,我以前用的一个dll找不到了
set gsdir=E:\Program Files\gs
set gsver=gs8.51
path=%gsdir%\%gsver%\bin;%gsdir%\%gsver%\lib;%gsdir%\fonts
%~d1
cd %~p1
set ps2bmpoutfile=%~n1%%03d
set ps2bmpinfile=%~nx1
call gssetgs.bat
rem change parameter -r for dots/inch
%GSC% -q -sDEVICE=bmp16m -r200 -dNOPAUSE -dBATCH -sOutputFile=%ps2bmpoutfile%.bmp %ps2bmpinfile%用system/winexec/shellexec/creatprocess执行以上批处理
一个参数,为我楼上生成的ps文件(如t.ps)
输出结果为
t001.bmp(第一页) t002.ps(第一页) ...
-----------------------------------------------
这样就全部OK了
输出结果为
t001.bmp(第一页) t002.bmp(第一页) ...