Word 2010 轉 PDF

環境:VS2013, Office2010

網絡上扒下代碼如下,親測可用(只測試了Office2010);

建立一個VC控制檯非空工程,修改相應代碼,具體工程見資源:https://download.csdn.net/download/awlp1990/12317681

完整代碼如下:

#include "stdafx.h"

#include <stdio.h>
#include <tchar.h>
#include <iostream>

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // some CString constructors will be explicit

#include <atlbase.h>
#include <atlstr.h>
#include <atlcom.h>

//導入Office類型庫
#import "C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE14\\MSO.DLL" \
    rename("RGB", "MSORGB")

// 導入VB的類型庫
#import "C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"

//導入Word的類型庫
#import "D:\\Program Files (x86)\\Microsoft Office\\Office14\\MSWORD.OLB" \
    rename("ExitWindows", "WordExitWindows") \
    rename("FindText", "WordFindText")

#import "D:\\Program Files (x86)\\Microsoft Office\\Office14\\MSPPT.OLB"
#import "D:\Program Files (x86)\Microsoft Office\\Office14\\EXCEL.EXE" \
    rename("DialogBox","_DialogBox") \
    rename("RGB","_RGB") \
    exclude("IFont","IPicture")

//// 導入Excel的類型庫
//#import "D:\\Program Files (x86)\\Microsoft Office\\Office14\\EXCEL.EXE" \
//    rename("RGB", "ExcelRGB") \
//    rename("ReplaceText", "ExcelReplaceText") \
//    rename("CopyFile", "ExcelCopyFile") \
//    rename("DialogBox", "ExcelDialogBox") \
//    no_auto_exclude

//實現
int Word2Pdf(std::wstring inputFileName, std::wstring outputFileName)
{
    int nRet = 0;
    Word::_ApplicationPtr  pWordApp = NULL;
    Word::_DocumentPtr   pDoc = NULL;
    HRESULT hr = S_OK;

    BSTR szBstrOutputFileName;
    szBstrOutputFileName = SysAllocString(outputFileName.c_str());
    hr = pWordApp.CreateInstance(__uuidof(Word::Application));
    if (hr != S_OK)
    {
        return 1;
    }

    Word::DocumentsPtr pDocs = NULL;
    pWordApp->get_Documents(&pDocs);

    if (pDocs == NULL)
    {
        nRet = 2;
        goto _RELEASE_APP;
    }

    try
    {
        //只讀打開文件
        pDoc = pDocs->Open(&(_variant_t(inputFileName.c_str())), &(_variant_t(false)), &(_variant_t(true)));
        if (pDoc == NULL)
            goto _RELEASE_APP;

        pDoc->ExportAsFixedFormat(szBstrOutputFileName, Word::WdExportFormat::wdExportFormatPDF, VARIANT_FALSE,
            Word::WdExportOptimizeFor::wdExportOptimizeForPrint, Word::WdExportRange::wdExportAllDocument, 1, 1,
            Word::WdExportItem::wdExportDocumentContent, VARIANT_TRUE, VARIANT_TRUE,
            Word::WdExportCreateBookmarks::wdExportCreateNoBookmarks, VARIANT_TRUE, VARIANT_TRUE, VARIANT_FALSE);

        pDoc->Close();
        pDoc.Release();
        pDoc = NULL;
    }
    catch (...)
    {
        nRet = 3;
    }

_RELEASE_APP:
    pWordApp->Quit();
    pWordApp.Release();
    pWordApp = NULL;

    return nRet;
}

int Excel2Pdf(std::wstring inputFileName, std::wstring outputFileName)
{
    HRESULT hr = S_OK;
    int nRet = 0;
    Excel::_ApplicationPtr pApplication = NULL;
    Excel::_WorkbookPtr pThisWorkbook = NULL;
    BSTR szBstrInputFileName;
    BSTR szBstrOutputFileName;

    szBstrInputFileName = SysAllocString(inputFileName.c_str());
    szBstrOutputFileName = SysAllocString(outputFileName.c_str());

    if (FAILED(pApplication.CreateInstance(__uuidof(Excel::Application))))
    {
        wprintf(L"CreateInstance failed w/err 0x%08lx\n", hr);
        return 1;
    }
    try
    {
        pThisWorkbook = pApplication->GetWorkbooks()->Open(szBstrInputFileName);
        pThisWorkbook->ExportAsFixedFormat(Excel::XlFixedFormatType::xlTypePDF, szBstrOutputFileName);
        pThisWorkbook->Close();
        pThisWorkbook.Release();
        pThisWorkbook = NULL;

    }
    catch (...)
    {
        nRet = 2;
    }

    pApplication->Quit();
    pApplication.Release();
    pApplication = NULL;

    return nRet;
}

int Ppt2Pdf(std::wstring inputFileName, std::wstring outputFileName)
{
    PowerPoint::_ApplicationPtr spPpApp = NULL;
    PowerPoint::PresentationsPtr  spPres = NULL;
    PowerPoint::_PresentationPtr  pPre = NULL;

    BSTR szBstrInputFileName;
    BSTR szBstrOutputFileName;
    BSTR szBstrEmpty;
    HRESULT hr = S_OK;
    int nRet = 0;

    szBstrInputFileName = SysAllocString(inputFileName.c_str());
    szBstrOutputFileName = SysAllocString(outputFileName.c_str());
    szBstrEmpty = SysAllocString(L"");

    if (FAILED(spPpApp.CreateInstance(__uuidof(PowerPoint::Application))))
    {
        wprintf(L"CreateInstance failed w/err 0x%08lx\n", hr);
        return 1;
    }

    spPres = spPpApp->Presentations;
    if (spPres == NULL)
    {
        nRet = 2;
        goto _RELEASE_APP;
    }

    try
    {
        pPre = spPres->Open(szBstrInputFileName,
            Office::MsoTriState::msoTrue, Office::MsoTriState::msoFalse, Office::MsoTriState::msoFalse);
        if (pPre == NULL)
        {
            nRet = 3;
            goto _RELEASE_APP;
        }

        pPre->ExportAsFixedFormat(szBstrOutputFileName, PowerPoint::PpFixedFormatType::ppFixedFormatTypePDF,
            PowerPoint::PpFixedFormatIntent::ppFixedFormatIntentPrint, Office::MsoTriState::msoTriStateMixed,
            PowerPoint::PpPrintHandoutOrder::ppPrintHandoutHorizontalFirst, PowerPoint::PpPrintOutputType::ppPrintOutputSlides,
            Office::MsoTriState::msoFalse, NULL, PowerPoint::PpPrintRangeType::ppPrintAll, szBstrEmpty,
            VARIANT_TRUE, VARIANT_FALSE, VARIANT_TRUE, VARIANT_TRUE, VARIANT_FALSE);
        pPre->Close();
        pPre.Release();
        pPre = NULL;
    }
    catch (...)
    {
        nRet = 4;
    }

_RELEASE_APP:
    spPpApp->Quit();
    spPpApp.Release();
    spPpApp = NULL;

    return nRet;
}

int _tmain(int argc, _TCHAR* argv[])
{
    if (argc < 3)
        return -1;

    std::wstring _strSrcPath = argv[1];
    std::wstring _strDstPath = argv[2];

    CoInitialize(nullptr);

    //當前文檔的後綴..//TEXT();
    std::wstring _suffix = _strSrcPath.substr(_strSrcPath.find_last_of(TEXT(".")) + 1);
    if (_suffix == TEXT("doc") || _suffix == TEXT("docx"))
    {
        //轉換word文檔..
        Word2Pdf(_strSrcPath, _strDstPath);
    }
    else
    {
        ;
    }

    return 0;
}

//測試運行如下:

weilp