VBAでフォームにPDF表示 への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
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
WebBrowser 経由で表示させるにしても、埋め込みになるかダウンロードになるかは
環境依存なので難しく。かといって、 Chromium 系のブラウザーで UserForm に
貼れるものは見当たらないですね。
WinRT の API については、そもそも VBA 向けに設計されたものでないですし、
同 API には非同期実装な物が多いのがネックです。VBA の場合、別スレッドを用意することは
非常に難しいので、仮に呼び出せたとしても、直接扱うのは難しいと思います。
.pdf から .png に変換する DLL あるいは EXE を C# や VB.NET で作成し、
それを呼び出すとかであれば可能でしょうけれども…。
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/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
よろしくお願いします。
こんばんは、魔界の仮面弁士様、いつもありがとうございます。
>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#で、やってみようと思います。
また、わからない所が出ましたら、宜しくお願いいたします。