c# 调用Microsoft XPS Document Writer打印机,将Pdf文件转换成Xps文件「建议收藏」

c# 调用Microsoft XPS Document Writer打印机,将Pdf文件转换成Xps文件「建议收藏」最近碰到个项目,其中有个需要将pdf文件转换成xps文件的功能,xps文件还算是新东西,所以基本没啥了解,通过一段时间的调查,本人算是找到了2个方法:  1)通过PDFNet第三发开发组件即可很容易的完成转换功能,并且还有其他针对pdf文件操作的功能,还是很强大的。当然啦,这个东     西是要买的,可以先下一个试用版先体验体验。    下载地址:http://w

大家好,又见面了,我是你们的朋友全栈君。

最近碰到个项目,其中有个需要将pdf文件转换成xps文件的功能,xps文件还算是新东西,所以基本没啥了解,通过一段时间的调查,

本人算是找到了2个方法:

  1)通过PDFNet第三发开发组件即可很容易的完成转换功能,并且还有其他针对pdf文件操作的功能,还是很强大的。当然啦,这个东

      西是要买的,可以先下一个试用版先体验体验。

    下载地址:http://www.pdftron.com/pdfnet/index.html

  2)通过“Microsoft XPS Document Writer”打印机,将pdf打印成本地的xps文件,以此来完成转换功能。

      这个打印机的驱动在WIN7的系统上装Office2007的时候会自动装上,如果是XP系统的话,可能没有,可以去微软官网下载个

     “SaveAsPDFandXPS.exe”,装上后,就会有这个打印机。

    打印机也有了,那么接下来的问题就是怎么调用这个打印机了,淡然了,可以通过一系列的API的配合去调用这个打印机,但我觉得

      Windows的打印机调用起来实在是太麻烦了,通过一番调查,可以直接使用Adobe acro Reader或Foxit Reader这两个软件的打

    印功能,将文件打出,下面的列出了代码供参考。

   开发环境:VS2010,.Net FrameWork4.0,C#,WPF

窗体代码:

<Window x:Class="TestPdfToXps1.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        Title="MainWindow" Height="350" Width="525">    <Grid>        <Button Click="Button_Click">PDF TO XPS</Button>    </Grid></Window>

窗体的后台关键代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.ComponentModel;
using System.Runtime.InteropServices;

namespace TestPdfToXps1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        //Win32 Api定义
         [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfeter, string lpszClass, string lpszWindow);

        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, String lParam);

        [DllImport("user32.dll")]
        static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);


        //Win32消息定义
         const uint WM_SETTEXT = 0x000c;
        const uint WM_IME_KEYDOWN = 0x0290;
        const uint WM_LBUTTONDOWN = 0x0201;
        const uint WM_LBUTTONUP = 0x0202;


        public MainWindow()
        {
            InitializeComponent();
        }


        private void Button_Click(object sender, RoutedEventArgs e)
        {
            PrintWithFoxitReader();
        }

        void PrintWithFoxitReader()
        {
           string pdf_filepath = @"d:\原文件.pdf"; // 需要转换的PDF文件
             string xps_filepath = @"d:\目标文件.xps"; // 目标XPS文件

           /***** 调用Foxit Reader.exe的打印功能,并且制定打印机为Microsoft XPS Document Writer *****/
           System.Diagnostics.ProcessStartInfo psInfo = new System.Diagnostics.ProcessStartInfo();
           psInfo.FileName = @"D:\Tools\Reader\Foxit Reader\Foxit Reader.exe"; //Foxit Reader.exe的全路径
           psInfo.Arguments = String.Format(@" -t {0} ""Microsoft XPS Document Writer""", pdf_filepath);
           psInfo.CreateNoWindow = true; 
           psInfo.UseShellExecute = false; 
           System.Diagnostics.Process ps = new System.Diagnostics.Process();
           ps.StartInfo = psInfo;
           ps.Start();


           // 等待
            System.Threading.Thread.Sleep(5 * 1000);


           /***** 启动Foxit Reader后,会弹出文件另存为对话框********************************/
           /***** 因此使用Win32Api找到文件另存为对话框中的文件名输入框,并且通过给输入******/
           /***** 框发消息在输入框中自动填入目标xps文件名,最后通过给保存按钮发消息来*******/
           /***** 最后通过给保存按钮发消息来按下对话框中的保存按钮**************************/
           // 找到文件另存为对话框的窗口句柄
            IntPtr hWnd = FindWindow("#32770", "文件另存为");    
          IntPtr hChild;
          // 由于输入框被多个控件嵌套,因此需要一级一级的往控件内找到输入框
            hChild = FindWindowEx(hWnd, IntPtr.Zero, "DUIViewWndClassName", String.Empty);
          hChild = FindWindowEx(hChild, IntPtr.Zero, "DirectUIHWND", String.Empty);
          hChild = FindWindowEx(hChild, IntPtr.Zero, "FloatNotifySink", String.Empty);
          hChild = FindWindowEx(hChild, IntPtr.Zero, "ComboBox", String.Empty);
          hChild = FindWindowEx(hChild, IntPtr.Zero, "Edit", String.Empty); // File name edit control
          // 向输入框发送消息,填充目标xps文件名
            SendMessage(hChild, WM_SETTEXT, IntPtr.Zero, xps_filepath);
          // 等待1秒钟
            System.Threading.Thread.Sleep(1000);
          // 找到对话框内的保存按钮
            hChild = IntPtr.Zero;
          hChild = FindWindowEx(hWnd, IntPtr.Zero, "Button", "保存(&S)");
          // 向保存按钮发送2个消息,以模拟click消息,借此来按下保存按钮
            PostMessage(hChild, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
          PostMessage(hChild, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);



          /***** 跟踪打印机队列中的文件打印状况,知道文件打印完成为止 *****/
          // 调用本地打印机队列
            System.Printing.LocalPrintServer prtSrv = new System.Printing.LocalPrintServer();
          System.Printing.PrintQueue queue = prtSrv.GetPrintQueue("Microsoft XPS Document Writer");


          //一直监视打印队列,知道打印队列中没有打印任务时结束
            do
          {
              // 等待处理  
                System.Threading.Thread.Sleep(1000);
              // 读取队列的最新信息
                queue.Refresh();
          } while (queue.NumberOfJobs > 0);


          MessageBox.Show("完成");
        }
    }
}


*注:如果是使用Adobe Read进行打印,可以参考下列的部分代码

使用Adcro Readr的相关代码:

//将前面的两行代码换成一下代码
psInfo.FileName = @"C:\Program Files\Adobe\Reader 8.0\Reader\AcroRd32.exe";
psInfo.Arguments = String.Format(@" /s /h /t {0} ""Microsoft XPS Document Writer""", pdf_filepath); 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136069.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • pycharm-package安装配置[通俗易懂]

    pycharm-package安装配置[通俗易懂]pycharm-package安装配置第一步:打开pycharm软件;第二步:选择菜单栏File→Settings;第三步:选择“Project:XXXXX”这一栏,然后选择“ProjectInterpreter”,点击右边的“+”号;第四步:选择底下的ManageRepositories;第五步:这里可以添加或更改任意下载源,由于默认下载源是国…

    2022年8月27日
  • LVS基本配置

    LVS基本配置LVS说明【Linux操作系统核心空间中、一般采用DR构建集群】小结:{Ipvsadm:管理集群服务的命令行工具、Ipvs:内核模块/代码;三种负载均衡模式:【NAT:修改IP、双网卡,RIP指向DIP内网网关、任意操作系统】、【DR直接路由:一个网卡、配置别名、DIP和RIP在同一网关上、修改MAC地址】、【TUP隧道:封装IP报文,异地服务连接】} LVS主要组成部分为:  负

    2022年7月23日
  • visifire 控件

    visifire 控件引言Silverlight对于图形图像处理方面,从1.0时代起就给予了很强大的支持,所以我们可以在Silverlight中实现非常棒的各种统计图表,然而现在有了一些开源的项目,使得这项工作更加的简单。本文我将介绍一个开源的项目visifire,使用它可以在Silverlight2中实现超酷的图表。简单图表首先我们需要下载Visifire项目Silverlight开发包,在建立完项…

    2022年7月21日
  • html制作一个简单的网页_用html做一个简单的网页

    html制作一个简单的网页_用html做一个简单的网页制作一个简单的HTML个人网页

    2022年10月13日
  • 孙鑫老师 java从入门到精通 视频教程 批量下载

    孙鑫老师 java从入门到精通 视频教程 批量下载本视频教程是孙鑫老师亲自开发录制的,内容涵盖了java技术从入门到精通整个过程。对于java爱好者是一套不可多得的教材!相信下载此教程的同志都是未来的电脑高手,对于批量下载的方法我在这时就不一一说了,相信兄弟们都能找到这种简单规律。这里以第三课批量下载为例简单说一下:(记得将通配符长度设为1哦)第一课Java的一些基本概念http://www.ibook8.com/te

    2022年5月17日
  • npm下载和使用(超详细)

    npm下载和使用(超详细)NPM(NodePackageManager)简称为Node包管理工具安装(首先我们需要安装Node)Mac如果没有安装Node可以使用mac的包管理神器HomeBrew进行安装,首先下载HomeBrew,接下来在终端执行以下命令brewinstallnode也可以选择去官网下载pkg安装包,记得下载长期稳定版,即LTS版windows可以在官网中选择windows相对应的版本,同样下载稳定版本,一步点击安装即可使用当下载好Node后我们就可以使用n..

    2022年10月28日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号