0

我有一个奇怪的问题,我试图从控制台应用程序打印 microsoft word 中的特定页面范围,我看到奇怪的结果,我假设这是我在指定页面范围时做错的事情。

看来,在我打印一个页面范围并获取 word 文档中的总页数之后,这个数字在我打印特定范围后会有所不同。另一个奇怪的事情是,这在调试模式下有效,但在发布模式下无效。

前任。Word 文档由 2 页组成 打印第 1-1 页。获取页数返回2

打印第2-2页获取页数返回1

下面的代码用于打印一系列页面:

int CWordComm::PrintAndCloseActiveDocument(int iNumOfCopies, short nTray, int pageNumber)
{
    // Convenient values declared as ColeVariants.
    COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    _Document oActiveDoc = m_oWord.GetActiveDocument();

    if(!this->m_szOutputFilename.IsEmpty())
    {
        //If we are outputting the document to a file then we need to print a single page at a time
        //This is because of a limitation on the ikonprinter/requisition printer side that can only handle
        //one page at a time
        // Print out to file
        CString szCurrentPage, szPrintRange;
        szCurrentPage.Format("%d", pageNumber);
        szPrintRange.Format("%d", PRINT_FROM_TO);  //PRINT_FROM_TO is #define PRINT_FROM_TO 3

        COleVariant printRange(szPrintRange, VT_BSTR);
        COleVariant currentPage(szCurrentPage, VT_BSTR);

        sprintf(m_szLogMessage, "Printing page %d of requisition", pageNumber);
        LogMessage(m_szLogMessage);

        oActiveDoc.PrintOut(covFalse,          // Background.
            covOptional,           // Append.
            printRange,             // Range.
            COleVariant(szFileName,VT_BSTR),  // OutputFileName.
            currentPage,           // From.
            currentPage,           // To.
            covOptional,           // Item.
            COleVariant((long)1),  // Copies.
            covOptional,           // Pages.
            covOptional,           // PageType.
            covTrue,               // PrintToFile.
            covOptional,           // Collate.
            covOptional,           // ActivePrinterMacGX.
            covOptional            // ManualDuplexPrint.
            );
    }
    else
    {
        // Print out to file
        oActiveDoc.PrintOut(covFalse,          // Background.
            covOptional,           // Append.
            covOptional,           // Range.
            COleVariant(szFileName,VT_BSTR),  // OutputFileName.
            covOptional,           // From.
            covOptional,           // To.
            covOptional,           // Item.
            COleVariant((long)1),  // Copies.
            covOptional,           // Pages.
            covOptional,           // PageType.
            covTrue,               // PrintToFile.
            covOptional,           // Collate.
            covOptional,           // ActivePrinterMacGX.
            covOptional            // ManualDuplexPrint.
            );
    }

    //Get the number of pages in the word document
    iNumPages=GetActiveDocPageCount();

    //omitted code
}

获取页面方法

int CWordComm::GetActiveDocPageCount()
{
    try
    {
        _Document oActiveDoc; 
        //Get the Active Document
        oActiveDoc = m_oWord.GetActiveDocument();

        //Get the BuiltinDocumentProperties collection for the 
        //document
        LPDISPATCH lpdispProps;
        lpdispProps = oActiveDoc.GetBuiltInDocumentProperties();

        //Get the requested Item from the BuiltinDocumentProperties 
        //collection
        //NOTE:  The DISPID of the "Item" property of a 
        //       DocumentProperties object is 0x0
        VARIANT vResult;
        DISPPARAMS dpItem;
        VARIANT vArgs[1];
        vArgs[0].vt = VT_BSTR;

        //property name for the number of pages in the active document
        _bstr_t btVal("Number of pages");

        vArgs[0].bstrVal = btVal;
        dpItem.cArgs=1;
        dpItem.cNamedArgs=0;
        dpItem.rgvarg = vArgs;
        HRESULT hr = lpdispProps->Invoke(0x0, IID_NULL, 
            LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, 
            &dpItem, &vResult, NULL, NULL);

        //Get the Value property of the BuiltinDocumentProperty
        //NOTE:  The DISPID of the "Value" property of a 
        //       DocumentProperty object is 0x0
        DISPPARAMS dpNoArgs = {NULL, NULL, 0, 0};
        LPDISPATCH lpdispProp;
        lpdispProp = vResult.pdispVal;
        hr = lpdispProp->Invoke(0x0, IID_NULL, LOCALE_USER_DEFAULT, 
            DISPATCH_PROPERTYGET, &dpNoArgs, &vResult, 
            NULL, NULL);

        CString sPropValue = "";
        switch (vResult.vt)
        {
        case VT_BSTR:
            sPropValue = vResult.bstrVal;
            break;
        case VT_I4:
            sPropValue.Format("%d",vResult.lVal);
            break;
        case VT_DATE:
            {
                COleDateTime dt (vResult);
                sPropValue = dt.Format(0, LANG_USER_DEFAULT);
                break;
            }
        default:
//          sPropValue = "<Information for the property you selected is not available>";
            sPropValue = "-4";
            break;
        }

        //Release the no longer needed IDispatch pointers
        lpdispProp->Release();
        lpdispProps->Release();

        return atoi(sPropValue);

    }
    catch(...)
    {
        return FUNC_ERROR;
    }
}

问题

有什么明显的我做错了吗?如果我想打印一系列页面,我应该以不同的方式与 word 交互吗?

4

2 回答 2

0

如果它在调试模式下工作正常,我建议您将值(例如页数、正在打印的页面等)写入文本文件。将调试日志输出与发布日志输出进行比较。这是一个可能对您有所帮助的链接。该链接不在 C++ 中,但可能会以正确的方式指导您。

于 2013-07-10T14:51:28.567 回答
0

事实证明这是某种时间问题。我在打印文档之后和计算页数之前休眠了 500 毫秒,现在我一直得到正确的结果。

当我调试时,它基本上是在做同样的事情。

于 2013-08-07T18:33:12.110 回答