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;
         }
        }


      }

  • 相关阅读:
    js异步加载服务端数据
    日期操作
    《jQuery实战》第2章 创建元素和包装集
    访问共享目录电脑盘符
    《jQuery实战》第4章 事件
    《jQuery实战》第3章 用JQuery让页面生动起来
    div + CSS 学习笔记
    WinJS Promise设置超时,可用于设置网络请求超时
    WinJS Base64编码和解码 metro
    Javascript Base64编码和解码
  • 原文地址:https://www.cnblogs.com/happyday56/p/1026020.html
Copyright © 2011-2022 走看看