zoukankan      html  css  js  c++  java
  • 【Win10 开发】读取PDF文档

    关于用来读取PDF文档的内容的API,其实在Win8.1的时候就有,不过没关系,既咱们讨论的是10的UAP,连同8.1的内容也包括进去,所以老周无数次强调:把以前的内容学好了,就可以在不学习任何新知识的前提直接进入10的开发,至于你信不信,反正我信了。

    好,P话不扯了,今天刚升级了Build 10061,VS创建UAP并运行是没什么问题的,不过XAML设计器貌似不太听话,比较淘气;还有个别API有问题,虽然异常报的是CLR损坏,但我们知道RT其实是基于COM的形式注册的,实际上是Win32的数据封送过程出现错误造成的,更精细一点说,就是指针读了不该读的内存地址造成的。这种事件在COM中也常见,毕竟现在是预览阶段,任何灵异事件都是正常的,我已经向官方团队Feed back了。

    今天老周给大家说说如何读取PDF文档内容吧,有些时候,这些API是用得上的,尽管不是开发专业的阅读器,开发专业阅读器就没那么轻松。本文只讲述如何读。

    支持读取PDF文档的类型都扔在Windows.Data.Pdf命名空间下,你就在这里面拼命找就行了。

    加载PDF文档操作起来也不算复杂。

    1、PdfDocument类表示一个PDF文档对象,可以调用静态的LoadFromFileAsync方法从文件中加载,也可以调用静态的LoadFromStreamAsync方法从流加载。从PDF文件加载的情况比较多。

    2、得到PdfDocument实例后,你可以查阅一下PageCount属性,看看这个文档有多少页。如果页数不多,可以考虑一次性加载,如果文档有30万页的话,建议换一台世界上最贵的电脑来加载。

    3、通过GetPage方法获取一个页面的内容,方法参数当然是页码了,这个页码从0开始,最后一页就是count - 1。

    4、得到PdfPage实例后,因为页面内容刚被取出,有些紧张,全身发抖,所以先调用一下PreparePageAsync方法,让页面做一下深呼吸,调整一下心态。但经测试,不调用这个方法也没有发生异常,页面也能正确加载。

    5、深呼吸做完后,就要开始表演了。调用RenderToStreamAsync方法让页面表演节目,并且全程录像,最后以图片格式保存到流中。这个流可以是内存流,也可以是文件流。如果是文件流的话,相当于把PDF的每一页都导出为一张图片。

    6、可以用Image类在界面上显示PDF页面了。

    理论永远都是无聊的,咱们还是实干吧。为了解除大家的工作疲劳状态,我这个示例用来演示的PDF是关于美女的,我知道大家看到美女就会兴奋的。

    看看代码:

                StorageFile pdfFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///0.pdf"));
                PdfDocument pdf = await PdfDocument.LoadFromFileAsync(pdfFile);
    
                // 获取PDF文档的总页数
                uint pageCount = pdf.PageCount;
    
                List<BitmapImage> pageimages = new List<BitmapImage>();
                // 获取页面列表
                for(uint p = 0; p < pageCount; p++)
                {
                    PdfPage page = pdf.GetPage(p);
                    await page.PreparePageAsync();
                    // 将页面内容保存为图像
                    InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream();
                    await page.RenderToStreamAsync(ms);
                    BitmapImage bmp = new BitmapImage();
                    // 设置图像宽度
                    bmp.DecodePixelWidth = 2000;
                    bmp.SetSource(ms);
                    // 释放资源
                    ms.Dispose();
                    page.Dispose();
                    pageimages.Add(bmp);
                }
                flpv.ItemsSource = pageimages;

    我这个PDF文件直接放到项目目录中,为了方便。StorageFile.GetFileFromApplicationUriAsync调用后,就可以得到该PDF文件的引用,然后就用PdfDocument类来加载。

    加载后得到文档的总页数,然后一个循环把所有页面都读出来,并生成图像。因为这个PDF页数不多,反正在小霸王学习机上面运行是没问题的。

    用来显示页面列表的是一个FlipView控件,界面XAML代码参考如下:

            <Grid Margin="20">
                <Grid.RowDefinitions>
                    <RowDefinition Height="auto"/>
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Button Content="加载PDF" Margin="15,8" Click="OnClick"/>
                
                <FlipView Grid.Row="1" Name="flpv">
                    <FlipView.ItemTemplate>
                        <DataTemplate>
                            <ScrollViewer ZoomMode="Enabled" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                                <Image Source="{Binding}"/>
                            </ScrollViewer>
                        </DataTemplate>
                    </FlipView.ItemTemplate>
                </FlipView>
            </Grid>

    <ScrollViewer ZoomMode="Enabled"……是为了让ScrollViewer支持缩放。用鼠标的话就是按住Ctrl键,然后滚动滑轮;用触控的话就不用我介绍了。

    好,运行一下,看看结果。

    就这样吧,要开饭了。

    源码下载:http://files.cnblogs.com/files/tcjiaan/ReadPDFApp.zip

  • 相关阅读:
    P5136 sequence(矩阵快速幂)
    P5135 painting(组合数)
    CF888E Maximum Subsequence(meet in the middle)
    P4463 [国家集训队] calc(拉格朗日插值)
    CF364D Ghd(随机化)
    P3270 [JLOI2016]成绩比较(拉格朗日插值)
    bzoj3453: tyvj 1858 XLkxc(拉格朗日插值)
    P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)
    tomcat8版本实现虚拟主机
    NFS网络文件系统方案
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/4456355.html
Copyright © 2011-2022 走看看