zoukankan      html  css  js  c++  java
  • Word转换PDF格式的C#第二版(不再使用WSH宿主脚本)

    第一个版本,查看

    为什么要写第二个版本呢,当时再完成项目时,比较赶,没有多考虑,就借用cscript方式写了个脚本,现在该项目已经开完评审会,有时间重新将该程序重写,直接使用纯C#来完成.

    当时由于在使用ACRODISTXLib.PdfDistillerClass发生错误,主要是转换一篇文档后,无法释放,再次调用时发生错误.


    同第一版一样,安装需要的环境,注意其中提到的安装打印机.以下代码并没有提供当前的打印机,而是使用系统默认的,即设置的"MS Publisher Color Printer".
    注意必须添加引用Acrobat Distiller与WORD,本人使用的是WORD2003

    using oWord = Microsoft.Office.Interop.Word;
    private void WordConvert()
      {

        oWord.ApplicationClass word = new Microsoft.Office.Interop.Word.ApplicationClass();
        Type wordType= word.GetType();

        //打开WORD文档
        /*对应脚本中的
         var word = new ActiveXObject("Word.Application");
         var doc  = word.Documents.Open(docfile);
        */
        oWord.Documents docs = word.Documents;
        Type docsType = docs.GetType();
        object objDocName = @"c:\test.doc";
        oWord.Document doc = (oWord.Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] {objDocName, true, true});

        //打印输出到指定文件
        //你可以使用 doc.PrintOut();方法,次方法调用中的参数设置较繁琐,建议使用 Type.InvokeMember 来调用时可以不用将PrintOut的参数设置全,只设置4个主要参数
        Type docType = doc.GetType();
        object printFileName = @"c:\test.ps";
        docType.InvokeMember("PrintOut",System.Reflection.BindingFlags.InvokeMethod,null,doc,new object[]{false,false,oWord.WdPrintOutRange.wdPrintAllDocument,printFileName});
        //new object[]{false,false,oWord.WdPrintOutRange.wdPrintAllDocument,printFileName}
        //对应脚本中的word.PrintOut(false, false, 0, psfile);的参数

        //退出WORD
        //对应脚本中的word.Quit();
        wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod,null, word, null);

       
        
       
        object o1= "c:\\test.ps";
        object o2= "c:\\test.pdf";
        object o3= "";

       //引用将PS转换成PDF的对象
       //try catch之间对应的是脚本中的 PDF.FileToPDF(psfile,pdffile,"");   //你可以使用 pdfConvert.FileToPDF("c:\\test.ps","c:\\test.pdf","");这样的转换方法,本人只是为了保持与WORD相同的调用方式
       try
       {
        ACRODISTXLib.PdfDistillerClass pdf = new ACRODISTXLib.PdfDistillerClass();
        Type pdfType = pdfConvert.GetType();
        pdfType.InvokeMember("FileToPDF",System.Reflection.BindingFlags.InvokeMethod,null,pdf,new object[]{o1,o2,o3});
        pdf = null;
       }
       catch{} //读者自己补写错误处理

        //为防止本方法调用多次时发生错误,必须停止acrodist.exe进程
        foreach(Process proc in System.Diagnostics.Process.GetProcesses())
        {
         int begpos;
         int endpos;

         string sProcName = proc.ToString();
         begpos = sProcName.IndexOf("(")+1;
         endpos = sProcName.IndexOf(")");
        
         sProcName=sProcName.Substring(begpos,endpos-begpos);

         if(sProcName.ToLower().CompareTo("acrodist")==0)
         {
          try
          {
           proc.Kill(); //停止进程
          }
          catch{}  //读者自己补写错误处理
          break;
         }
        }


      }

  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/happyday56/p/1026020.html
Copyright © 2011-2022 走看看