WPF中查看PDF文件之MoonPdfLib类库

两种PDF文件查看器,MoonPdfLib或者AdobeReader。

一、在网上扒到的很好的WPF中用MoonPdf类库来展示PDF文件。

Sourceforge上下载到MoonPdf编译好的Dll。

https://github.com/reliak/moonpdf这是源码地址

使用非常简单,废话不多说,上码上步骤。

1、程中添加对MoonPdfLib.dll的引用。注意:将libmupdf.dll放置于WPF工程Bin文件下。

2、XMAL源码:

复制代码
<Grid>
<Border Background="#f0f0f0">
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
<Button Content="上传" Width="95" Click="FileButton_Click" Margin="5,5,5,375"/>
<Button Content="放大" Width="105" Click="ZoomInButton_Click" Margin="0,5,0,375"/>
<Button Content="缩小" Width="95" Click="ZoomOutButton_Click" Margin="5,5,5,375"/>
<Button Content="100%" Width="95" Click="NormalButton_Click" Margin="0,5,0,375"/>
<Button Content="整页" Width="100" Click="FitToHeightButton_Click" Margin="5,5,5,375"/>
<Button Content="单页" Width="90" Click="SinglePageButton_Click" Margin="0,5,0,375"/>
<Button Content="双页" Width="90" Click="FacingButton_Click" Margin="5,5,5,375"/>
</StackPanel>
</Border>
<Grid HorizontalAlignment="Left" Height="340" Margin="10,70,0,0" VerticalAlignment="Top" Width="155">
<TreeView x:Name="treeView" SelectedItemChanged="treeView_SelectedItemChanged">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Childern}">
<TextBlock Name="text1">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}">
<Binding x:Name="name1" Path="Name" />
<Binding x:Name="name2" Path="FilePath" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
<Border Background="#d3d3d3" Margin="170,70,0,0">
<mpp:MoonPdfPanel x:Name="moonPdfPanel" Background="LightGray" ViewType="SinglePage" PageRowDisplay="ContinuousPageRows" PageMargin="0,2,4,2" AllowDrop="True"/>
</Border>
</Grid>

3、C#代码:

复制代码
private bool _isLoaded = false;
        public MainWindow()
        {
            InitializeComponent();

            //数据库要存放的路径
            string filePath = "\\File\\ExceptionHandlingVSTO.pdf";
            //获取文件名字
            string fileName = Path.GetFileName(filePath);

            TreeModel loc = new TreeModel()
            {
                Name = "施工前",
                Childern = new List<TreeModel>()
                {
                    new TreeModel()
                    {
                        Name = fileName,
                        FilePath = filePath
                    },
                    new TreeModel()
                    {
                        Name ="测试节点可以无视",
                        FilePath = filePath
                    }
                }
            };
            List<TreeModel> list = new List<TreeModel>() { loc };
            treeView.ItemsSource = list;
            
        }
        private void FileButton_Click(object sender, RoutedEventArgs e)
        {
            form.OpenFileDialog dialog = new form.OpenFileDialog();
            dialog.Multiselect = true;
            if (dialog.ShowDialog() == form.DialogResult.OK)
            {
                string[] filesPath = dialog.FileNames;

                if (filesPath != null && filesPath.Length > 0)
                {
                    foreach (var filePath in filesPath)
                    {
                        Upload(filePath);
                    }
                }
            }
        }
        /// <summary>
        /// 文件上传
        /// </summary>
        /// <param name="filePath">文件原来的路径</param>
        public void Upload(string filePath)
        {
            try
            {
                FileInfo info = new FileInfo(filePath);

                string directory = Directory.GetCurrentDirectory();
                string uploadFile = $"{directory}\\File";
                //文件要上传的路径
                string uploadPath = $"{uploadFile}\\{info.Name}";

                WebClient wc = new WebClient();
                //wc.Credentials = new NetworkCredential("xuyue", "111111");
                FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                BinaryReader br = new BinaryReader(fs);
                byte[] result = br.ReadBytes(Convert.ToInt32(fs.Length));
                Stream s = wc.OpenWrite(new Uri(uploadPath), "PUT");

                if (s.CanWrite)
                {
                    s.Write(result, 0, result.Length);
                }
                s.Flush();
                s.Close();
                fs.Close();




            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        private void ZoomInButton_Click(object sender, RoutedEventArgs e)
        {
            if (_isLoaded)
            {
                moonPdfPanel.ZoomIn();
            }
        }

        private void ZoomOutButton_Click(object sender, RoutedEventArgs e)
        {
            if (_isLoaded)
            {
                moonPdfPanel.ZoomOut();
            }
        }

        private void NormalButton_Click(object sender, RoutedEventArgs e)
        {
            if (_isLoaded)
            {
                moonPdfPanel.Zoom(1.0);
            }
        }

        private void FitToHeightButton_Click(object sender, RoutedEventArgs e)
        {
            moonPdfPanel.ZoomToHeight();
        }

        private void FacingButton_Click(object sender, RoutedEventArgs e)
        {
            moonPdfPanel.ViewType = MoonPdfLib.ViewType.Facing;
        }

        private void SinglePageButton_Click(object sender, RoutedEventArgs e)
        {
            moonPdfPanel.ViewType = MoonPdfLib.ViewType.SinglePage;
        }

        private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            //数据库要存放的路径
            string fileName = "\\File\\ExceptionHandlingVSTO.pdf";
            string filePath = $"{Directory.GetCurrentDirectory()}{fileName}";

            try
            {
                moonPdfPanel.OpenFile(filePath);
                _isLoaded = true;
            }
            catch (Exception ex)
            {
                _isLoaded = false;
            }
        }
    }
相关推荐
何包蛋H5 小时前
分享vue好用的pdf 工具实测
javascript·vue.js·pdf
Bruce_Liuxiaowei8 小时前
基于Python的PDF转PNG可视化工具开发
开发语言·python·pdf
翻滚吧键盘14 小时前
jupyter无法转换为PDF,HTMLnbconvert failed: Pandoc wasn‘t found.
ide·jupyter·pdf
returnShitBoy21 小时前
前端面试:如何实现预览 PDF 文件?
前端·pdf
AIBigModel1 天前
什么是后训练?大语言模型训练后优化方法综述,87页pdf
人工智能·语言模型·pdf
开开心心就好1 天前
便捷开启 PDF 功能之旅,绿色软件随心用
android·java·windows·智能手机·eclipse·pdf·软件工程
拓端研究室1 天前
2025探索短剧行业新可能报告40+份汇总解读|附PDF下载
pdf
#摩斯先生1 天前
iOS QLPreviewController预览PDF文件等(Swift)
开发语言·ios·pdf·xcode·swift
典龙3302 天前
python语言写的一款pdf转word、word转pdf的免费工具
pdf·word