如题。我只能把第一页转换成BMP,不知怎样转换其它页。
我的基本思想是把每一页复制到剪贴板,然后保存为BMP。

解决方案 »

  1.   

    我给一个思路:
    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);
    }
      

  2.   

    赞一个,我想到的办法也只有打印的方法,就象PDF一样实现打印到文件
    另外你可以参考一下PDF的开发包中是否还有其他接口
      

  3.   

    to:wuchi(风云)
    最后生成的ps文件含有页面信息,用gswiew可以一页页的存为bmp,只是在程序中,我以前用的一个dll找不到了
      

  4.   

    keiy:你可以给出ps->bmp的源程序吗?我不懂ps文件.
      

  5.   

    写一个虚拟打印的程序,直接把word往虚拟打印中送,出来的数据就可以自己处理了,例如写成BMP,jpg等等。
      

  6.   

    我现在以前用的也找不到ps->BMP的DLL程序了,只有用现成的应用软件gsview (很多网上有下的),实际上它也是调用公开源码的AFPL Ghostscript.它在http://sourceforge.net/project/showfiles.php?group_id=1897&release_id=160061有下载,研究一下.
      

  7.   

    如果你下载安装好了Ghostscript(我用的是8.51),可调用以下批处理(假定为ps2bmp):setlocal
    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了
     
      

  8.   

    打错了:
    输出结果为
    t001.bmp(第一页) t002.bmp(第一页) ...