win8 应用中使用pdf

在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)
{

//保存逻辑
}

//读取逻辑

 

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

 

 

转载于:https://www.cnblogs.com/liumianweifeng/p/3298243.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值