我安装了Adobe Acrobat 7.0 Professional,同时在打印机和传真中就会默认安装一个名为Adobe PDF的虚拟打印机,这个东西很方便,可以把我需要的文档打印到这个打印机上生成PDF
最近突发奇想是不是可以用程序操作这个打印机,有没有提供DLL可以调用呢我使用过以下方法,先设置Adobe PDF为默认打印机
                Process p = new Process();
                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.UseShellExecute = true;
                startInfo.Verb = "Print";
                startInfo.CreateNoWindow = true;
                startInfo.WindowStyle = ProcessWindowStyle.Hidden;
                startInfo.FileName = fileName;
                p.StartInfo = startInfo;
                p.Start();
但会不可避免地弹出对话框来不知道有没有高手搞过,教教我,谢谢

解决方案 »

  1.   

    在CSDN上看到一个C的帖子
    谁比较熟,能翻译下转成C#么
    以下是代码:
    如果装的是Acrobat 7.0及以上版本,可以用下面的方法
    C/C++ code
    BOOL Doc2PDF(LPCTSTR lpszSrcDoc, LPCTSTR lpszDstPDF)
    {
        HRESULT hr;
        CLSID clsid;
        IUnknown* pUnk = NULL;
        IDispatch *pDispApp = NULL;
        if (!PathFileExists(lpszSrcDoc))
            return FALSE;
        CLSIDFromProgID(L"PDFMakerAPI.PDFMakerApp", &clsid);
        hr = ::GetActiveObject(clsid,NULL,&pUnk);
        if (FAILED(hr)) // 
            hr = ::CoCreateInstance( clsid, NULL, CLSCTX_SERVER,
            IID_IUnknown, (void**) &pUnk);
        if (SUCCEEDED(hr))
        {
            hr = pUnk->QueryInterface(IID_IDispatch, (void**)&pDispApp);
            if (FAILED(hr))
            {
                pUnk->Release();
                return FALSE;
            }
            COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR);
            COleVariant covFalse((short)FALSE);
            COleVariant vTrue((short)TRUE);
            CPDFMakerApp maker;
            maker.AttachDispatch(pDispApp,FALSE);
            /*SAFEARRAY *ar[2];
            ar[0] = SafeArrayCreateVector(VT_BSTR,0,1);
            ar[1] = SafeArrayCreateVector(VT_BSTR,0,1);
            _bstr_t a(lpszSrcDoc);
            _bstr_t b(lpszDstPDF);
            LONG rgIndices = 0;
            SafeArrayPutElement(ar[0],&rgIndices,(BSTR)a);
            rgIndices = 0;
            SafeArrayPutElement(ar[1],&rgIndices,(BSTR)b);*/
            long ret = 1;
            do {
                ret = maker.CreatePDF(lpszSrcDoc,lpszDstPDF,
                vOpt,covFalse,vTrue,covFalse,vOpt);
                Sleep(100);
            } while(ret != 0);
            
            //ret = maker.CreatePDFFromMultipleFiles(ar);
            //SafeArrayDestroy(ar[0]);
            //SafeArrayDestroy(ar[1]);
            pDispApp->Release();
            pUnk->Release();
            return ret;
        }
        return FALSE;
    }
      

  2.   

    不用这么烦吧,打印时直接选择PDF的虚拟打印机打印不就可以了~
      

  3.   

    会弹出对话框啊
    我的目的是静悄悄地生成PDF
      

  4.   

    自己搞定了
    参考资料
    最近一个项目要求将doc文档转换成pdf文档,找了下网上的资料都是通过将doc转换成html,再转化成pdf,感觉生成的pdf效果不是太好,最后发现可以用adobe有一个pdfmaker for office插件能再word中将doc文件转换成pdf,于是就想调用这个插件来转换pdf,在adobe的官方网站上,发现很多人在问关于pdfmaker的问题,他们大多的是先调用安装在word中的“adobe pdf”这个虚拟打印机来将doc文档打印成POSTSCRIPT文档,在调用Interop.ACRODISTXLib中的FILETOPDF方法来实现doc转pdf,但中间很多人都被卡在如何在代码中设置“adobe pdf”这个虚拟打印机属性上上面,因为要转换成ps文件,必须将一个叫“不要发送字体到adobe pdf”的默认选中属性取消,才能正常打印,我也在这个找了很多资料才解决这个问题,今天我不给大家介绍这种方法,因为我找到了更好的方法,在安装了pdfmaker后,系统不但注册了pdfmaker for office和Interop.ACRODISTXLib类库外,还有个Interop.PDFMAKERAPILib类库,我们可以直接调用Interop.PDFMAKERAPILib类库中的方法轻松实现doc转pdf,而且还可以将pdfmakerApp的句柄传到PDFMAKERAPILib中的pdfmaker中进行更详细的属性设置,代码如下
    using PDF=PDFMAKERAPILib;
    private void button1_Click(object sender, System.EventArgs e)
      {
       object missing = System.Type.Missing;
       try
       {
        PDF.PDFMakerApp app = new PDF.PDFMakerApp();
        app.CreatePDF(@"c:\123.doc",@"c:\123.pdf",PDF.PDFMakerSettings.kConvertAllPages,false,true,true,missing);
       }
       catch(Exception er)
       {
        MessageBox.Show(er.ToString());
       }
      }本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chenyu4848/archive/2008/04/20/2309236.aspx
      

  5.   

    应用一个adobe的一个第三方控件AcroPDF.dll