您现在的位置: 华盟网 >> 编程 >> C语言 >> 正文

将doc文件批量转为pdf文件

2015/1/15 作者:不详 来源: 华盟收集
导读 需要将不少doc文件转为pdf,WPS带有这种功能,但是鼠标点击次数太多以后整个人都变得很烦躁  用了一下午去搜这方面的工具软件,找到若干。有一些免费,有一些试…

  需要将不少doc文件转为pdf,WPS带有这种功能,但是鼠标点击次数太多以后整个人都变得很烦躁

  用了一下午去搜这方面的工具软件,找到若干。有一些免费,有一些试用的,但总归就找到一个真正能用,虽说生成的文件名中有未授权字样,但批量修改文件名简单多了。

  谁知道到了实验室的电脑上因为什么打印机错误,还是不能用!

  于是决定自己写一个,

  第二天上午开始搜资料,乱搜一阵,居然发现WPS有二次开发的功能,大喜

  但是,没有C++开发接口的资料,而且官方论坛的C++例子是针对老版本的。

  于是参考别人写的C#和VB的例子,在那摸索一阵,总算完事。

  void CTestDocDlg::OnBnClickedButton1()

  {

  _beginthreadex(NULL, 0, convertThread, this, 0, NULL);

  //StartConvert(m_FileSrc);

  }

  void CTestDocDlg::OnBnClickedButton2()

  {

  // TODO: 在此添加控件通知处理程序代码

  TCHAR Buffer[MAX_PATH];

  BROWSEINFO bi;

  ZeroMemory(&bi, sizeof(BROWSEINFO));

  bi.hwndOwner = m_hWnd;

  bi.ulFlags = BIF_RETURNONLYFSDIRS ; //要求返回文件系统的目录

  bi.pszDisplayName = Buffer; //此参数如为NULL则不能显示对话框

  bi.lpszTitle = _T("请选择文件夹");

  bi.lpfn = NULL;

  bi.iImage=IDR_MAINFRAME;

  LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框

  if(pIDList)

  {

  SHGetPathFromIDList(pIDList, Buffer);

  //取得文件夹路径到Buffer里

  UpdateData(FALSE);

  m_FileSrc = Buffer;//将文件夹路径保存在一个CString对象里

  if(m_FileSrc != "" && m_FileSrc.GetAt(m_FileSrc.GetLength() - 1) != '\\')

  m_FileSrc += "\\";

  m_destPath.SetWindowText(m_FileSrc);

  }

  else

  {

  }

  }

  

  int CTestDocDlg::StartConvert(CString path)

  {

  CFileFind fileFinder;

  CString filePth = path + _T("*.doc");

  BOOL bFinished = fileFinder.FindFile(filePth);

  // 先搜集文件信息,保存起来,再集中处理!

  while(bFinished)

  {

  bFinished = fileFinder.FindNextFile();

  CString fileName = fileFinder.GetFileName();

  AddFileInfo(fileName.GetBuffer(0));

  //ConvertFile(path + fileName);

  }

  fileFinder.Close();

  std::vector::iterator theIter;

  for(theIter = m_vecFileName.begin(); theIter != m_vecFileName.end(); theIter++)

  {

  ConvertFile(path + theIter->c_str());

  }

  return 0;

  }

  int CTestDocDlg::ConvertFile(CString szFileName)

  {

  CApplication app;

  app.CreateDispatch("WPS.APPLICATION");

  //app.SetVisible(TRUE);

  //app.doc

  app.put_Visible(FALSE);

  CDocuments docs = app.get_Documents();

  CDocument0 doc = docs.Open(szFileName, FALSE, TRUE, FALSE, NULL, NULL, TRUE, NULL, NULL, 0, 0, FALSE, FALSE, 0, FALSE);

  CString pdfName = szFileName;

  pdfName.Replace("doc", _T("pdf"));

  doc.ExportPdf(pdfName, NULL, NULL);

  //docs.Close(NULL, NULL, NULL);

  //doc.Close(NULL, NULL, NULL);

  COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR),

  vtTrue((short)TRUE),

  vtFalse((short)FALSE);

  doc.Close(vtFalse, vtOptional, vtOptional);

  return 0;

  }

  unsigned int WINAPI CTestDocDlg::convertThread(void *pParam)

  {

  CoInitialize(NULL);

  ((CTestDocDlg *)pParam)->ReadConvert();

  ::CoUninitialize();

  return 0;

  }

  int CTestDocDlg::ReadConvert()

  {

  StartConvert(m_FileSrc);

  return 0;

  }

  void CTestDocDlg::AddFileInfo(CString strFileName)

  {

  m_vecFileName.push_back(strFileName.GetBuffer(0));

  }

  后面线程总算是解决了,换了个初始化COM的函数,另外每个线程都要进行初始化!

                  微信群名称:华盟黑白之道二群   华盟-黑白之道⑦QQ群: 9430885

  • 上一篇编程:

  • 下一篇编程:
  • 网友评论
      验证码
     

    关注

    分享

    0

    讨论

    2

    猜你喜欢

    论坛最新贴

    编程栏目相关内容