zoukankan      html  css  js  c++  java
  • 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)
    {

    //保存逻辑
    }

    //读取逻辑

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

  • 相关阅读:
    跨平台这件事儿
    BTrace : Java 线上问题排查神器
    Spring 实现自定义 bean 的扩展
    运用计划缓冲的建议
    查询计划Hash和查询Hash
    执行计划的重用
    执行计划组件、组件、老化
    执行计划的生成
    SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆 <第一篇>
    SQL Server执行计划的理解
  • 原文地址:https://www.cnblogs.com/liumianweifeng/p/3298243.html
Copyright © 2011-2022 走看看