在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)
{
//保存逻辑
}
//读取逻辑
简单的 堆了些代码 不具有什么 教学意义 对有这个功能需求的 希望有点帮助 希望对学习的也有帮助 如有问题 请留言