投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/7/30 13:15:26
WinRT に PDF 表示機能があります。
https://docs.microsoft.com/ja-jp/uwp/api/windows.data.pdf?view=winrt-18362

NuGet で「Microsoft.Windows.SDK.Contracts」を参照した上で、
「Imports System.IO」
「Imports Windows.Data.Pdf」
を記述しておきます。

(1) PdfDocument を LoadFromStreamAsync または LoadFromFileAsync メソッドで生成
(2) PdfDocument の GetPage メソッドで PdfPage を取得(Integer ではなく UInteger を指定すること)
(3) 保存先の Stream を用意して(FileStream でも MemoryStream でも良い)から、
 AsRandomAccessStream 拡張メソッドで、IRandomAccessStream を準備する
(4) PdfPage の RenderToStreamAsync で、(3) の保存先に画像として保存される
 画像形式として tiff を指定する場合には、RenderToStreamAsync メソッドの引数で
 PdfPageRenderOptions の BitmapEncoderId に TIFF の Encoder Id を指定します。
Dim opt As New PdfPageRenderOptions() With {.BitmapEncoderId = Guid.Parse("0131be10-2001-4c5f-a9b0-cc88fab64ce8")}

TIFF 以外の WIC ID については下記をご覧ください。
https://docs.microsoft.com/en-us/windows/win32/wic/-wic-guids-clsids

この方法だと、1 ページごとに別々の画像に保存していくことになります。
各ページの画像を 1 枚のマルチページ TIFF に収める場合は、下記が参考になるでしょう。
https://dobon.net/vb/dotnet/graphics/createmultitiff.html


実装例を載せておきます。
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim tif As String = "D:\example.tiff"
    Dim pdf As String = "D:\example.pdf"

    Using pdfFile As New FileStream(pdf, FileMode.Open, FileAccess.Read),
          pdfStream = pdfFile.AsRandomAccessStream()
        Dim pdfDoc = Await PdfDocument.LoadFromStreamAsync(pdfStream)
        Dim tiffICI As ImageCodecInfo = ImageCodecInfo.GetImageEncoders().First(Function(enc) enc.MimeType = "image/tiff")
        Dim opt As New PdfPageRenderOptions() With {.BitmapEncoderId = Guid.Parse(WICTiffEncoder)}
        Using page = pdfDoc.GetPage(0UI),
            tifFile = File.OpenWrite(tif),
            tifStream = tifFile.AsRandomAccessStream()
            Await page.RenderToStreamAsync(tifStream, opt)
            Await tifStream.FlushAsync()
        End Using
        Using tiffImage As New Bitmap(New MemoryStream(File.ReadAllBytes(tif)))
            '最初のページは MultiFrame で Save する 
            Dim epMultiFrame As New EncoderParameters() With {.Param = {New EncoderParameter(Encoder.SaveFlag, CLng(EncoderValue.MultiFrame))}}
            tiffImage.Save(tif, tiffICI, epMultiFrame)

            For p = 1UI To pdfDoc.PageCount - 1UI
                Using page = pdfDoc.GetPage(p),
                      pageMemory = New MemoryStream(),
                      tifStream = pageMemory.AsRandomAccessStream()
                    Await page.RenderToStreamAsync(tifStream, opt)
                    Await tifStream.FlushAsync()
                    Using imgStream = tifStream.AsStreamForRead(),
                          pageImage = Image.FromStream(imgStream)

                        '2ページ目以降は FrameDimensionPage を SaveAdd する 
                        Dim epFrameDimensionPage As New EncoderParameters() With {.Param = {New EncoderParameter(Encoder.SaveFlag, CLng(EncoderValue.FrameDimensionPage))}}
                        tiffImage.SaveAdd(pageImage, epFrameDimensionPage)
                    End Using
                End Using
            Next

            ' 全ページを追加したら、Flush を SaveAdd する 
            Dim epFlush As New EncoderParameters() With {.Param = {New EncoderParameter(Encoder.SaveFlag, CLng(EncoderValue.Flush))}}
            tiffImage.SaveAdd(epFlush)
        End Using
    End Using
    Process.Start(tif)
End Sub