在win8.1中系统提供了 相应的pdf查看api  在win8中就杯具了.  系统未提供和datepicker一样...

 

所以去网上 找了下  发现MuPDF.WinRT 可以使用  https://github.com/MishaUliutin/MuPDF.WinRT  一个c++ 的库  

根据情景 可以分为两类:

1.打开本地pdf  这样比较简单 直接调用就ok

private async void OpenPdfFile(string path)

{

var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(path);

//var file = await KnownFolders.DocumentsLibrary.GetFileAsync(path);
using (var stream = await file.OpenReadAsync())
{
 IBuffer readBuffer;
 using (IInputStream inputStreamAt = stream.GetInputStreamAt(0))
 using (var dataReader = new DataReader(inputStreamAt))
 {
 uint bufferSize = await dataReader.LoadAsync((uint)stream.Size);
 readBuffer = dataReader.ReadBuffer(bufferSize);
 }

 pdfDocument = Document.Create(readBuffer, DocumentType.PDF, (int)Windows.Graphics.Display.DisplayProperties.LogicalDpi);
}

if (pdfDocument.PageCount == 0)
 return;

//根据业务定义

}

 

2.从网络上获取到pdf 保存到本地后 在读取

在win8中可以使用 BackgroundDownloader 在后台进行下载  如果使用保存到 功能 文档库 需要在配置Application 中加入节点

<Extensions>
<Extension Category="windows.fileTypeAssociation">
<FileTypeAssociation Name="data">
<EditFlags AlwaysUnsafe="true" />
<SupportedFileTypes>
<FileType>.pdf</FileType> //your file type
</SupportedFileTypes>
</FileTypeAssociation>
</Extension>
</Extensions>

StorageFile destinationFile = await KnownFolders.DocumentsLibrary.CreateFileAsync(
destination, CreationCollisionOption.GenerateUniqueName);

BackgroundDownloader downloader = new BackgroundDownloader();
//创建下载
DownloadOperation download = downloader.CreateDownload(source, destinationFile);

Progress<DownloadOperation> progressCallback = new Progress<DownloadOperation>(DownloadProgress);

cts = new CancellationTokenSource();
download.StartAsync().AsTask(cts.Token, progressCallback);

 

在callback中可以处理 文件 可以使用OpenPdfFile  根据保存位置 ,本例中使用为保存到文档库中 使用KnownFolders.DocumentsLibrary.GetFileAsync 打开

 

这个基本的存取就完成了 

 

但是有问题 如果文件已存在 就不必要去下载了 在使用

StorageFile destinationFile = await KnownFolders.DocumentsLibrary.GetFileAsync(
destination);  

会抛出异常   根据这样 

try
{
StorageFile destinationFile1 = await KnownFolders.DocumentsLibrary.GetFileAsync(
destination);

OpenPdfFile(destination);
return;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}

//保存逻辑

这样可以实现缓存打开

 

这样显得有些过于暴力  

 

所以试试 正常的

 

var folder = await KnownFolders.DocumentsLibrary.GetFolderAsync(Folder);
var files = await folder.GetFilesAsync(CommonFileQuery.OrderByName);
var file = files.FirstOrDefault(x => x.Name == FileName);
if (file != null)
{

//保存逻辑
}

//读取逻辑

 

 简单的 堆了些代码  不具有什么 教学意义  对有这个功能需求的 希望有点帮助  希望对学习的也有帮助 如有问题 请留言 

 

 

posted on 2013-09-03 10:39  纵横九洲  阅读(300)  评论(0编辑  收藏  举报