簡單的PDF檔案瀏覽程式

最近在熟悉WPF相關的環境以及操作方式,而日常作業中又常常會遇到需要使用PDF檔案的情況,PDF檔案一多時(尤其是都從email進來)說實在還真不是很好整理;所以想說是不是能夠做個小程式來瀏覽這些PDF檔案呢?於是就搞了這麼一個初版的小程式。

最近在熟悉WPF相關的環境以及操作方式,而日常作業中又常常會遇到需要使用PDF檔案的情況,PDF檔案一多時(尤其是都從email進來)說實在還真不是很好整理;所以想說是不是能夠做個小程式來瀏覽這些PDF檔案呢?於是就搞了這麼一個初版的小程式。

首先是參考的資料來源,Displaying a PDF file within a WPF application,裡面的說明相當的詳細,可以直接前往參考,下面所做的程式也是參考這篇而做的。這個做法是利用Adobe的ActiveX元件來做瀏覽的功能,所以在使用之前,目標電腦上至少必須要安裝Adobe Reader才能夠順利執行喔,這要特別注意一下。

接下來根據上面連結所提到的,在建立UserControler的時候在工具箱當中,要加入Adobe的原件,以方便我們將控制項拖拉到畫面上,這個部分可以在COM頁籤當中找到,像是下圖
簡單的做好UserControler之後,就要在主要的畫面(XAML檔案)加入這個UserControl了,而由於這是一個COM元件,所以必須要將他放在一個WindowsFormHost控制項當中,這可以在工具箱中找到

接下來在就是主畫面的部分,在功能的部分,我是想做到指定一個基本的資料夾,之後將該資料夾中所有的目錄列在第一層(利用Expender+StackPanel),目錄下面就列出所有PDF檔案,於是做了下面簡單的畫面
在Blend裡面UI的畫面看起來大概像下面這樣

好,接下來就來看看主要畫面的程式碼了

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.IO;

namespace PDFViewer
{
    /// 
    /// Interaction logic for MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {
        ucPDFViewer uc;
        string fileDir = @"C:\Order";

        public MainWindow()
        {
            InitializeComponent();
            uc = new ucPDFViewer();
            this.PdfHost.Child = uc;
            //uc.LoadFile(@"C:\Order\1.pdf");
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //load file
            RefreshList(fileDir, spFileList);
        }

        private void RefreshList(string strDirPath, StackPanel mainList)
        {
            DirectoryInfo dirinfo = new DirectoryInfo(strDirPath);
            Expander newEntry = new Expander();
            StackPanel newSP = new StackPanel();
            newSP.Margin = new Thickness(15, 0, 0, 0);
            newEntry.Header = strDirPath;
            foreach (var item in dirinfo.GetFileSystemInfos())
            {
                if ((item.Attributes & FileAttributes.Directory) != 0)
                {
                    //資料夾
                    RefreshList(item.FullName,spFileList);
                }
                else
                {
                    //檔案
                    if (item.Extension != ".pdf") continue;
                    Label newFilename = new Label();
                    newFilename.Content = item.Name;
                    
                    newFilename.MouseLeftButtonDown += new MouseButtonEventHandler(labtmp_MouseLeftButtonDown);
                    newSP.Children.Add(newFilename);
                }
            }
            newEntry.Content = newSP;
            mainList.Children.Add(newEntry);
        }
            
        private void labtmp_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Label lab = (Label)sender;
            StackPanel p = (StackPanel)lab.Parent;
            if (p != null)
            {
                Expander ep;
                ep = (Expander)p.Parent;
                uc.LoadFile(ep.Header.ToString() + @"\" + lab.Content.ToString());
            }
            
        }

        private void btnRefresh_Click(object sender, RoutedEventArgs e)
        {
            if (!Directory.Exists(txtBaseDir.Text))
                return;
            spFileList.Children.Clear();
            RefreshList(txtBaseDir.Text, spFileList);
        }

        private void btnSelectDir_Click(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.FolderBrowserDialog dlgOpen = 
                new System.Windows.Forms.FolderBrowserDialog();
            if (dlgOpen.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtBaseDir.Text = dlgOpen.SelectedPath;
                spFileList.Children.Clear();
                RefreshList(txtBaseDir.Text, spFileList);
            }
        }

        private void TextBlock_MouseEnter(object sender, MouseEventArgs e)
        {
            
        }
    }
}
於是乎,點擊左側列表的檔案名稱之後,就能在右邊看到PDF檔案內容了;以上給各位參考了。