zoukankan      html  css  js  c++  java
  • PDF/WORD/EXCEL 图片预览

    一、PDF/WORD/EXCEL 转 XPS 转 第一页内容 转 图片

    • WORD、EXCEL转XPS (Office2010)
     public bool WordToXPS(string sourcePath, string targetPath)
            {
                bool result = false;
                Microsoft.Office.Interop.Word.WdExportFormat exportFormat = Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatXPS;
                Microsoft.Office.Interop.Word.ApplicationClass application = null;
    
                Microsoft.Office.Interop.Word.Document document = null;
                try
                {
                    application = new Microsoft.Office.Interop.Word.ApplicationClass();
                    application.Visible = false;
                    document = application.Documents.Open(sourcePath);
                    document.SaveAs2();
                    document.ExportAsFixedFormat(targetPath, exportFormat);
                    result = true;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    result = false;
                }
                finally
                {
                    if (document != null)
                    {
                        document.Close();
                        document = null;
                    }
                    if (application != null)
                    {
                        application.Quit();
                        application = null;
                    }
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }
                return result;
            }
    View Code
    • PDF转XPS (将机器上默认打印机设置为Microsoft XPS Document Writer)
            //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;
    
            private void button3_Click(object sender, EventArgs e)
            {
                string pdf_filepath = @"d:原文件.pdf"; // 需要转换的PDF文件
                string xps_filepath = @"d:目标文件.xps"; // 目标XPS文件
    
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                //不现实调用程序窗口,但是对于某些应用无效
                p.StartInfo.CreateNoWindow = true;
                p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    
                //采用操作系统自动识别的模式
                p.StartInfo.UseShellExecute = true;
    
                //要打印的文件路径,可以是WORD,EXCEL,PDF,TXT等等
                p.StartInfo.FileName = pdf_filepath;
                //p.StartInfo.FileName = @"C:Documents and SettingsAdministrator桌面MouseWithoutBorders2.bmp";
    
                //指定执行的动作,是打印,即print,打开是 open
                p.StartInfo.Verb = "print";
    
                //开始
                p.Start();
    
                System.Threading.Thread.Sleep(5 * 1000);
    
                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("完成");
            }
    View Code
    • XPS转图片
    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.Windows.Xps.Packaging;
    using Microsoft.Win32;
    using System.Drawing.Imaging;
    using System.Drawing;
    using System.IO;
    
    namespace Xps_Reader
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            BitmapEncoder bitmapEncoder = null;
            MemoryStream memoryStream = new MemoryStream();
            public Window1()
            {
                InitializeComponent();
                
                AddCMD(ApplicationCommands.Open, MenuItem_Checked);
                AddCMD(ApplicationCommands.Close, exitMenu_Checked);
                AddCMD(ApplicationCommands.Save, saveMenu_Checked);
            }
            private XpsDocument xpsDocument;
    
            //绑定菜单命令
            private void AddCMD(ICommand cmd,ExecutedRoutedEventHandler e) {
    
                var cb = new CommandBinding(cmd);
                cb.Executed += new ExecutedRoutedEventHandler(e);
                CommandBindings.Add(cb);
            }
    
            public MemoryStream OutputStream
            {
                get;
                private set;
            }
           //打开xps文件
            private void MenuItem_Checked(object sender, ExecutedRoutedEventArgs e)
            {
    
               
                OpenFileDialog dlg = new OpenFileDialog();
                dlg.Filter = "xps|*.xps";
                //dlg.Filter = "jpg|*.jpg";
                if (dlg.ShowDialog() == true) {
                    try
                    {
                       if (xpsDocument != null)
                    
                        xpsDocument.Close();
    
                       xpsDocument = new XpsDocument(dlg.FileName, System.IO.FileAccess.Read);
                       FixedDocumentSequence documentPageSequence = xpsDocument.GetFixedDocumentSequence();
                       documentPageView1.Document = documentPageSequence;
                       bitmapEncoder = new JpegBitmapEncoder();
                       //for (int i = 0; i < documentPageSequence.DocumentPaginator.PageCount;i++ )
                       //{
                       //    DocumentPage documentPage = documentPageSequence.DocumentPaginator.GetPage(i);
                       //    RenderTargetBitmap targetBitmap = new RenderTargetBitmap((int)documentPage.Size.Width, (int)documentPage.Size.Height, 96.0, 96.0, PixelFormats.Pbgra32);
                       //    targetBitmap.Render(documentPage.Visual);
                       //    bitmapEncoder.Frames.Add(BitmapFrame.Create(targetBitmap));
                       //}
                       ////bitmapEncoder.Save(memoryStream);
    
                       DocumentPage documentPage = documentPageSequence.DocumentPaginator.GetPage(0);
                       RenderTargetBitmap targetBitmap = new RenderTargetBitmap((int)documentPage.Size.Width, (int)documentPage.Size.Height, 96.0, 96.0, PixelFormats.Pbgra32);
                       targetBitmap.Render(documentPage.Visual);
                       bitmapEncoder.Frames.Add(BitmapFrame.Create(targetBitmap));
    
                       xpsDocument.Close();
                    }
                    catch(Exception ex)
                    {
                        throw (ex);
                    }
                    
                    
                }            
            }
    
    
            private void exitMenu_Checked(object sender, ExecutedRoutedEventArgs e)
            {
                this.Close();
            }
            private void saveMenu_Checked(object sender, ExecutedRoutedEventArgs e)
            {
                //创建一个保存对话框对象
                SaveFileDialog sfd = new SaveFileDialog();
                //XpsImage image = new XpsImage();
               
                string a;
    
                //设置对话框的各项属性
                sfd.Title = "转化为";
                sfd.OverwritePrompt = true;
                sfd.CheckPathExists = true;
                sfd.Filter = "gif|*.gif";
    
                if (sfd.ShowDialog() == true)
                {
                    string strFileName = sfd.FileName;
                    bitmapEncoder.Save(memoryStream);
    
                    Bitmap bitMap = new Bitmap(memoryStream);
                    bitMap.Save(strFileName);
    
                    //this.OutputStream = memoryStream;
                    //bitmap.Save(strFileName, ImageFormat.Jpeg);
                    //this.Text = "Image Converter: " + strFileName;
    
                    
                }
            }
    
            private void MenuItem_Click(object sender, RoutedEventArgs e)
            {
    
            }
        }
    }
    View Code

    二、WORD/EXCEL 转PDF 转 第一页内容 转 图片

    •  WORD/EXCEL 转 PDF (Office2010)
            /// <summary>
            /// 把Word文件转换成为PDF格式文件
            /// </summary>
            /// <param name="sourcePath">源文件路径</param>
            /// <param name="targetPath">目标文件路径</param> 
            /// <returns>true=转换成功</returns>
            public bool WordToPDF(string sourcePath, string targetPath)
            {
                bool result = false;
                Microsoft.Office.Interop.Word.WdExportFormat exportFormat = Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatXPS;
                Microsoft.Office.Interop.Word.ApplicationClass application = null;
    
                Microsoft.Office.Interop.Word.Document document = null;
                try
                {
                    application = new Microsoft.Office.Interop.Word.ApplicationClass();
                    application.Visible = false;
                    document = application.Documents.Open(sourcePath);
                    document.SaveAs2();
                    document.ExportAsFixedFormat(targetPath, exportFormat);
                    result = true;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    result = false;
                }
                finally
                {
                    if (document != null)
                    {
                        document.Close();
                        document = null;
                    }
                    if (application != null)
                    {
                        application.Quit();
                        application = null;
                    }
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }
                return result;
            }
    View Code
    • PDF 转 图片 (Adobe Acrobat 9 Pro)
    public static void ConvertPdf2Image(string pdfFilePath, string imageDirectoryPath,
                int beginPageNum, int endPageNum, ImageFormat format, double zoom = 1)
            {
                Acrobat.CAcroPDDoc pdfDoc = null;
                Acrobat.CAcroPDPage pdfPage = null;
                Acrobat.CAcroRect pdfRect = null;
                Acrobat.CAcroPoint pdfPoint = null;
    
                //生成操作Pdf文件的Com对象
    
                pdfDoc = (Acrobat.CAcroPDDoc)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.PDDoc", "");
    
                //检查输入参数
                if (!pdfDoc.Open(pdfFilePath))
                {
                    throw new FileNotFoundException(string.Format("源文件{0}不存在!", pdfFilePath));
                }
    
                if (!Directory.Exists(imageDirectoryPath))
                {
                    Directory.CreateDirectory(imageDirectoryPath);
                }
    
                if (beginPageNum <= 0)
                {
                    beginPageNum = 1;
                }
    
                if (endPageNum > pdfDoc.GetNumPages() || endPageNum <= 0)
                {
                    endPageNum = pdfDoc.GetNumPages();
                }
    
                if (beginPageNum > endPageNum)
                {
                    throw new ArgumentException("参数"beginPageNum"必须小于"endPageNum"!");
                }
    
                if (format == null)
                {
                    format = ImageFormat.Png;
                }
    
                if (zoom <= 0)
                {
                    zoom = 1;
                }
    
                //转换
                for (int i = beginPageNum; i <= endPageNum; i++)
                {
                    //取出当前页
                    pdfPage = (Acrobat.CAcroPDPage)pdfDoc.AcquirePage(i - 1);
                    //得到当前页的大小
                    pdfPoint = (Acrobat.CAcroPoint)pdfPage.GetSize();
                    //生成一个页的裁剪区矩形对象
                    pdfRect = (Acrobat.CAcroRect)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.Rect", "");
    
                    //计算当前页经缩放后的实际宽度和高度,zoom==1时,保持原比例大小
                    int imgWidth = (int)((double)pdfPoint.x * zoom);
                    int imgHeight = (int)((double)pdfPoint.y * zoom);
    
                    //设置裁剪矩形的大小为当前页的大小
                    pdfRect.Left = 0;
                    pdfRect.right = (short)imgWidth;
                    pdfRect.Top = 0;
                    pdfRect.bottom = (short)imgHeight;
    
                    //将当前页的裁剪区的内容编成图片后复制到剪贴板中
                    pdfPage.CopyToClipboard(pdfRect, 0, 0, (short)(100 * zoom));
    
                    IDataObject clipboardData = Clipboard.GetDataObject();
    
                    //检查剪贴板中的对象是否是图片,如果是图片则将其保存为指定格式的图片文件
                    if (clipboardData.GetDataPresent(DataFormats.Bitmap))
                    {
                        Bitmap pdfBitmap = (Bitmap)clipboardData.GetData(DataFormats.Bitmap);
    
                        pdfBitmap.Save(
                            Path.Combine(imageDirectoryPath, i.ToString("0000") + "." + format.ToString()), format);
    
                        pdfBitmap.Dispose();
                    }
                }
    
                //关闭和释放相关COM对象
                pdfDoc.Close();
                Marshal.ReleaseComObject(pdfRect);
                Marshal.ReleaseComObject(pdfPoint);
                Marshal.ReleaseComObject(pdfPage);
                Marshal.ReleaseComObject(pdfDoc);
    
    
            }
    View Code

    三、第三方组件

    其他参考:

    C#实现MS-Office文档转Pdf(Word、Execel、PowerPoint、Visio、Project)

    用C#实现Word,PPT,EXECL 图片输出

  • 相关阅读:
    SpinLock 实现
    支持正则或通配符的hashmap
    HTTP报文
    Protostuff序列化
    【转】轻量级分布式 RPC 框架
    Servlet 3特性:异步Servlet
    Web服务器的工作原理
    《恰如其分的软件架构:风险驱动的设计方法》——读书笔记
    Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
    Java Socket常见异常处理 和 网络编程需要注意的问题
  • 原文地址:https://www.cnblogs.com/i-blog/p/4260754.html
Copyright © 2011-2022 走看看