VBAでフォームにPDF表示

タグの編集
投稿者 snowmansnow  (社会人) 投稿日時 2023/1/8 07:54:36

 こんにちは、
  2021/08/03のKAZU様と魔界の仮面弁士様とのやりとりを拝見して、
  VB.NETでフォームにPDF表示できるようになった(下記)のですが、
  VBAでもフォームにPDF表示は可能でしょうか?

    VB.NETで、フォームアプリケーションで、ボタン1個、picturebox1個追加しています。
  
Option Strict On
Imports System.IO
Imports Windows.Data.Pdf


Public Class Form1
    Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        '[NuGet パッケージ マネージャー] ウィンドウで、 
        '[参照] タブを選択して、Microsoft.Windows.SDK.Contracts を検索します。 

        'Microsoft.Windows.SDK.Contracts パッケージが見つかったら、 
        '[NuGet パッケージ マネージャー] ウィンドウの右側のペインで、 
        'ターゲットにする Windows 10 のバージョンに基づいて、 
        'インストールするパッケージのバージョンを選択します。 

        'https://qiita.com/kenichiuda/items/6617c25da6580eef85d1 
        'https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/698scrollpic/scrollpic.html 
        'https://learn.microsoft.com/ja-jp/windows/win32/wic/-wic-guids-clsids 
        Const WICPngEncoder As String = "27949969-876a-41d7-9447-568f6a35a4dc"

        Dim pdf As String = "C:\ほげほげ\サンプル.pdf"

        Using pdfFile As New FileStream(pdf, FileMode.Open, FileAccess.Read),
            pdfStream = pdfFile.AsRandomAccessStream()
            Dim pdfDoc = Await PdfDocument.LoadFromStreamAsync(pdfStream)
            Dim opt As New PdfPageRenderOptions() With {.BitmapEncoderId = Guid.Parse(WICPngEncoder)}

            '  For p = 0UI To pdfDoc.PageCount - 1UI 
            Using page = pdfDoc.GetPage(0),
                      pageMemory = New MemoryStream(),
                      pngStream = pageMemory.AsRandomAccessStream()
                Await page.RenderToStreamAsync(pngStream, opt)
                Await pngStream.FlushAsync()
                Using imgStream = pngStream.AsStreamForRead(),
                          pageImage = Image.FromStream(imgStream)
                    PictureBox1.Image = Nothing
                    PictureBox1.Image = System.Drawing.Image.FromStream(imgStream)
                End Using
            End Using
            '    Next 

        End Using
    End Sub
End Class


よろしくお願いします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/1/9 16:18:43
VBA 界隈に関しては現状、あまり有効な手が無いんですよね。
PDF 表示用の有償 ocx ならあるようなのですが。

UserForm に埋め込むのではなく、既定のアプリで開くだけなら簡単なのですけれど…。
https://www.youtube.com/watch?v=qlNxcgFU6Io


Adobe Reader のコンポーネントを貼る方法も、環境によっては使えないケースが多く、
信頼性に欠ける状況ですし。
https://tsware.jp/tips/tips_618.htm

With Me!AcroPDF0.Object
    .LoadFile pdfFilePath
    .setLayoutMode "OneColumn"
    .setPageMode "none"
    .setView "FitH"
End With



WebBrowser 経由で表示させるにしても、埋め込みになるかダウンロードになるかは
環境依存なので難しく。かといって、 Chromium 系のブラウザーで UserForm に
貼れるものは見当たらないですね。

WinRT の API については、そもそも VBA 向けに設計されたものでないですし、
同 API には非同期実装な物が多いのがネックです。VBA の場合、別スレッドを用意することは
非常に難しいので、仮に呼び出せたとしても、直接扱うのは難しいと思います。

.pdf から .png に変換する DLL あるいは EXE を C# や VB.NET で作成し、
それを呼び出すとかであれば可能でしょうけれども…。
投稿者 snowmansnow  (社会人) 投稿日時 2023/1/9 20:02:16

 こんばんは、魔界の仮面弁士様、いつもありがとうございます。


>UserForm に埋め込むのではなく、既定のアプリで開くだけなら簡単なのですけれど…。
>https://www.youtube.com/watch?v=qlNxcgFU6Io
①リーダーで表示なら、とても便利だと思いました。

>Adobe Reader のコンポーネントを貼る方法も、環境によっては使えないケースが多く、
>信頼性に欠ける状況ですし。
>https://tsware.jp/tips/tips_618.htm
②これは、私の環境では、コンポーネントを追加できませんでした。

>WinRT の API については、そもそも VBA 向けに設計されたものでないですし、
>同 API には非同期実装な物が多いのがネックです。VBA の場合、別スレッドを用意することは
>非常に難しいので、仮に呼び出せたとしても、直接扱うのは難しいと思います。
 魔界の仮面弁士様が難しいものは、とても難しいと思います。

 紙をスキャンしたPDFにアノテーションやフィールドを追加するときに、
 マウスで四角とかをドラッグして描画して、目安にしたり、
 それが全ページで位置が正しいかどうかを確認できるようにしたかったです。
 (スキャンだと、紙によって、位置がズレるので)

 最近のリーダーは、アノテーションを追加できたりするので、①は、とても便利でした。

 残念ですが、VBAはあきらめて、VB.NETかC#で、やってみようと思います。
 
 また、わからない所が出ましたら、宜しくお願いいたします。