一、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; }
- 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 Settings\Administrator\桌面\MouseWithoutBorders\2.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("完成"); }
- 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{ ////// Interaction logic for Window1.xaml /// 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) { } }}
二、WORD/EXCEL 转PDF 转 第一页内容 转 图片
- WORD/EXCEL 转 PDF (Office2010)
////// 把Word文件转换成为PDF格式文件 /// /// 源文件路径 /// 目标文件路径 ///true=转换成功 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; }
- 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); }
三、第三方组件
其他参考: