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;
            }
        }
    }
相关推荐
随便叫个啥呢2 小时前
java使用poi-tl模版+vform自定义表单生成word,使用LibreOffice导出为pdf,批量下载为压缩文件
java·pdf·word·zip
CodeCraft Studio2 小时前
国产化Word处理控件Spire.Doc教程:使用Java将RTF文件转换为PDF的全面教程
java·pdf·word·spire.doc·rtf转pdf·文件格式转换·文档开发sdk
CodeCraft Studio1 天前
国产化Excel处理控件Spire.XLS教程:使用Java将CSV转换为PDF(含格式设置)
java·pdf·excel·spire.xls·文档格式转换·csv转pdf
雾江流1 天前
WPS国际版18.22 | 集Word,PDF,Sheet,PowerPoint于一体的多功能免费办公套件
pdf·word·软件工程·wps
Jay_Franklin1 天前
Python中使用sqlite3模块和panel完成SQLite数据库中PDF的写入和读取
数据库·笔记·python·pycharm·sqlite·pdf·py
有蝉1 天前
vue-office——支持多种文件(docx、excel、pdf)预览的vue组件库,支持vue2/3。也支持非Vue框架的预览。
vue.js·pdf·excel
2501_920955572 天前
PDF文件损坏打不开怎么修复?2025年最新修复工具测评与对比
pdf
季春二九2 天前
PDF-XChange Editor丨加拿大PDF编辑转换工具
pdf
开开心心就好2 天前
微软官方出品:免费数据恢复工具推荐
网络·笔记·microsoft·pdf·word·音视频·symfony
Dontla2 天前
如何在PDF文档中打钩?(福昕阅读器)打√
pdf·福昕阅读器