【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 = ; 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 = ;
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
【Win10 开发】读取PDF文档的更多相关文章
- 【转】Python读取PDF文档,输出内容
Python3读取pdf文档,输出内容(txt) from urllib.request import urlopen from pdfminer.pdfinterp import PDFResour ...
- Python读取PDF文档
from pdfminer.converter import PDFPageAggregator from pdfminer.layout import LAParams from pdfminer. ...
- java读取pdf文档
import java.io.*;import org.pdfbox.pdmodel.PDDocument;import org.pdfbox.pdfparser.PDFParser;import o ...
- 常用PDF文档开发库
C++库: 1,PDF类库 PoDoFo http://podofo.sourceforge.net/ PoDoFo 是一个用来操作 PDF 文件格式的 C++ 类库.它还包含一些小工具用来解析 ...
- java操作office和pdf文件java读取word,excel和pdf文档内容
在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...
- 【PDF】java使用Itext生成pdf文档--详解
[API接口] 一.Itext简介 API地址:javadoc/index.html:如 D:/MyJAR/原JAR包/PDF/itext-5.5.3/itextpdf-5.5.3-javadoc/ ...
- pdf.js实现在HTML下直接浏览pdf文档,无需插件即可实现
近期,有一个朋友做B端,服务器存了大量的金融类数据,很多都是pdf文档,他现在的做法是,先将pdf文档转换成flash,再放到浏览器上给用户浏览,但是他告诉我,这种体验太差了,而且很好资源,空间已经快 ...
- Python处理Excel和PDF文档
一.使用Python操作Excel Python来操作Excel文档以及如何利用Python语言的函数和表达式操纵Excel文档中的数据. 虽然微软公司本身提供了一些函数,我们可以使用这些函数操作Ex ...
- 利用Python将PDF文档转为MP3音频
1. 转语音工具 微信读书有一个功能,可以将书里的文字转换为音频,而且声音优化的不错,比传统的机械朗读听起来舒服很多. 记得之前看到过Python有一个工具包,可以将文字转换为语音,支持英文和中文,而 ...
随机推荐
- 2016-1-30 Servlet中Session管理(Sesssion追踪)
Session管理(Sesssion追踪)是Web应用程序开发中非常重要的一个主题.这是因为HTTP是无状态的,在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的 ...
- android事件处理之基于监听
Android提供了了两种事件处理方式:基于回调和基于监听. 基于监听: 监听涉及事件源,事件,事件监听器.用注册监听器的方法将某个监听器注册到事件源上,就可以对发生在事件源上的时间进行监听. 最简单 ...
- JNI使用问题记录
此文章包含Android JNI学习过程中的遇到的各种错误记录和学习总结. 1.错误:java.lang.UnsatisfiedLinkError: Native method not found: ...
- 【SRM】518 Nim
题意 \(K(1 \le K \le 10^9)\)堆石子,每堆石子个数不超过\(L(2 \le 50000)\),问Nim游戏中先手必败局面的数量,答案对\(10^9+7\)取模. 分析 容易得到\ ...
- [RxJava^Android]项目经验分享 --- RxLifecycle功能实现分析(二)
接着上一篇文章的内容,这篇文章一边分析RxLifecycle的实现原理,一边学习RxJava操作符. 首先RxLifecycle在基础类里定义BehaviorSubject并绑定Activity或 ...
- Spring MVC篇二、使用JdbcTemplate进行数据库操作
上一篇只是一个简单的Spring MVC框架,接下来添加一些跟数据库的交互. 一.添加jdbc相关配置 在maven中添加相关依赖后,配置数据库访问参数及数据源.数据库参数使用配置文件,代码如下: ...
- 在update语句中使用子查询
在update 中的 where 子句中使用子查询: UPDATE mg_page_log as a SET page_num=1 WHERE id in( SELECT id from mg_ ...
- Hive_配置远程Metastore
注 : 待测试 一.准备两三台linux机器,最好是hadoop集群环境 机器A:10.0.0.2 机器B:10.0.0.3 机器C:10.0.0.4 二.个机器安装信息 机器A安装mysql(用于存 ...
- wamp2.5 局域网无法访问问题
1.打开http.conf文件,在对应处修改为如下内容(通常经过步骤一之后就能访问了,若不行则再执行后面步骤) <Directory /> Options FollowSymLinks A ...
- JQuery之$.ajaxPOST数据
function postSimpleData() { $.ajax({ type: "POST", url: "/Service/SimpleData", c ...