天天看點

【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 = 0; 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 = 2000;
                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鍵,然後滾動滑輪;用觸控的話就不用我介紹了。

好,運作一下,看看結果。

【Win10 開發】讀取PDF文檔

就這樣吧,要開飯了。

源碼下載下傳:https://files.cnblogs.com/files/tcjiaan/ReadPDFApp.zip

繼續閱讀